midas-guilded 0.2.9 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +10 -0
- data/Manifest.txt +2 -0
- data/README.rdoc +15 -1
- data/guilded.gemspec +4 -4
- data/lib/guilded.rb +1 -1
- data/lib/guilded/guilder.rb +16 -5
- data/lib/guilded/rails/view_helpers.rb +26 -11
- data/rails_generators/guilded_assets/guilded_assets_generator.rb +3 -0
- data/rails_generators/guilded_assets/templates/mootools-1.2.3.js +4036 -0
- data/rails_generators/guilded_assets/templates/mootools-1.2.3.min.js +356 -0
- data/rails_generators/guilded_config/templates/load_guilded_settings.rb +1 -0
- metadata +5 -3
data/History.txt
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
= 0.3.0 2009-07-12
|
2
|
+
|
3
|
+
* Added support for MooTools library.
|
4
|
+
* Added :mootools option to the Guilder.add() method. If true is passed into this option when adding a component, Guilded
|
5
|
+
will automatically add the mootools library to the libs collection so that the lib will be included in the assets the
|
6
|
+
page loads.
|
7
|
+
* Updated the g_javascript_include_tag to resolve the :jquery and :mootools symbols to their respective libraries based
|
8
|
+
on the configuration of Guilded and the current running environment.
|
9
|
+
|
10
|
+
|
1
11
|
= 0.2.9 2009-06-18
|
2
12
|
|
3
13
|
* Added rescue code if the browser name or version fails.
|
data/Manifest.txt
CHANGED
@@ -24,6 +24,8 @@ rails_generators/guilded_assets/templates/jquery-1.3.2.js
|
|
24
24
|
rails_generators/guilded_assets/templates/jquery-1.3.2.min.js
|
25
25
|
rails_generators/guilded_assets/templates/jquery-url.js
|
26
26
|
rails_generators/guilded_assets/templates/jquery-url.min.js
|
27
|
+
rails_generators/guilded_assets/templates/mootools-1.2.3.js
|
28
|
+
rails_generators/guilded_assets/templates/mootools-1.2.3.min.js
|
27
29
|
rails_generators/guilded_assets/templates/reset-min.css
|
28
30
|
rails_generators/guilded_config/guilded_config_generator.rb
|
29
31
|
rails_generators/guilded_config/templates/load_guilded_settings.rb
|
data/README.rdoc
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
http://github.com/midas/guilded/tree/master
|
4
4
|
|
5
|
+
|
5
6
|
== DESCRIPTION
|
6
7
|
|
7
8
|
Guilded is a framework for building web based components centered around current web standards and best practices. The current
|
@@ -28,11 +29,16 @@ in a Gem and have a dependency on the Guilded gem.
|
|
28
29
|
|
29
30
|
The Guilded gem contains the framework to build Guilded components.
|
30
31
|
|
32
|
+
Update: Due to the quality components, etc. being generated by the MooTools community and the general quality of the library, we
|
33
|
+
have decided to include support for it in Guilded as of release 0.3.0.
|
34
|
+
|
31
35
|
|
32
36
|
== FEATURES
|
33
37
|
|
34
38
|
=== Centralized control of CSS and JavaScript assets needed to render a web page.
|
35
39
|
* Automatic addition of jQuery 1.3.2 library.
|
40
|
+
* Automatic addition of MooTools 1.2.3 library if a utilized component defines it as a dependency using the :mootools => true option
|
41
|
+
with the Guilder.add() method when defining the component.
|
36
42
|
* Automatic addition of Yahoo's reset-min.css.
|
37
43
|
* Redefinition of jQuery's $ method to $j and running jQuery in no conflict mode to allow other libraries to retain control
|
38
44
|
of the $ method.
|
@@ -53,6 +59,9 @@ The Guilded gem contains the framework to build Guilded components.
|
|
53
59
|
is initialized, the data structure will be instantiated for you with the name specified within the g object.
|
54
60
|
* Execute custom JavaScript code after all Guilded components are initialized (ensuring everything you wish to use is instantiated)
|
55
61
|
using the 'guildedInitialized' custom jQuery event defined on the body DOM element.
|
62
|
+
* g_javascript_include_tag view helper that will explicitly add JavaScript libraries to the libs collection to be included in the
|
63
|
+
assets. This helper will also resolve any libs to their full or compressed versions dependent on the current executing environment.
|
64
|
+
Additionally, the symbols :jquery and :mootools will be expanded to the lib version defined in the Guilded configuration.
|
56
65
|
|
57
66
|
=== Caching of CSS and JavaScript assets needed to render a web page.
|
58
67
|
* The CSS assets are cached to form one file. In addition, the JavaScript assets are cached to form one file. These files are
|
@@ -95,6 +104,11 @@ The Guilded gem contains the framework to build Guilded components.
|
|
95
104
|
* jQuery 1.3.2 (included in Guilded)
|
96
105
|
|
97
106
|
|
107
|
+
== OPTIONALS
|
108
|
+
|
109
|
+
* MooTools 1.2.3 (included in Guilded)
|
110
|
+
|
111
|
+
|
98
112
|
== INSTALL
|
99
113
|
|
100
114
|
gem sources -a http://gems.github.com
|
@@ -105,7 +119,7 @@ The Guilded gem contains the framework to build Guilded components.
|
|
105
119
|
|
106
120
|
Add to environment file:
|
107
121
|
|
108
|
-
config.gem "guilded", :version => '0.
|
122
|
+
config.gem "guilded", :version => '0.2.9'
|
109
123
|
|
110
124
|
Run:
|
111
125
|
|
data/guilded.gemspec
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{guilded}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.3.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["C. Jason Harrelson (midas)"]
|
9
|
-
s.date = %q{2009-
|
10
|
-
s.description = %q{Guilded is a framework for building web based components centered around current web standards and best practices. The current framework is written in ruby, but could be ported to other languages. Guilded intends to provide a toolset for creating and consuming reusable web components. Currently, this problem domain is filled with JavaScript frameworks. These frameworks are wonderful and work very well. However, they do not degrade gracefully and are not accessible. Guilded seeks to provide the same level of "componentization" and ease of use without sacrificing degradability and accessibility. Guilded will achieve these goals by applying each technology at our disposal to do what it was intended. XHTML will be employed for content. CSS used for layout and styling. Behavior will be added to a component with JavaScript through progressive enhancement. The user will have the best experience with a Guilded component when CSS and JavaScript are enabled in their browser, but will still be able to use the component when CSS and JavaScript are disabled. Guilded will use jQuery as it's base JavaScript framework. jQuery was chosen because it lends itself to progressive enhancement due to the way it was authored. In addition, the tight integration of jQuery's selectors with CSS selectors is also highly desirable. When authoring a Guilded component, it is encouraged to write the behavior code as a jQuery plugin. This will allow the jQuery plugin to be used outside of the Guilded project, if desired. Guilded also seeks to provide a standardized CSS framework for creating layouts that are reusable and predictable. Guilded will utilize the currently existing RubyGems system to package its components. A new Guilded component will be packaged in a Gem and have a dependency on the Guilded gem. The Guilded gem contains the framework to build Guilded components.}
|
9
|
+
s.date = %q{2009-07-13}
|
10
|
+
s.description = %q{Guilded is a framework for building web based components centered around current web standards and best practices. The current framework is written in ruby, but could be ported to other languages. Guilded intends to provide a toolset for creating and consuming reusable web components. Currently, this problem domain is filled with JavaScript frameworks. These frameworks are wonderful and work very well. However, they do not degrade gracefully and are not accessible. Guilded seeks to provide the same level of "componentization" and ease of use without sacrificing degradability and accessibility. Guilded will achieve these goals by applying each technology at our disposal to do what it was intended. XHTML will be employed for content. CSS used for layout and styling. Behavior will be added to a component with JavaScript through progressive enhancement. The user will have the best experience with a Guilded component when CSS and JavaScript are enabled in their browser, but will still be able to use the component when CSS and JavaScript are disabled. Guilded will use jQuery as it's base JavaScript framework. jQuery was chosen because it lends itself to progressive enhancement due to the way it was authored. In addition, the tight integration of jQuery's selectors with CSS selectors is also highly desirable. When authoring a Guilded component, it is encouraged to write the behavior code as a jQuery plugin. This will allow the jQuery plugin to be used outside of the Guilded project, if desired. Guilded also seeks to provide a standardized CSS framework for creating layouts that are reusable and predictable. Guilded will utilize the currently existing RubyGems system to package its components. A new Guilded component will be packaged in a Gem and have a dependency on the Guilded gem. The Guilded gem contains the framework to build Guilded components. Update: Due to the quality components, etc. being generated by the MooTools community and the general quality of the library, we have decided to include support for it in Guilded as of release 0.3.0.}
|
11
11
|
s.email = ["jason@lookforwardenterprises.com"]
|
12
12
|
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "PostInstall.txt", "README.rdoc"]
|
13
|
-
s.files = ["History.txt", "Manifest.txt", "PostInstall.txt", "README.rdoc", "Rakefile", "guilded.gemspec", "lib/guilded.rb", "lib/guilded/browser_detector.rb", "lib/guilded/component_def.rb", "lib/guilded/exceptions.rb", "lib/guilded/guilder.rb", "lib/guilded/rails.rb", "lib/guilded/rails/active_record/human_attribute_hint.rb", "lib/guilded/rails/active_record/human_attribute_override.rb", "lib/guilded/rails/helpers.rb", "lib/guilded/rails/inactive_record/human_attribute_hint.rb", "lib/guilded/rails/view_helpers.rb", "rails_generators/guilded_assets/guilded_assets_generator.rb", "rails_generators/guilded_assets/templates/guilded.js", "rails_generators/guilded_assets/templates/guilded.min.js", "rails_generators/guilded_assets/templates/jquery-1.2.6.js", "rails_generators/guilded_assets/templates/jquery-1.2.6.min.js", "rails_generators/guilded_assets/templates/jquery-1.3.2.js", "rails_generators/guilded_assets/templates/jquery-1.3.2.min.js", "rails_generators/guilded_assets/templates/jquery-url.js", "rails_generators/guilded_assets/templates/jquery-url.min.js", "rails_generators/guilded_assets/templates/reset-min.css", "rails_generators/guilded_config/guilded_config_generator.rb", "rails_generators/guilded_config/templates/load_guilded_settings.rb", "script/console", "script/destroy", "script/generate", "spec/guilded/component_def_spec.rb", "spec/guilded/guilder_spec.rb", "spec/guilded/rails/helpers_spec.rb", "spec/guilded_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/rails.rake", "tasks/rspec.rake"]
|
13
|
+
s.files = ["History.txt", "Manifest.txt", "PostInstall.txt", "README.rdoc", "Rakefile", "guilded.gemspec", "lib/guilded.rb", "lib/guilded/browser_detector.rb", "lib/guilded/component_def.rb", "lib/guilded/exceptions.rb", "lib/guilded/guilder.rb", "lib/guilded/rails.rb", "lib/guilded/rails/active_record/human_attribute_hint.rb", "lib/guilded/rails/active_record/human_attribute_override.rb", "lib/guilded/rails/helpers.rb", "lib/guilded/rails/inactive_record/human_attribute_hint.rb", "lib/guilded/rails/view_helpers.rb", "rails_generators/guilded_assets/guilded_assets_generator.rb", "rails_generators/guilded_assets/templates/guilded.js", "rails_generators/guilded_assets/templates/guilded.min.js", "rails_generators/guilded_assets/templates/jquery-1.2.6.js", "rails_generators/guilded_assets/templates/jquery-1.2.6.min.js", "rails_generators/guilded_assets/templates/jquery-1.3.2.js", "rails_generators/guilded_assets/templates/jquery-1.3.2.min.js", "rails_generators/guilded_assets/templates/jquery-url.js", "rails_generators/guilded_assets/templates/jquery-url.min.js", "rails_generators/guilded_assets/templates/mootools-1.2.3.js", "rails_generators/guilded_assets/templates/mootools-1.2.3.min.js", "rails_generators/guilded_assets/templates/reset-min.css", "rails_generators/guilded_config/guilded_config_generator.rb", "rails_generators/guilded_config/templates/load_guilded_settings.rb", "script/console", "script/destroy", "script/generate", "spec/guilded/component_def_spec.rb", "spec/guilded/guilder_spec.rb", "spec/guilded/rails/helpers_spec.rb", "spec/guilded_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/rails.rake", "tasks/rspec.rake"]
|
14
14
|
s.has_rdoc = true
|
15
15
|
s.homepage = %q{http://github.com/midas/guilded/tree/master}
|
16
16
|
s.post_install_message = %q{PostInstall.txt}
|
data/lib/guilded.rb
CHANGED
@@ -73,7 +73,7 @@ require 'guilded/rails/inactive_record/human_attribute_hint'
|
|
73
73
|
# <%= g_load_alerter :skin => 'blueish', :id => 'load_alerter' %>
|
74
74
|
#
|
75
75
|
module Guilded
|
76
|
-
VERSION = '0.
|
76
|
+
VERSION = '0.3.0'
|
77
77
|
end
|
78
78
|
|
79
79
|
ActionView::Base.send( :include, Guilded::Rails::ViewHelpers ) if defined?( ActionView )
|
data/lib/guilded/guilder.rb
CHANGED
@@ -24,7 +24,7 @@ module Guilded
|
|
24
24
|
|
25
25
|
GUILDED_NS = "guilded."
|
26
26
|
|
27
|
-
attr_reader :initialized_at
|
27
|
+
attr_reader :initialized_at, :jquery_js, :mootools_js
|
28
28
|
|
29
29
|
def initialize #:nodoc:
|
30
30
|
if defined?( GUILDED_CONFIG )
|
@@ -48,6 +48,7 @@ module Guilded
|
|
48
48
|
def add( element, options={}, libs=[], styles=[] )
|
49
49
|
raise Guilded::Exceptions::IdMissing.new unless options.has_key?( :id )
|
50
50
|
raise Guilded::Exceptions::DuplicateElementId.new( options[:id] ) if @g_elements.has_key?( options[:id] )
|
51
|
+
@need_mootools = true if options[:mootools]
|
51
52
|
@g_elements[ options[:id].to_sym ] = Guilded::ComponentDef.new( element, options, libs, styles )
|
52
53
|
end
|
53
54
|
|
@@ -61,6 +62,13 @@ module Guilded
|
|
61
62
|
def add_data( name, data )
|
62
63
|
@g_data_elements.merge!( name.to_sym => data )
|
63
64
|
end
|
65
|
+
|
66
|
+
# Adds JavaScript sources to the libs collection by resolving them to the normal or min version
|
67
|
+
# based on the current running environment, development, production, etc.
|
68
|
+
#
|
69
|
+
def add_js_sources( *sources )
|
70
|
+
resolve_js_libs( *sources )
|
71
|
+
end
|
64
72
|
|
65
73
|
def count #:nodoc:
|
66
74
|
@g_elements.size
|
@@ -191,7 +199,9 @@ module Guilded
|
|
191
199
|
@js_path = GUILDED_CONFIG[:js_path]
|
192
200
|
@js_folder = GUILDED_CONFIG[:js_folder]
|
193
201
|
@jquery_js = GUILDED_CONFIG[:jquery_js]
|
202
|
+
@mootools_js = GUILDED_CONFIG[:mootools_js]
|
194
203
|
@jquery_folder = GUILDED_CONFIG[:jquery_folder] || 'jquery/'
|
204
|
+
@mootools_folder = GUILDED_CONFIG[:mootools_folder] || 'mootools/'
|
195
205
|
@guilded_js = 'guilded.min.js'
|
196
206
|
@url_js = 'jquery-url.min.js'
|
197
207
|
@css_path = GUILDED_CONFIG[:css_path]
|
@@ -207,6 +217,8 @@ module Guilded
|
|
207
217
|
@url_js.freeze
|
208
218
|
@jquery_js.freeze
|
209
219
|
@jquery_folder.freeze
|
220
|
+
@mootols_js.freeze
|
221
|
+
@mootools_folder.freeze
|
210
222
|
@guilded_js.freeze
|
211
223
|
@css_folder.freeze
|
212
224
|
@reset_css.freeze
|
@@ -248,6 +260,7 @@ module Guilded
|
|
248
260
|
# a jQuery plugin, etc.
|
249
261
|
#
|
250
262
|
def combine_js_sources( component, libs=[] ) #:nodoc:
|
263
|
+
libs << @mootools_js if @need_mootools
|
251
264
|
resolve_js_libs( *libs )
|
252
265
|
|
253
266
|
comp_src = add_guilded_js_path( component )
|
@@ -258,7 +271,7 @@ module Guilded
|
|
258
271
|
#
|
259
272
|
# If running development mode, it will try to remove any .pack, .min, or.compressed
|
260
273
|
# parts fo the name to try and get the debug version of the library. If it cannot
|
261
|
-
# find the debug version of the file, it will just remain
|
274
|
+
# find the debug version of the file, it will just remain what was initially provded.
|
262
275
|
#
|
263
276
|
def resolve_js_libs( *libs ) #:nodoc:
|
264
277
|
if development?
|
@@ -273,9 +286,7 @@ module Guilded
|
|
273
286
|
end
|
274
287
|
end
|
275
288
|
else
|
276
|
-
libs.each
|
277
|
-
@combined_js_srcs.push( lib ) unless @combined_js_srcs.include?( lib )
|
278
|
-
end
|
289
|
+
libs.each { |lib| @combined_js_srcs.push( lib ) unless @combined_js_srcs.include?( lib ) }
|
279
290
|
end
|
280
291
|
end
|
281
292
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Guilded
|
2
2
|
module Rails
|
3
3
|
module ViewHelpers
|
4
|
-
|
4
|
+
|
5
5
|
# Generates the JavaScript includes for each Guilded element that is used. Also
|
6
6
|
# generates the initGuildedElements function and includes a call to each GUIlded
|
7
7
|
# elements Init method.
|
@@ -32,9 +32,12 @@ module Guilded
|
|
32
32
|
|
33
33
|
# Creates a javascript include tag for a Guilded specific file. The only difference
|
34
34
|
# being that it adds the file to a sources array to be concatenated and included at the
|
35
|
-
# end of the page.
|
35
|
+
# end of the page with the dependencies specified for the Guilded components used.
|
36
36
|
#
|
37
|
-
#
|
37
|
+
# To explicitly include the jQuery or MooTools libraries you can use :jquery and/or :mootools
|
38
|
+
# respectively. If a component that uses either jQuery or MooTools is used on a page, there is
|
39
|
+
# no need to explicitly include the library, as it will be resolved as a dependency and only
|
40
|
+
# included once.
|
38
41
|
#
|
39
42
|
def g_javascript_include_tag( *sources )
|
40
43
|
g = Guilded::Guilder.instance
|
@@ -43,10 +46,22 @@ module Guilded
|
|
43
46
|
defaults = ActionView::Helpers::AssetTagHelper::JAVASCRIPT_DEFAULT_SOURCES
|
44
47
|
sources.delete( :defaults )
|
45
48
|
end
|
49
|
+
if sources.include?( :jquery )
|
50
|
+
sources.insert( 0, g.jquery_js ) unless sources.include?( g.jquery_js )
|
51
|
+
sources.delete( :jquery )
|
52
|
+
end
|
53
|
+
if sources.include?( :mootools )
|
54
|
+
unless sources.include?( g.mootools_js )
|
55
|
+
insert_at = 0
|
56
|
+
insert_at = 1 if( sources.include?( g.jquery_js ) )
|
57
|
+
sources.insert( insert_at, g.mootools_js )
|
58
|
+
end
|
59
|
+
sources.delete( :mootools )
|
60
|
+
end
|
46
61
|
if defaults
|
47
|
-
g.
|
62
|
+
g.add_js_sources( *(sources << defaults) )
|
48
63
|
else
|
49
|
-
g.
|
64
|
+
g.add_js_sources( *sources )
|
50
65
|
end
|
51
66
|
''
|
52
67
|
end
|
@@ -80,9 +95,9 @@ module Guilded
|
|
80
95
|
stylesheet_link_tag( "/stylesheets/#{GUILDED_JS_FOLDER}#{GUILDED_NS}#{source.to_s}/#{skin}.css" )
|
81
96
|
else
|
82
97
|
""
|
83
|
-
end
|
98
|
+
end
|
84
99
|
end
|
85
|
-
|
100
|
+
|
86
101
|
# Returns the name of the browser that is making this request. For example 'ie'. When using
|
87
102
|
# the browser detector in the contoller you may put a :g_browser_detector variabe in the session if
|
88
103
|
# you wish to keep the BrowserDetector from being instantiated more than once per request.
|
@@ -92,7 +107,7 @@ module Guilded
|
|
92
107
|
@g_browser_detector ||= Guilded::BrowserDetector.new( request )
|
93
108
|
@g_browser_detector.browser_name
|
94
109
|
end
|
95
|
-
|
110
|
+
|
96
111
|
# Returns the version of the browser that is making this request. For example '7'. When using
|
97
112
|
# the browser detector in the contoller you may put a :g_browser_detector variabe in the session if
|
98
113
|
# you wish to keep the BrowserDetector from being instantiated more than once per request.
|
@@ -102,7 +117,7 @@ module Guilded
|
|
102
117
|
@g_browser_detector ||= Guilded::BrowserDetector.new( request )
|
103
118
|
@g_browser_detector.browser_version
|
104
119
|
end
|
105
|
-
|
120
|
+
|
106
121
|
# Returns the browser name concatenated with the browser version. for example, 'ie7'. When using
|
107
122
|
# the browser detector in the contoller you may put a :g_browser_detector variabe in the session if
|
108
123
|
# you wish to keep the BrowserDetector from being instantiated more than once per request.
|
@@ -112,7 +127,7 @@ module Guilded
|
|
112
127
|
@g_browser_detector ||= Guilded::BrowserDetector.new( request )
|
113
128
|
@g_browser_detector.browser_full_name
|
114
129
|
end
|
115
|
-
|
130
|
+
|
116
131
|
# Returns true if the browser matches the options ent in, otherwise returns false. When using
|
117
132
|
# the browser detector in the contoller you may put a :g_browser_detector variabe in the session if
|
118
133
|
# you wish to keep the BrowserDetector from being instantiated more than once per request.
|
@@ -126,7 +141,7 @@ module Guilded
|
|
126
141
|
@g_browser_detector ||= Guilded::BrowserDetector.new( request )
|
127
142
|
@g_browser_detector.browser_is?( options )
|
128
143
|
end
|
129
|
-
|
144
|
+
|
130
145
|
end
|
131
146
|
end
|
132
147
|
end
|
@@ -14,6 +14,9 @@ class GuildedAssetsGenerator < Rails::Generator::Base
|
|
14
14
|
m.file "jquery-1.3.2.min.js", "public/javascripts/jquery/jquery-1.3.2.min.js"
|
15
15
|
m.file "jquery-url.js", "public/javascripts/jquery/jquery-url.js"
|
16
16
|
m.file "jquery-url.min.js", "public/javascripts/jquery/jquery-url.min.js"
|
17
|
+
m.directory "public/javascripts/mootools"
|
18
|
+
m.file "mootools-1.2.3.js", "public/javascripts/mootools/mootools-1.2.3.js"
|
19
|
+
m.file "mootools-1.2.3.min.js", "public/javascripts/mootools/mootools-1.2.3.min.js"
|
17
20
|
m.file "reset-min.css", "public/stylesheets/reset-min.css"
|
18
21
|
end
|
19
22
|
end
|
@@ -0,0 +1,4036 @@
|
|
1
|
+
/*
|
2
|
+
Script: Core.js
|
3
|
+
MooTools - My Object Oriented JavaScript Tools.
|
4
|
+
|
5
|
+
License:
|
6
|
+
MIT-style license.
|
7
|
+
|
8
|
+
Copyright:
|
9
|
+
Copyright (c) 2006-2008 [Valerio Proietti](http://mad4milk.net/).
|
10
|
+
|
11
|
+
Code & Documentation:
|
12
|
+
[The MooTools production team](http://mootools.net/developers/).
|
13
|
+
|
14
|
+
Inspiration:
|
15
|
+
- Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)
|
16
|
+
- Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)
|
17
|
+
*/
|
18
|
+
|
19
|
+
var MooTools = {
|
20
|
+
'version': '1.2.3',
|
21
|
+
'build': '4980aa0fb74d2f6eb80bcd9f5b8e1fd6fbb8f607'
|
22
|
+
};
|
23
|
+
|
24
|
+
var Native = function(options){
|
25
|
+
options = options || {};
|
26
|
+
var name = options.name;
|
27
|
+
var legacy = options.legacy;
|
28
|
+
var protect = options.protect;
|
29
|
+
var methods = options.implement;
|
30
|
+
var generics = options.generics;
|
31
|
+
var initialize = options.initialize;
|
32
|
+
var afterImplement = options.afterImplement || function(){};
|
33
|
+
var object = initialize || legacy;
|
34
|
+
generics = generics !== false;
|
35
|
+
|
36
|
+
object.constructor = Native;
|
37
|
+
object.$family = {name: 'native'};
|
38
|
+
if (legacy && initialize) object.prototype = legacy.prototype;
|
39
|
+
object.prototype.constructor = object;
|
40
|
+
|
41
|
+
if (name){
|
42
|
+
var family = name.toLowerCase();
|
43
|
+
object.prototype.$family = {name: family};
|
44
|
+
Native.typize(object, family);
|
45
|
+
}
|
46
|
+
|
47
|
+
var add = function(obj, name, method, force){
|
48
|
+
if (!protect || force || !obj.prototype[name]) obj.prototype[name] = method;
|
49
|
+
if (generics) Native.genericize(obj, name, protect);
|
50
|
+
afterImplement.call(obj, name, method);
|
51
|
+
return obj;
|
52
|
+
};
|
53
|
+
|
54
|
+
object.alias = function(a1, a2, a3){
|
55
|
+
if (typeof a1 == 'string'){
|
56
|
+
var pa1 = this.prototype[a1];
|
57
|
+
if ((a1 = pa1)) return add(this, a2, a1, a3);
|
58
|
+
}
|
59
|
+
for (var a in a1) this.alias(a, a1[a], a2);
|
60
|
+
return this;
|
61
|
+
};
|
62
|
+
|
63
|
+
object.implement = function(a1, a2, a3){
|
64
|
+
if (typeof a1 == 'string') return add(this, a1, a2, a3);
|
65
|
+
for (var p in a1) add(this, p, a1[p], a2);
|
66
|
+
return this;
|
67
|
+
};
|
68
|
+
|
69
|
+
if (methods) object.implement(methods);
|
70
|
+
|
71
|
+
return object;
|
72
|
+
};
|
73
|
+
|
74
|
+
Native.genericize = function(object, property, check){
|
75
|
+
if ((!check || !object[property]) && typeof object.prototype[property] == 'function') object[property] = function(){
|
76
|
+
var args = Array.prototype.slice.call(arguments);
|
77
|
+
return object.prototype[property].apply(args.shift(), args);
|
78
|
+
};
|
79
|
+
};
|
80
|
+
|
81
|
+
Native.implement = function(objects, properties){
|
82
|
+
for (var i = 0, l = objects.length; i < l; i++) objects[i].implement(properties);
|
83
|
+
};
|
84
|
+
|
85
|
+
Native.typize = function(object, family){
|
86
|
+
if (!object.type) object.type = function(item){
|
87
|
+
return ($type(item) === family);
|
88
|
+
};
|
89
|
+
};
|
90
|
+
|
91
|
+
(function(){
|
92
|
+
var natives = {'Array': Array, 'Date': Date, 'Function': Function, 'Number': Number, 'RegExp': RegExp, 'String': String};
|
93
|
+
for (var n in natives) new Native({name: n, initialize: natives[n], protect: true});
|
94
|
+
|
95
|
+
var types = {'boolean': Boolean, 'native': Native, 'object': Object};
|
96
|
+
for (var t in types) Native.typize(types[t], t);
|
97
|
+
|
98
|
+
var generics = {
|
99
|
+
'Array': ["concat", "indexOf", "join", "lastIndexOf", "pop", "push", "reverse", "shift", "slice", "sort", "splice", "toString", "unshift", "valueOf"],
|
100
|
+
'String': ["charAt", "charCodeAt", "concat", "indexOf", "lastIndexOf", "match", "replace", "search", "slice", "split", "substr", "substring", "toLowerCase", "toUpperCase", "valueOf"]
|
101
|
+
};
|
102
|
+
for (var g in generics){
|
103
|
+
for (var i = generics[g].length; i--;) Native.genericize(natives[g], generics[g][i], true);
|
104
|
+
}
|
105
|
+
})();
|
106
|
+
|
107
|
+
var Hash = new Native({
|
108
|
+
|
109
|
+
name: 'Hash',
|
110
|
+
|
111
|
+
initialize: function(object){
|
112
|
+
if ($type(object) == 'hash') object = $unlink(object.getClean());
|
113
|
+
for (var key in object) this[key] = object[key];
|
114
|
+
return this;
|
115
|
+
}
|
116
|
+
|
117
|
+
});
|
118
|
+
|
119
|
+
Hash.implement({
|
120
|
+
|
121
|
+
forEach: function(fn, bind){
|
122
|
+
for (var key in this){
|
123
|
+
if (this.hasOwnProperty(key)) fn.call(bind, this[key], key, this);
|
124
|
+
}
|
125
|
+
},
|
126
|
+
|
127
|
+
getClean: function(){
|
128
|
+
var clean = {};
|
129
|
+
for (var key in this){
|
130
|
+
if (this.hasOwnProperty(key)) clean[key] = this[key];
|
131
|
+
}
|
132
|
+
return clean;
|
133
|
+
},
|
134
|
+
|
135
|
+
getLength: function(){
|
136
|
+
var length = 0;
|
137
|
+
for (var key in this){
|
138
|
+
if (this.hasOwnProperty(key)) length++;
|
139
|
+
}
|
140
|
+
return length;
|
141
|
+
}
|
142
|
+
|
143
|
+
});
|
144
|
+
|
145
|
+
Hash.alias('forEach', 'each');
|
146
|
+
|
147
|
+
Array.implement({
|
148
|
+
|
149
|
+
forEach: function(fn, bind){
|
150
|
+
for (var i = 0, l = this.length; i < l; i++) fn.call(bind, this[i], i, this);
|
151
|
+
}
|
152
|
+
|
153
|
+
});
|
154
|
+
|
155
|
+
Array.alias('forEach', 'each');
|
156
|
+
|
157
|
+
function $A(iterable){
|
158
|
+
if (iterable.item){
|
159
|
+
var l = iterable.length, array = new Array(l);
|
160
|
+
while (l--) array[l] = iterable[l];
|
161
|
+
return array;
|
162
|
+
}
|
163
|
+
return Array.prototype.slice.call(iterable);
|
164
|
+
};
|
165
|
+
|
166
|
+
function $arguments(i){
|
167
|
+
return function(){
|
168
|
+
return arguments[i];
|
169
|
+
};
|
170
|
+
};
|
171
|
+
|
172
|
+
function $chk(obj){
|
173
|
+
return !!(obj || obj === 0);
|
174
|
+
};
|
175
|
+
|
176
|
+
function $clear(timer){
|
177
|
+
clearTimeout(timer);
|
178
|
+
clearInterval(timer);
|
179
|
+
return null;
|
180
|
+
};
|
181
|
+
|
182
|
+
function $defined(obj){
|
183
|
+
return (obj != undefined);
|
184
|
+
};
|
185
|
+
|
186
|
+
function $each(iterable, fn, bind){
|
187
|
+
var type = $type(iterable);
|
188
|
+
((type == 'arguments' || type == 'collection' || type == 'array') ? Array : Hash).each(iterable, fn, bind);
|
189
|
+
};
|
190
|
+
|
191
|
+
function $empty(){};
|
192
|
+
|
193
|
+
function $extend(original, extended){
|
194
|
+
for (var key in (extended || {})) original[key] = extended[key];
|
195
|
+
return original;
|
196
|
+
};
|
197
|
+
|
198
|
+
function $H(object){
|
199
|
+
return new Hash(object);
|
200
|
+
};
|
201
|
+
|
202
|
+
function $lambda(value){
|
203
|
+
return ($type(value) == 'function') ? value : function(){
|
204
|
+
return value;
|
205
|
+
};
|
206
|
+
};
|
207
|
+
|
208
|
+
function $merge(){
|
209
|
+
var args = Array.slice(arguments);
|
210
|
+
args.unshift({});
|
211
|
+
return $mixin.apply(null, args);
|
212
|
+
};
|
213
|
+
|
214
|
+
function $mixin(mix){
|
215
|
+
for (var i = 1, l = arguments.length; i < l; i++){
|
216
|
+
var object = arguments[i];
|
217
|
+
if ($type(object) != 'object') continue;
|
218
|
+
for (var key in object){
|
219
|
+
var op = object[key], mp = mix[key];
|
220
|
+
mix[key] = (mp && $type(op) == 'object' && $type(mp) == 'object') ? $mixin(mp, op) : $unlink(op);
|
221
|
+
}
|
222
|
+
}
|
223
|
+
return mix;
|
224
|
+
};
|
225
|
+
|
226
|
+
function $pick(){
|
227
|
+
for (var i = 0, l = arguments.length; i < l; i++){
|
228
|
+
if (arguments[i] != undefined) return arguments[i];
|
229
|
+
}
|
230
|
+
return null;
|
231
|
+
};
|
232
|
+
|
233
|
+
function $random(min, max){
|
234
|
+
return Math.floor(Math.random() * (max - min + 1) + min);
|
235
|
+
};
|
236
|
+
|
237
|
+
function $splat(obj){
|
238
|
+
var type = $type(obj);
|
239
|
+
return (type) ? ((type != 'array' && type != 'arguments') ? [obj] : obj) : [];
|
240
|
+
};
|
241
|
+
|
242
|
+
var $time = Date.now || function(){
|
243
|
+
return +new Date;
|
244
|
+
};
|
245
|
+
|
246
|
+
function $try(){
|
247
|
+
for (var i = 0, l = arguments.length; i < l; i++){
|
248
|
+
try {
|
249
|
+
return arguments[i]();
|
250
|
+
} catch(e){}
|
251
|
+
}
|
252
|
+
return null;
|
253
|
+
};
|
254
|
+
|
255
|
+
function $type(obj){
|
256
|
+
if (obj == undefined) return false;
|
257
|
+
if (obj.$family) return (obj.$family.name == 'number' && !isFinite(obj)) ? false : obj.$family.name;
|
258
|
+
if (obj.nodeName){
|
259
|
+
switch (obj.nodeType){
|
260
|
+
case 1: return 'element';
|
261
|
+
case 3: return (/\S/).test(obj.nodeValue) ? 'textnode' : 'whitespace';
|
262
|
+
}
|
263
|
+
} else if (typeof obj.length == 'number'){
|
264
|
+
if (obj.callee) return 'arguments';
|
265
|
+
else if (obj.item) return 'collection';
|
266
|
+
}
|
267
|
+
return typeof obj;
|
268
|
+
};
|
269
|
+
|
270
|
+
function $unlink(object){
|
271
|
+
var unlinked;
|
272
|
+
switch ($type(object)){
|
273
|
+
case 'object':
|
274
|
+
unlinked = {};
|
275
|
+
for (var p in object) unlinked[p] = $unlink(object[p]);
|
276
|
+
break;
|
277
|
+
case 'hash':
|
278
|
+
unlinked = new Hash(object);
|
279
|
+
break;
|
280
|
+
case 'array':
|
281
|
+
unlinked = [];
|
282
|
+
for (var i = 0, l = object.length; i < l; i++) unlinked[i] = $unlink(object[i]);
|
283
|
+
break;
|
284
|
+
default: return object;
|
285
|
+
}
|
286
|
+
return unlinked;
|
287
|
+
};
|
288
|
+
|
289
|
+
|
290
|
+
/*
|
291
|
+
Script: Browser.js
|
292
|
+
The Browser Core. Contains Browser initialization, Window and Document, and the Browser Hash.
|
293
|
+
|
294
|
+
License:
|
295
|
+
MIT-style license.
|
296
|
+
*/
|
297
|
+
|
298
|
+
var Browser = $merge({
|
299
|
+
|
300
|
+
Engine: {name: 'unknown', version: 0},
|
301
|
+
|
302
|
+
Platform: {name: (window.orientation != undefined) ? 'ipod' : (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()},
|
303
|
+
|
304
|
+
Features: {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)},
|
305
|
+
|
306
|
+
Plugins: {},
|
307
|
+
|
308
|
+
Engines: {
|
309
|
+
|
310
|
+
presto: function(){
|
311
|
+
return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925));
|
312
|
+
},
|
313
|
+
|
314
|
+
trident: function(){
|
315
|
+
return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? 5 : 4);
|
316
|
+
},
|
317
|
+
|
318
|
+
webkit: function(){
|
319
|
+
return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419);
|
320
|
+
},
|
321
|
+
|
322
|
+
gecko: function(){
|
323
|
+
return (document.getBoxObjectFor == undefined) ? false : ((document.getElementsByClassName) ? 19 : 18);
|
324
|
+
}
|
325
|
+
|
326
|
+
}
|
327
|
+
|
328
|
+
}, Browser || {});
|
329
|
+
|
330
|
+
Browser.Platform[Browser.Platform.name] = true;
|
331
|
+
|
332
|
+
Browser.detect = function(){
|
333
|
+
|
334
|
+
for (var engine in this.Engines){
|
335
|
+
var version = this.Engines[engine]();
|
336
|
+
if (version){
|
337
|
+
this.Engine = {name: engine, version: version};
|
338
|
+
this.Engine[engine] = this.Engine[engine + version] = true;
|
339
|
+
break;
|
340
|
+
}
|
341
|
+
}
|
342
|
+
|
343
|
+
return {name: engine, version: version};
|
344
|
+
|
345
|
+
};
|
346
|
+
|
347
|
+
Browser.detect();
|
348
|
+
|
349
|
+
Browser.Request = function(){
|
350
|
+
return $try(function(){
|
351
|
+
return new XMLHttpRequest();
|
352
|
+
}, function(){
|
353
|
+
return new ActiveXObject('MSXML2.XMLHTTP');
|
354
|
+
});
|
355
|
+
};
|
356
|
+
|
357
|
+
Browser.Features.xhr = !!(Browser.Request());
|
358
|
+
|
359
|
+
Browser.Plugins.Flash = (function(){
|
360
|
+
var version = ($try(function(){
|
361
|
+
return navigator.plugins['Shockwave Flash'].description;
|
362
|
+
}, function(){
|
363
|
+
return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
|
364
|
+
}) || '0 r0').match(/\d+/g);
|
365
|
+
return {version: parseInt(version[0] || 0 + '.' + version[1], 10) || 0, build: parseInt(version[2], 10) || 0};
|
366
|
+
})();
|
367
|
+
|
368
|
+
function $exec(text){
|
369
|
+
if (!text) return text;
|
370
|
+
if (window.execScript){
|
371
|
+
window.execScript(text);
|
372
|
+
} else {
|
373
|
+
var script = document.createElement('script');
|
374
|
+
script.setAttribute('type', 'text/javascript');
|
375
|
+
script[(Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerText' : 'text'] = text;
|
376
|
+
document.head.appendChild(script);
|
377
|
+
document.head.removeChild(script);
|
378
|
+
}
|
379
|
+
return text;
|
380
|
+
};
|
381
|
+
|
382
|
+
Native.UID = 1;
|
383
|
+
|
384
|
+
var $uid = (Browser.Engine.trident) ? function(item){
|
385
|
+
return (item.uid || (item.uid = [Native.UID++]))[0];
|
386
|
+
} : function(item){
|
387
|
+
return item.uid || (item.uid = Native.UID++);
|
388
|
+
};
|
389
|
+
|
390
|
+
var Window = new Native({
|
391
|
+
|
392
|
+
name: 'Window',
|
393
|
+
|
394
|
+
legacy: (Browser.Engine.trident) ? null: window.Window,
|
395
|
+
|
396
|
+
initialize: function(win){
|
397
|
+
$uid(win);
|
398
|
+
if (!win.Element){
|
399
|
+
win.Element = $empty;
|
400
|
+
if (Browser.Engine.webkit) win.document.createElement("iframe"); //fixes safari 2
|
401
|
+
win.Element.prototype = (Browser.Engine.webkit) ? window["[[DOMElement.prototype]]"] : {};
|
402
|
+
}
|
403
|
+
win.document.window = win;
|
404
|
+
return $extend(win, Window.Prototype);
|
405
|
+
},
|
406
|
+
|
407
|
+
afterImplement: function(property, value){
|
408
|
+
window[property] = Window.Prototype[property] = value;
|
409
|
+
}
|
410
|
+
|
411
|
+
});
|
412
|
+
|
413
|
+
Window.Prototype = {$family: {name: 'window'}};
|
414
|
+
|
415
|
+
new Window(window);
|
416
|
+
|
417
|
+
var Document = new Native({
|
418
|
+
|
419
|
+
name: 'Document',
|
420
|
+
|
421
|
+
legacy: (Browser.Engine.trident) ? null: window.Document,
|
422
|
+
|
423
|
+
initialize: function(doc){
|
424
|
+
$uid(doc);
|
425
|
+
doc.head = doc.getElementsByTagName('head')[0];
|
426
|
+
doc.html = doc.getElementsByTagName('html')[0];
|
427
|
+
if (Browser.Engine.trident && Browser.Engine.version <= 4) $try(function(){
|
428
|
+
doc.execCommand("BackgroundImageCache", false, true);
|
429
|
+
});
|
430
|
+
if (Browser.Engine.trident) doc.window.attachEvent('onunload', function() {
|
431
|
+
doc.window.detachEvent('onunload', arguments.callee);
|
432
|
+
doc.head = doc.html = doc.window = null;
|
433
|
+
});
|
434
|
+
return $extend(doc, Document.Prototype);
|
435
|
+
},
|
436
|
+
|
437
|
+
afterImplement: function(property, value){
|
438
|
+
document[property] = Document.Prototype[property] = value;
|
439
|
+
}
|
440
|
+
|
441
|
+
});
|
442
|
+
|
443
|
+
Document.Prototype = {$family: {name: 'document'}};
|
444
|
+
|
445
|
+
new Document(document);
|
446
|
+
|
447
|
+
|
448
|
+
/*
|
449
|
+
Script: Array.js
|
450
|
+
Contains Array Prototypes like each, contains, and erase.
|
451
|
+
|
452
|
+
License:
|
453
|
+
MIT-style license.
|
454
|
+
*/
|
455
|
+
|
456
|
+
Array.implement({
|
457
|
+
|
458
|
+
every: function(fn, bind){
|
459
|
+
for (var i = 0, l = this.length; i < l; i++){
|
460
|
+
if (!fn.call(bind, this[i], i, this)) return false;
|
461
|
+
}
|
462
|
+
return true;
|
463
|
+
},
|
464
|
+
|
465
|
+
filter: function(fn, bind){
|
466
|
+
var results = [];
|
467
|
+
for (var i = 0, l = this.length; i < l; i++){
|
468
|
+
if (fn.call(bind, this[i], i, this)) results.push(this[i]);
|
469
|
+
}
|
470
|
+
return results;
|
471
|
+
},
|
472
|
+
|
473
|
+
clean: function() {
|
474
|
+
return this.filter($defined);
|
475
|
+
},
|
476
|
+
|
477
|
+
indexOf: function(item, from){
|
478
|
+
var len = this.length;
|
479
|
+
for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){
|
480
|
+
if (this[i] === item) return i;
|
481
|
+
}
|
482
|
+
return -1;
|
483
|
+
},
|
484
|
+
|
485
|
+
map: function(fn, bind){
|
486
|
+
var results = [];
|
487
|
+
for (var i = 0, l = this.length; i < l; i++) results[i] = fn.call(bind, this[i], i, this);
|
488
|
+
return results;
|
489
|
+
},
|
490
|
+
|
491
|
+
some: function(fn, bind){
|
492
|
+
for (var i = 0, l = this.length; i < l; i++){
|
493
|
+
if (fn.call(bind, this[i], i, this)) return true;
|
494
|
+
}
|
495
|
+
return false;
|
496
|
+
},
|
497
|
+
|
498
|
+
associate: function(keys){
|
499
|
+
var obj = {}, length = Math.min(this.length, keys.length);
|
500
|
+
for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
|
501
|
+
return obj;
|
502
|
+
},
|
503
|
+
|
504
|
+
link: function(object){
|
505
|
+
var result = {};
|
506
|
+
for (var i = 0, l = this.length; i < l; i++){
|
507
|
+
for (var key in object){
|
508
|
+
if (object[key](this[i])){
|
509
|
+
result[key] = this[i];
|
510
|
+
delete object[key];
|
511
|
+
break;
|
512
|
+
}
|
513
|
+
}
|
514
|
+
}
|
515
|
+
return result;
|
516
|
+
},
|
517
|
+
|
518
|
+
contains: function(item, from){
|
519
|
+
return this.indexOf(item, from) != -1;
|
520
|
+
},
|
521
|
+
|
522
|
+
extend: function(array){
|
523
|
+
for (var i = 0, j = array.length; i < j; i++) this.push(array[i]);
|
524
|
+
return this;
|
525
|
+
},
|
526
|
+
|
527
|
+
getLast: function(){
|
528
|
+
return (this.length) ? this[this.length - 1] : null;
|
529
|
+
},
|
530
|
+
|
531
|
+
getRandom: function(){
|
532
|
+
return (this.length) ? this[$random(0, this.length - 1)] : null;
|
533
|
+
},
|
534
|
+
|
535
|
+
include: function(item){
|
536
|
+
if (!this.contains(item)) this.push(item);
|
537
|
+
return this;
|
538
|
+
},
|
539
|
+
|
540
|
+
combine: function(array){
|
541
|
+
for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
|
542
|
+
return this;
|
543
|
+
},
|
544
|
+
|
545
|
+
erase: function(item){
|
546
|
+
for (var i = this.length; i--; i){
|
547
|
+
if (this[i] === item) this.splice(i, 1);
|
548
|
+
}
|
549
|
+
return this;
|
550
|
+
},
|
551
|
+
|
552
|
+
empty: function(){
|
553
|
+
this.length = 0;
|
554
|
+
return this;
|
555
|
+
},
|
556
|
+
|
557
|
+
flatten: function(){
|
558
|
+
var array = [];
|
559
|
+
for (var i = 0, l = this.length; i < l; i++){
|
560
|
+
var type = $type(this[i]);
|
561
|
+
if (!type) continue;
|
562
|
+
array = array.concat((type == 'array' || type == 'collection' || type == 'arguments') ? Array.flatten(this[i]) : this[i]);
|
563
|
+
}
|
564
|
+
return array;
|
565
|
+
},
|
566
|
+
|
567
|
+
hexToRgb: function(array){
|
568
|
+
if (this.length != 3) return null;
|
569
|
+
var rgb = this.map(function(value){
|
570
|
+
if (value.length == 1) value += value;
|
571
|
+
return value.toInt(16);
|
572
|
+
});
|
573
|
+
return (array) ? rgb : 'rgb(' + rgb + ')';
|
574
|
+
},
|
575
|
+
|
576
|
+
rgbToHex: function(array){
|
577
|
+
if (this.length < 3) return null;
|
578
|
+
if (this.length == 4 && this[3] == 0 && !array) return 'transparent';
|
579
|
+
var hex = [];
|
580
|
+
for (var i = 0; i < 3; i++){
|
581
|
+
var bit = (this[i] - 0).toString(16);
|
582
|
+
hex.push((bit.length == 1) ? '0' + bit : bit);
|
583
|
+
}
|
584
|
+
return (array) ? hex : '#' + hex.join('');
|
585
|
+
}
|
586
|
+
|
587
|
+
});
|
588
|
+
|
589
|
+
|
590
|
+
/*
|
591
|
+
Script: Function.js
|
592
|
+
Contains Function Prototypes like create, bind, pass, and delay.
|
593
|
+
|
594
|
+
License:
|
595
|
+
MIT-style license.
|
596
|
+
*/
|
597
|
+
|
598
|
+
Function.implement({
|
599
|
+
|
600
|
+
extend: function(properties){
|
601
|
+
for (var property in properties) this[property] = properties[property];
|
602
|
+
return this;
|
603
|
+
},
|
604
|
+
|
605
|
+
create: function(options){
|
606
|
+
var self = this;
|
607
|
+
options = options || {};
|
608
|
+
return function(event){
|
609
|
+
var args = options.arguments;
|
610
|
+
args = (args != undefined) ? $splat(args) : Array.slice(arguments, (options.event) ? 1 : 0);
|
611
|
+
if (options.event) args = [event || window.event].extend(args);
|
612
|
+
var returns = function(){
|
613
|
+
return self.apply(options.bind || null, args);
|
614
|
+
};
|
615
|
+
if (options.delay) return setTimeout(returns, options.delay);
|
616
|
+
if (options.periodical) return setInterval(returns, options.periodical);
|
617
|
+
if (options.attempt) return $try(returns);
|
618
|
+
return returns();
|
619
|
+
};
|
620
|
+
},
|
621
|
+
|
622
|
+
run: function(args, bind){
|
623
|
+
return this.apply(bind, $splat(args));
|
624
|
+
},
|
625
|
+
|
626
|
+
pass: function(args, bind){
|
627
|
+
return this.create({bind: bind, arguments: args});
|
628
|
+
},
|
629
|
+
|
630
|
+
bind: function(bind, args){
|
631
|
+
return this.create({bind: bind, arguments: args});
|
632
|
+
},
|
633
|
+
|
634
|
+
bindWithEvent: function(bind, args){
|
635
|
+
return this.create({bind: bind, arguments: args, event: true});
|
636
|
+
},
|
637
|
+
|
638
|
+
attempt: function(args, bind){
|
639
|
+
return this.create({bind: bind, arguments: args, attempt: true})();
|
640
|
+
},
|
641
|
+
|
642
|
+
delay: function(delay, bind, args){
|
643
|
+
return this.create({bind: bind, arguments: args, delay: delay})();
|
644
|
+
},
|
645
|
+
|
646
|
+
periodical: function(periodical, bind, args){
|
647
|
+
return this.create({bind: bind, arguments: args, periodical: periodical})();
|
648
|
+
}
|
649
|
+
|
650
|
+
});
|
651
|
+
|
652
|
+
|
653
|
+
/*
|
654
|
+
Script: Number.js
|
655
|
+
Contains Number Prototypes like limit, round, times, and ceil.
|
656
|
+
|
657
|
+
License:
|
658
|
+
MIT-style license.
|
659
|
+
*/
|
660
|
+
|
661
|
+
Number.implement({
|
662
|
+
|
663
|
+
limit: function(min, max){
|
664
|
+
return Math.min(max, Math.max(min, this));
|
665
|
+
},
|
666
|
+
|
667
|
+
round: function(precision){
|
668
|
+
precision = Math.pow(10, precision || 0);
|
669
|
+
return Math.round(this * precision) / precision;
|
670
|
+
},
|
671
|
+
|
672
|
+
times: function(fn, bind){
|
673
|
+
for (var i = 0; i < this; i++) fn.call(bind, i, this);
|
674
|
+
},
|
675
|
+
|
676
|
+
toFloat: function(){
|
677
|
+
return parseFloat(this);
|
678
|
+
},
|
679
|
+
|
680
|
+
toInt: function(base){
|
681
|
+
return parseInt(this, base || 10);
|
682
|
+
}
|
683
|
+
|
684
|
+
});
|
685
|
+
|
686
|
+
Number.alias('times', 'each');
|
687
|
+
|
688
|
+
(function(math){
|
689
|
+
var methods = {};
|
690
|
+
math.each(function(name){
|
691
|
+
if (!Number[name]) methods[name] = function(){
|
692
|
+
return Math[name].apply(null, [this].concat($A(arguments)));
|
693
|
+
};
|
694
|
+
});
|
695
|
+
Number.implement(methods);
|
696
|
+
})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);
|
697
|
+
|
698
|
+
|
699
|
+
/*
|
700
|
+
Script: String.js
|
701
|
+
Contains String Prototypes like camelCase, capitalize, test, and toInt.
|
702
|
+
|
703
|
+
License:
|
704
|
+
MIT-style license.
|
705
|
+
*/
|
706
|
+
|
707
|
+
String.implement({
|
708
|
+
|
709
|
+
test: function(regex, params){
|
710
|
+
return ((typeof regex == 'string') ? new RegExp(regex, params) : regex).test(this);
|
711
|
+
},
|
712
|
+
|
713
|
+
contains: function(string, separator){
|
714
|
+
return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : this.indexOf(string) > -1;
|
715
|
+
},
|
716
|
+
|
717
|
+
trim: function(){
|
718
|
+
return this.replace(/^\s+|\s+$/g, '');
|
719
|
+
},
|
720
|
+
|
721
|
+
clean: function(){
|
722
|
+
return this.replace(/\s+/g, ' ').trim();
|
723
|
+
},
|
724
|
+
|
725
|
+
camelCase: function(){
|
726
|
+
return this.replace(/-\D/g, function(match){
|
727
|
+
return match.charAt(1).toUpperCase();
|
728
|
+
});
|
729
|
+
},
|
730
|
+
|
731
|
+
hyphenate: function(){
|
732
|
+
return this.replace(/[A-Z]/g, function(match){
|
733
|
+
return ('-' + match.charAt(0).toLowerCase());
|
734
|
+
});
|
735
|
+
},
|
736
|
+
|
737
|
+
capitalize: function(){
|
738
|
+
return this.replace(/\b[a-z]/g, function(match){
|
739
|
+
return match.toUpperCase();
|
740
|
+
});
|
741
|
+
},
|
742
|
+
|
743
|
+
escapeRegExp: function(){
|
744
|
+
return this.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1');
|
745
|
+
},
|
746
|
+
|
747
|
+
toInt: function(base){
|
748
|
+
return parseInt(this, base || 10);
|
749
|
+
},
|
750
|
+
|
751
|
+
toFloat: function(){
|
752
|
+
return parseFloat(this);
|
753
|
+
},
|
754
|
+
|
755
|
+
hexToRgb: function(array){
|
756
|
+
var hex = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
|
757
|
+
return (hex) ? hex.slice(1).hexToRgb(array) : null;
|
758
|
+
},
|
759
|
+
|
760
|
+
rgbToHex: function(array){
|
761
|
+
var rgb = this.match(/\d{1,3}/g);
|
762
|
+
return (rgb) ? rgb.rgbToHex(array) : null;
|
763
|
+
},
|
764
|
+
|
765
|
+
stripScripts: function(option){
|
766
|
+
var scripts = '';
|
767
|
+
var text = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(){
|
768
|
+
scripts += arguments[1] + '\n';
|
769
|
+
return '';
|
770
|
+
});
|
771
|
+
if (option === true) $exec(scripts);
|
772
|
+
else if ($type(option) == 'function') option(scripts, text);
|
773
|
+
return text;
|
774
|
+
},
|
775
|
+
|
776
|
+
substitute: function(object, regexp){
|
777
|
+
return this.replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){
|
778
|
+
if (match.charAt(0) == '\\') return match.slice(1);
|
779
|
+
return (object[name] != undefined) ? object[name] : '';
|
780
|
+
});
|
781
|
+
}
|
782
|
+
|
783
|
+
});
|
784
|
+
|
785
|
+
|
786
|
+
/*
|
787
|
+
Script: Hash.js
|
788
|
+
Contains Hash Prototypes. Provides a means for overcoming the JavaScript practical impossibility of extending native Objects.
|
789
|
+
|
790
|
+
License:
|
791
|
+
MIT-style license.
|
792
|
+
*/
|
793
|
+
|
794
|
+
Hash.implement({
|
795
|
+
|
796
|
+
has: Object.prototype.hasOwnProperty,
|
797
|
+
|
798
|
+
keyOf: function(value){
|
799
|
+
for (var key in this){
|
800
|
+
if (this.hasOwnProperty(key) && this[key] === value) return key;
|
801
|
+
}
|
802
|
+
return null;
|
803
|
+
},
|
804
|
+
|
805
|
+
hasValue: function(value){
|
806
|
+
return (Hash.keyOf(this, value) !== null);
|
807
|
+
},
|
808
|
+
|
809
|
+
extend: function(properties){
|
810
|
+
Hash.each(properties || {}, function(value, key){
|
811
|
+
Hash.set(this, key, value);
|
812
|
+
}, this);
|
813
|
+
return this;
|
814
|
+
},
|
815
|
+
|
816
|
+
combine: function(properties){
|
817
|
+
Hash.each(properties || {}, function(value, key){
|
818
|
+
Hash.include(this, key, value);
|
819
|
+
}, this);
|
820
|
+
return this;
|
821
|
+
},
|
822
|
+
|
823
|
+
erase: function(key){
|
824
|
+
if (this.hasOwnProperty(key)) delete this[key];
|
825
|
+
return this;
|
826
|
+
},
|
827
|
+
|
828
|
+
get: function(key){
|
829
|
+
return (this.hasOwnProperty(key)) ? this[key] : null;
|
830
|
+
},
|
831
|
+
|
832
|
+
set: function(key, value){
|
833
|
+
if (!this[key] || this.hasOwnProperty(key)) this[key] = value;
|
834
|
+
return this;
|
835
|
+
},
|
836
|
+
|
837
|
+
empty: function(){
|
838
|
+
Hash.each(this, function(value, key){
|
839
|
+
delete this[key];
|
840
|
+
}, this);
|
841
|
+
return this;
|
842
|
+
},
|
843
|
+
|
844
|
+
include: function(key, value){
|
845
|
+
if (this[key] == undefined) this[key] = value;
|
846
|
+
return this;
|
847
|
+
},
|
848
|
+
|
849
|
+
map: function(fn, bind){
|
850
|
+
var results = new Hash;
|
851
|
+
Hash.each(this, function(value, key){
|
852
|
+
results.set(key, fn.call(bind, value, key, this));
|
853
|
+
}, this);
|
854
|
+
return results;
|
855
|
+
},
|
856
|
+
|
857
|
+
filter: function(fn, bind){
|
858
|
+
var results = new Hash;
|
859
|
+
Hash.each(this, function(value, key){
|
860
|
+
if (fn.call(bind, value, key, this)) results.set(key, value);
|
861
|
+
}, this);
|
862
|
+
return results;
|
863
|
+
},
|
864
|
+
|
865
|
+
every: function(fn, bind){
|
866
|
+
for (var key in this){
|
867
|
+
if (this.hasOwnProperty(key) && !fn.call(bind, this[key], key)) return false;
|
868
|
+
}
|
869
|
+
return true;
|
870
|
+
},
|
871
|
+
|
872
|
+
some: function(fn, bind){
|
873
|
+
for (var key in this){
|
874
|
+
if (this.hasOwnProperty(key) && fn.call(bind, this[key], key)) return true;
|
875
|
+
}
|
876
|
+
return false;
|
877
|
+
},
|
878
|
+
|
879
|
+
getKeys: function(){
|
880
|
+
var keys = [];
|
881
|
+
Hash.each(this, function(value, key){
|
882
|
+
keys.push(key);
|
883
|
+
});
|
884
|
+
return keys;
|
885
|
+
},
|
886
|
+
|
887
|
+
getValues: function(){
|
888
|
+
var values = [];
|
889
|
+
Hash.each(this, function(value){
|
890
|
+
values.push(value);
|
891
|
+
});
|
892
|
+
return values;
|
893
|
+
},
|
894
|
+
|
895
|
+
toQueryString: function(base){
|
896
|
+
var queryString = [];
|
897
|
+
Hash.each(this, function(value, key){
|
898
|
+
if (base) key = base + '[' + key + ']';
|
899
|
+
var result;
|
900
|
+
switch ($type(value)){
|
901
|
+
case 'object': result = Hash.toQueryString(value, key); break;
|
902
|
+
case 'array':
|
903
|
+
var qs = {};
|
904
|
+
value.each(function(val, i){
|
905
|
+
qs[i] = val;
|
906
|
+
});
|
907
|
+
result = Hash.toQueryString(qs, key);
|
908
|
+
break;
|
909
|
+
default: result = key + '=' + encodeURIComponent(value);
|
910
|
+
}
|
911
|
+
if (value != undefined) queryString.push(result);
|
912
|
+
});
|
913
|
+
|
914
|
+
return queryString.join('&');
|
915
|
+
}
|
916
|
+
|
917
|
+
});
|
918
|
+
|
919
|
+
Hash.alias({keyOf: 'indexOf', hasValue: 'contains'});
|
920
|
+
|
921
|
+
|
922
|
+
/*
|
923
|
+
Script: Event.js
|
924
|
+
Contains the Event Native, to make the event object completely crossbrowser.
|
925
|
+
|
926
|
+
License:
|
927
|
+
MIT-style license.
|
928
|
+
*/
|
929
|
+
|
930
|
+
var Event = new Native({
|
931
|
+
|
932
|
+
name: 'Event',
|
933
|
+
|
934
|
+
initialize: function(event, win){
|
935
|
+
win = win || window;
|
936
|
+
var doc = win.document;
|
937
|
+
event = event || win.event;
|
938
|
+
if (event.$extended) return event;
|
939
|
+
this.$extended = true;
|
940
|
+
var type = event.type;
|
941
|
+
var target = event.target || event.srcElement;
|
942
|
+
while (target && target.nodeType == 3) target = target.parentNode;
|
943
|
+
|
944
|
+
if (type.test(/key/)){
|
945
|
+
var code = event.which || event.keyCode;
|
946
|
+
var key = Event.Keys.keyOf(code);
|
947
|
+
if (type == 'keydown'){
|
948
|
+
var fKey = code - 111;
|
949
|
+
if (fKey > 0 && fKey < 13) key = 'f' + fKey;
|
950
|
+
}
|
951
|
+
key = key || String.fromCharCode(code).toLowerCase();
|
952
|
+
} else if (type.match(/(click|mouse|menu)/i)){
|
953
|
+
doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
|
954
|
+
var page = {
|
955
|
+
x: event.pageX || event.clientX + doc.scrollLeft,
|
956
|
+
y: event.pageY || event.clientY + doc.scrollTop
|
957
|
+
};
|
958
|
+
var client = {
|
959
|
+
x: (event.pageX) ? event.pageX - win.pageXOffset : event.clientX,
|
960
|
+
y: (event.pageY) ? event.pageY - win.pageYOffset : event.clientY
|
961
|
+
};
|
962
|
+
if (type.match(/DOMMouseScroll|mousewheel/)){
|
963
|
+
var wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
|
964
|
+
}
|
965
|
+
var rightClick = (event.which == 3) || (event.button == 2);
|
966
|
+
var related = null;
|
967
|
+
if (type.match(/over|out/)){
|
968
|
+
switch (type){
|
969
|
+
case 'mouseover': related = event.relatedTarget || event.fromElement; break;
|
970
|
+
case 'mouseout': related = event.relatedTarget || event.toElement;
|
971
|
+
}
|
972
|
+
if (!(function(){
|
973
|
+
while (related && related.nodeType == 3) related = related.parentNode;
|
974
|
+
return true;
|
975
|
+
}).create({attempt: Browser.Engine.gecko})()) related = false;
|
976
|
+
}
|
977
|
+
}
|
978
|
+
|
979
|
+
return $extend(this, {
|
980
|
+
event: event,
|
981
|
+
type: type,
|
982
|
+
|
983
|
+
page: page,
|
984
|
+
client: client,
|
985
|
+
rightClick: rightClick,
|
986
|
+
|
987
|
+
wheel: wheel,
|
988
|
+
|
989
|
+
relatedTarget: related,
|
990
|
+
target: target,
|
991
|
+
|
992
|
+
code: code,
|
993
|
+
key: key,
|
994
|
+
|
995
|
+
shift: event.shiftKey,
|
996
|
+
control: event.ctrlKey,
|
997
|
+
alt: event.altKey,
|
998
|
+
meta: event.metaKey
|
999
|
+
});
|
1000
|
+
}
|
1001
|
+
|
1002
|
+
});
|
1003
|
+
|
1004
|
+
Event.Keys = new Hash({
|
1005
|
+
'enter': 13,
|
1006
|
+
'up': 38,
|
1007
|
+
'down': 40,
|
1008
|
+
'left': 37,
|
1009
|
+
'right': 39,
|
1010
|
+
'esc': 27,
|
1011
|
+
'space': 32,
|
1012
|
+
'backspace': 8,
|
1013
|
+
'tab': 9,
|
1014
|
+
'delete': 46
|
1015
|
+
});
|
1016
|
+
|
1017
|
+
Event.implement({
|
1018
|
+
|
1019
|
+
stop: function(){
|
1020
|
+
return this.stopPropagation().preventDefault();
|
1021
|
+
},
|
1022
|
+
|
1023
|
+
stopPropagation: function(){
|
1024
|
+
if (this.event.stopPropagation) this.event.stopPropagation();
|
1025
|
+
else this.event.cancelBubble = true;
|
1026
|
+
return this;
|
1027
|
+
},
|
1028
|
+
|
1029
|
+
preventDefault: function(){
|
1030
|
+
if (this.event.preventDefault) this.event.preventDefault();
|
1031
|
+
else this.event.returnValue = false;
|
1032
|
+
return this;
|
1033
|
+
}
|
1034
|
+
|
1035
|
+
});
|
1036
|
+
|
1037
|
+
|
1038
|
+
/*
|
1039
|
+
Script: Class.js
|
1040
|
+
Contains the Class Function for easily creating, extending, and implementing reusable Classes.
|
1041
|
+
|
1042
|
+
License:
|
1043
|
+
MIT-style license.
|
1044
|
+
*/
|
1045
|
+
|
1046
|
+
function Class(params){
|
1047
|
+
|
1048
|
+
if (params instanceof Function) params = {initialize: params};
|
1049
|
+
|
1050
|
+
var newClass = function(){
|
1051
|
+
Object.reset(this);
|
1052
|
+
if (newClass._prototyping) return this;
|
1053
|
+
this._current = $empty;
|
1054
|
+
var value = (this.initialize) ? this.initialize.apply(this, arguments) : this;
|
1055
|
+
delete this._current; delete this.caller;
|
1056
|
+
return value;
|
1057
|
+
}.extend(this);
|
1058
|
+
|
1059
|
+
newClass.implement(params);
|
1060
|
+
|
1061
|
+
newClass.constructor = Class;
|
1062
|
+
newClass.prototype.constructor = newClass;
|
1063
|
+
|
1064
|
+
return newClass;
|
1065
|
+
|
1066
|
+
};
|
1067
|
+
|
1068
|
+
Function.prototype.protect = function(){
|
1069
|
+
this._protected = true;
|
1070
|
+
return this;
|
1071
|
+
};
|
1072
|
+
|
1073
|
+
Object.reset = function(object, key){
|
1074
|
+
|
1075
|
+
if (key == null){
|
1076
|
+
for (var p in object) Object.reset(object, p);
|
1077
|
+
return object;
|
1078
|
+
}
|
1079
|
+
|
1080
|
+
delete object[key];
|
1081
|
+
|
1082
|
+
switch ($type(object[key])){
|
1083
|
+
case 'object':
|
1084
|
+
var F = function(){};
|
1085
|
+
F.prototype = object[key];
|
1086
|
+
var i = new F;
|
1087
|
+
object[key] = Object.reset(i);
|
1088
|
+
break;
|
1089
|
+
case 'array': object[key] = $unlink(object[key]); break;
|
1090
|
+
}
|
1091
|
+
|
1092
|
+
return object;
|
1093
|
+
|
1094
|
+
};
|
1095
|
+
|
1096
|
+
new Native({name: 'Class', initialize: Class}).extend({
|
1097
|
+
|
1098
|
+
instantiate: function(F){
|
1099
|
+
F._prototyping = true;
|
1100
|
+
var proto = new F;
|
1101
|
+
delete F._prototyping;
|
1102
|
+
return proto;
|
1103
|
+
},
|
1104
|
+
|
1105
|
+
wrap: function(self, key, method){
|
1106
|
+
if (method._origin) method = method._origin;
|
1107
|
+
|
1108
|
+
return function(){
|
1109
|
+
if (method._protected && this._current == null) throw new Error('The method "' + key + '" cannot be called.');
|
1110
|
+
var caller = this.caller, current = this._current;
|
1111
|
+
this.caller = current; this._current = arguments.callee;
|
1112
|
+
var result = method.apply(this, arguments);
|
1113
|
+
this._current = current; this.caller = caller;
|
1114
|
+
return result;
|
1115
|
+
}.extend({_owner: self, _origin: method, _name: key});
|
1116
|
+
|
1117
|
+
}
|
1118
|
+
|
1119
|
+
});
|
1120
|
+
|
1121
|
+
Class.implement({
|
1122
|
+
|
1123
|
+
implement: function(key, value){
|
1124
|
+
|
1125
|
+
if ($type(key) == 'object'){
|
1126
|
+
for (var p in key) this.implement(p, key[p]);
|
1127
|
+
return this;
|
1128
|
+
}
|
1129
|
+
|
1130
|
+
var mutator = Class.Mutators[key];
|
1131
|
+
|
1132
|
+
if (mutator){
|
1133
|
+
value = mutator.call(this, value);
|
1134
|
+
if (value == null) return this;
|
1135
|
+
}
|
1136
|
+
|
1137
|
+
var proto = this.prototype;
|
1138
|
+
|
1139
|
+
switch ($type(value)){
|
1140
|
+
|
1141
|
+
case 'function':
|
1142
|
+
if (value._hidden) return this;
|
1143
|
+
proto[key] = Class.wrap(this, key, value);
|
1144
|
+
break;
|
1145
|
+
|
1146
|
+
case 'object':
|
1147
|
+
var previous = proto[key];
|
1148
|
+
if ($type(previous) == 'object') $mixin(previous, value);
|
1149
|
+
else proto[key] = $unlink(value);
|
1150
|
+
break;
|
1151
|
+
|
1152
|
+
case 'array':
|
1153
|
+
proto[key] = $unlink(value);
|
1154
|
+
break;
|
1155
|
+
|
1156
|
+
default: proto[key] = value;
|
1157
|
+
|
1158
|
+
}
|
1159
|
+
|
1160
|
+
return this;
|
1161
|
+
|
1162
|
+
}
|
1163
|
+
|
1164
|
+
});
|
1165
|
+
|
1166
|
+
Class.Mutators = {
|
1167
|
+
|
1168
|
+
Extends: function(parent){
|
1169
|
+
|
1170
|
+
this.parent = parent;
|
1171
|
+
this.prototype = Class.instantiate(parent);
|
1172
|
+
|
1173
|
+
this.implement('parent', function(){
|
1174
|
+
var name = this.caller._name, previous = this.caller._owner.parent.prototype[name];
|
1175
|
+
if (!previous) throw new Error('The method "' + name + '" has no parent.');
|
1176
|
+
return previous.apply(this, arguments);
|
1177
|
+
}.protect());
|
1178
|
+
|
1179
|
+
},
|
1180
|
+
|
1181
|
+
Implements: function(items){
|
1182
|
+
$splat(items).each(function(item){
|
1183
|
+
if (item instanceof Function) item = Class.instantiate(item);
|
1184
|
+
this.implement(item);
|
1185
|
+
}, this);
|
1186
|
+
|
1187
|
+
}
|
1188
|
+
|
1189
|
+
};
|
1190
|
+
|
1191
|
+
|
1192
|
+
/*
|
1193
|
+
Script: Class.Extras.js
|
1194
|
+
Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks.
|
1195
|
+
|
1196
|
+
License:
|
1197
|
+
MIT-style license.
|
1198
|
+
*/
|
1199
|
+
|
1200
|
+
var Chain = new Class({
|
1201
|
+
|
1202
|
+
$chain: [],
|
1203
|
+
|
1204
|
+
chain: function(){
|
1205
|
+
this.$chain.extend(Array.flatten(arguments));
|
1206
|
+
return this;
|
1207
|
+
},
|
1208
|
+
|
1209
|
+
callChain: function(){
|
1210
|
+
return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;
|
1211
|
+
},
|
1212
|
+
|
1213
|
+
clearChain: function(){
|
1214
|
+
this.$chain.empty();
|
1215
|
+
return this;
|
1216
|
+
}
|
1217
|
+
|
1218
|
+
});
|
1219
|
+
|
1220
|
+
var Events = new Class({
|
1221
|
+
|
1222
|
+
$events: {},
|
1223
|
+
|
1224
|
+
addEvent: function(type, fn, internal){
|
1225
|
+
type = Events.removeOn(type);
|
1226
|
+
if (fn != $empty){
|
1227
|
+
this.$events[type] = this.$events[type] || [];
|
1228
|
+
this.$events[type].include(fn);
|
1229
|
+
if (internal) fn.internal = true;
|
1230
|
+
}
|
1231
|
+
return this;
|
1232
|
+
},
|
1233
|
+
|
1234
|
+
addEvents: function(events){
|
1235
|
+
for (var type in events) this.addEvent(type, events[type]);
|
1236
|
+
return this;
|
1237
|
+
},
|
1238
|
+
|
1239
|
+
fireEvent: function(type, args, delay){
|
1240
|
+
type = Events.removeOn(type);
|
1241
|
+
if (!this.$events || !this.$events[type]) return this;
|
1242
|
+
this.$events[type].each(function(fn){
|
1243
|
+
fn.create({'bind': this, 'delay': delay, 'arguments': args})();
|
1244
|
+
}, this);
|
1245
|
+
return this;
|
1246
|
+
},
|
1247
|
+
|
1248
|
+
removeEvent: function(type, fn){
|
1249
|
+
type = Events.removeOn(type);
|
1250
|
+
if (!this.$events[type]) return this;
|
1251
|
+
if (!fn.internal) this.$events[type].erase(fn);
|
1252
|
+
return this;
|
1253
|
+
},
|
1254
|
+
|
1255
|
+
removeEvents: function(events){
|
1256
|
+
var type;
|
1257
|
+
if ($type(events) == 'object'){
|
1258
|
+
for (type in events) this.removeEvent(type, events[type]);
|
1259
|
+
return this;
|
1260
|
+
}
|
1261
|
+
if (events) events = Events.removeOn(events);
|
1262
|
+
for (type in this.$events){
|
1263
|
+
if (events && events != type) continue;
|
1264
|
+
var fns = this.$events[type];
|
1265
|
+
for (var i = fns.length; i--; i) this.removeEvent(type, fns[i]);
|
1266
|
+
}
|
1267
|
+
return this;
|
1268
|
+
}
|
1269
|
+
|
1270
|
+
});
|
1271
|
+
|
1272
|
+
Events.removeOn = function(string){
|
1273
|
+
return string.replace(/^on([A-Z])/, function(full, first) {
|
1274
|
+
return first.toLowerCase();
|
1275
|
+
});
|
1276
|
+
};
|
1277
|
+
|
1278
|
+
var Options = new Class({
|
1279
|
+
|
1280
|
+
setOptions: function(){
|
1281
|
+
this.options = $merge.run([this.options].extend(arguments));
|
1282
|
+
if (!this.addEvent) return this;
|
1283
|
+
for (var option in this.options){
|
1284
|
+
if ($type(this.options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;
|
1285
|
+
this.addEvent(option, this.options[option]);
|
1286
|
+
delete this.options[option];
|
1287
|
+
}
|
1288
|
+
return this;
|
1289
|
+
}
|
1290
|
+
|
1291
|
+
});
|
1292
|
+
|
1293
|
+
|
1294
|
+
/*
|
1295
|
+
Script: Element.js
|
1296
|
+
One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser,
|
1297
|
+
time-saver methods to let you easily work with HTML Elements.
|
1298
|
+
|
1299
|
+
License:
|
1300
|
+
MIT-style license.
|
1301
|
+
*/
|
1302
|
+
|
1303
|
+
var Element = new Native({
|
1304
|
+
|
1305
|
+
name: 'Element',
|
1306
|
+
|
1307
|
+
legacy: window.Element,
|
1308
|
+
|
1309
|
+
initialize: function(tag, props){
|
1310
|
+
var konstructor = Element.Constructors.get(tag);
|
1311
|
+
if (konstructor) return konstructor(props);
|
1312
|
+
if (typeof tag == 'string') return document.newElement(tag, props);
|
1313
|
+
return document.id(tag).set(props);
|
1314
|
+
},
|
1315
|
+
|
1316
|
+
afterImplement: function(key, value){
|
1317
|
+
Element.Prototype[key] = value;
|
1318
|
+
if (Array[key]) return;
|
1319
|
+
Elements.implement(key, function(){
|
1320
|
+
var items = [], elements = true;
|
1321
|
+
for (var i = 0, j = this.length; i < j; i++){
|
1322
|
+
var returns = this[i][key].apply(this[i], arguments);
|
1323
|
+
items.push(returns);
|
1324
|
+
if (elements) elements = ($type(returns) == 'element');
|
1325
|
+
}
|
1326
|
+
return (elements) ? new Elements(items) : items;
|
1327
|
+
});
|
1328
|
+
}
|
1329
|
+
|
1330
|
+
});
|
1331
|
+
|
1332
|
+
Element.Prototype = {$family: {name: 'element'}};
|
1333
|
+
|
1334
|
+
Element.Constructors = new Hash;
|
1335
|
+
|
1336
|
+
var IFrame = new Native({
|
1337
|
+
|
1338
|
+
name: 'IFrame',
|
1339
|
+
|
1340
|
+
generics: false,
|
1341
|
+
|
1342
|
+
initialize: function(){
|
1343
|
+
var params = Array.link(arguments, {properties: Object.type, iframe: $defined});
|
1344
|
+
var props = params.properties || {};
|
1345
|
+
var iframe = document.id(params.iframe);
|
1346
|
+
var onload = props.onload || $empty;
|
1347
|
+
delete props.onload;
|
1348
|
+
props.id = props.name = $pick(props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + $time());
|
1349
|
+
iframe = new Element(iframe || 'iframe', props);
|
1350
|
+
var onFrameLoad = function(){
|
1351
|
+
var host = $try(function(){
|
1352
|
+
return iframe.contentWindow.location.host;
|
1353
|
+
});
|
1354
|
+
if (!host || host == window.location.host){
|
1355
|
+
var win = new Window(iframe.contentWindow);
|
1356
|
+
new Document(iframe.contentWindow.document);
|
1357
|
+
$extend(win.Element.prototype, Element.Prototype);
|
1358
|
+
}
|
1359
|
+
onload.call(iframe.contentWindow, iframe.contentWindow.document);
|
1360
|
+
};
|
1361
|
+
var contentWindow = $try(function(){
|
1362
|
+
return iframe.contentWindow;
|
1363
|
+
});
|
1364
|
+
((contentWindow && contentWindow.document.body) || window.frames[props.id]) ? onFrameLoad() : iframe.addListener('load', onFrameLoad);
|
1365
|
+
return iframe;
|
1366
|
+
}
|
1367
|
+
|
1368
|
+
});
|
1369
|
+
|
1370
|
+
var Elements = new Native({
|
1371
|
+
|
1372
|
+
initialize: function(elements, options){
|
1373
|
+
options = $extend({ddup: true, cash: true}, options);
|
1374
|
+
elements = elements || [];
|
1375
|
+
if (options.ddup || options.cash){
|
1376
|
+
var uniques = {}, returned = [];
|
1377
|
+
for (var i = 0, l = elements.length; i < l; i++){
|
1378
|
+
var el = document.id(elements[i], !options.cash);
|
1379
|
+
if (options.ddup){
|
1380
|
+
if (uniques[el.uid]) continue;
|
1381
|
+
uniques[el.uid] = true;
|
1382
|
+
}
|
1383
|
+
returned.push(el);
|
1384
|
+
}
|
1385
|
+
elements = returned;
|
1386
|
+
}
|
1387
|
+
return (options.cash) ? $extend(elements, this) : elements;
|
1388
|
+
}
|
1389
|
+
|
1390
|
+
});
|
1391
|
+
|
1392
|
+
Elements.implement({
|
1393
|
+
|
1394
|
+
filter: function(filter, bind){
|
1395
|
+
if (!filter) return this;
|
1396
|
+
return new Elements(Array.filter(this, (typeof filter == 'string') ? function(item){
|
1397
|
+
return item.match(filter);
|
1398
|
+
} : filter, bind));
|
1399
|
+
}
|
1400
|
+
|
1401
|
+
});
|
1402
|
+
|
1403
|
+
Document.implement({
|
1404
|
+
|
1405
|
+
newElement: function(tag, props){
|
1406
|
+
if (Browser.Engine.trident && props){
|
1407
|
+
['name', 'type', 'checked'].each(function(attribute){
|
1408
|
+
if (!props[attribute]) return;
|
1409
|
+
tag += ' ' + attribute + '="' + props[attribute] + '"';
|
1410
|
+
if (attribute != 'checked') delete props[attribute];
|
1411
|
+
});
|
1412
|
+
tag = '<' + tag + '>';
|
1413
|
+
}
|
1414
|
+
return document.id(this.createElement(tag)).set(props);
|
1415
|
+
},
|
1416
|
+
|
1417
|
+
newTextNode: function(text){
|
1418
|
+
return this.createTextNode(text);
|
1419
|
+
},
|
1420
|
+
|
1421
|
+
getDocument: function(){
|
1422
|
+
return this;
|
1423
|
+
},
|
1424
|
+
|
1425
|
+
getWindow: function(){
|
1426
|
+
return this.window;
|
1427
|
+
},
|
1428
|
+
|
1429
|
+
id: (function(){
|
1430
|
+
|
1431
|
+
var types = {
|
1432
|
+
|
1433
|
+
string: function(id, nocash, doc){
|
1434
|
+
id = doc.getElementById(id);
|
1435
|
+
return (id) ? types.element(id, nocash) : null;
|
1436
|
+
},
|
1437
|
+
|
1438
|
+
element: function(el, nocash){
|
1439
|
+
$uid(el);
|
1440
|
+
if (!nocash && !el.$family && !(/^object|embed$/i).test(el.tagName)){
|
1441
|
+
var proto = Element.Prototype;
|
1442
|
+
for (var p in proto) el[p] = proto[p];
|
1443
|
+
};
|
1444
|
+
return el;
|
1445
|
+
},
|
1446
|
+
|
1447
|
+
object: function(obj, nocash, doc){
|
1448
|
+
if (obj.toElement) return types.element(obj.toElement(doc), nocash);
|
1449
|
+
return null;
|
1450
|
+
}
|
1451
|
+
|
1452
|
+
};
|
1453
|
+
|
1454
|
+
types.textnode = types.whitespace = types.window = types.document = $arguments(0);
|
1455
|
+
|
1456
|
+
return function(el, nocash, doc){
|
1457
|
+
if (el && el.$family && el.uid) return el;
|
1458
|
+
var type = $type(el);
|
1459
|
+
return (types[type]) ? types[type](el, nocash, doc || document) : null;
|
1460
|
+
};
|
1461
|
+
|
1462
|
+
})()
|
1463
|
+
|
1464
|
+
});
|
1465
|
+
|
1466
|
+
if (window.$ == null) Window.implement({
|
1467
|
+
$: function(el, nc){
|
1468
|
+
return document.id(el, nc, this.document);
|
1469
|
+
}
|
1470
|
+
});
|
1471
|
+
|
1472
|
+
Window.implement({
|
1473
|
+
|
1474
|
+
$$: function(selector){
|
1475
|
+
if (arguments.length == 1 && typeof selector == 'string') return this.document.getElements(selector);
|
1476
|
+
var elements = [];
|
1477
|
+
var args = Array.flatten(arguments);
|
1478
|
+
for (var i = 0, l = args.length; i < l; i++){
|
1479
|
+
var item = args[i];
|
1480
|
+
switch ($type(item)){
|
1481
|
+
case 'element': elements.push(item); break;
|
1482
|
+
case 'string': elements.extend(this.document.getElements(item, true));
|
1483
|
+
}
|
1484
|
+
}
|
1485
|
+
return new Elements(elements);
|
1486
|
+
},
|
1487
|
+
|
1488
|
+
getDocument: function(){
|
1489
|
+
return this.document;
|
1490
|
+
},
|
1491
|
+
|
1492
|
+
getWindow: function(){
|
1493
|
+
return this;
|
1494
|
+
}
|
1495
|
+
|
1496
|
+
});
|
1497
|
+
|
1498
|
+
Native.implement([Element, Document], {
|
1499
|
+
|
1500
|
+
getElement: function(selector, nocash){
|
1501
|
+
return document.id(this.getElements(selector, true)[0] || null, nocash);
|
1502
|
+
},
|
1503
|
+
|
1504
|
+
getElements: function(tags, nocash){
|
1505
|
+
tags = tags.split(',');
|
1506
|
+
var elements = [];
|
1507
|
+
var ddup = (tags.length > 1);
|
1508
|
+
tags.each(function(tag){
|
1509
|
+
var partial = this.getElementsByTagName(tag.trim());
|
1510
|
+
(ddup) ? elements.extend(partial) : elements = partial;
|
1511
|
+
}, this);
|
1512
|
+
return new Elements(elements, {ddup: ddup, cash: !nocash});
|
1513
|
+
}
|
1514
|
+
|
1515
|
+
});
|
1516
|
+
|
1517
|
+
(function(){
|
1518
|
+
|
1519
|
+
var collected = {}, storage = {};
|
1520
|
+
var props = {input: 'checked', option: 'selected', textarea: (Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerHTML' : 'value'};
|
1521
|
+
|
1522
|
+
var get = function(uid){
|
1523
|
+
return (storage[uid] || (storage[uid] = {}));
|
1524
|
+
};
|
1525
|
+
|
1526
|
+
var clean = function(item, retain){
|
1527
|
+
if (!item) return;
|
1528
|
+
var uid = item.uid;
|
1529
|
+
if (Browser.Engine.trident){
|
1530
|
+
if (item.clearAttributes){
|
1531
|
+
var clone = retain && item.cloneNode(false);
|
1532
|
+
item.clearAttributes();
|
1533
|
+
if (clone) item.mergeAttributes(clone);
|
1534
|
+
} else if (item.removeEvents){
|
1535
|
+
item.removeEvents();
|
1536
|
+
}
|
1537
|
+
if ((/object/i).test(item.tagName)){
|
1538
|
+
for (var p in item){
|
1539
|
+
if (typeof item[p] == 'function') item[p] = $empty;
|
1540
|
+
}
|
1541
|
+
Element.dispose(item);
|
1542
|
+
}
|
1543
|
+
}
|
1544
|
+
if (!uid) return;
|
1545
|
+
collected[uid] = storage[uid] = null;
|
1546
|
+
};
|
1547
|
+
|
1548
|
+
var purge = function(){
|
1549
|
+
Hash.each(collected, clean);
|
1550
|
+
if (Browser.Engine.trident) $A(document.getElementsByTagName('object')).each(clean);
|
1551
|
+
if (window.CollectGarbage) CollectGarbage();
|
1552
|
+
collected = storage = null;
|
1553
|
+
};
|
1554
|
+
|
1555
|
+
var walk = function(element, walk, start, match, all, nocash){
|
1556
|
+
var el = element[start || walk];
|
1557
|
+
var elements = [];
|
1558
|
+
while (el){
|
1559
|
+
if (el.nodeType == 1 && (!match || Element.match(el, match))){
|
1560
|
+
if (!all) return document.id(el, nocash);
|
1561
|
+
elements.push(el);
|
1562
|
+
}
|
1563
|
+
el = el[walk];
|
1564
|
+
}
|
1565
|
+
return (all) ? new Elements(elements, {ddup: false, cash: !nocash}) : null;
|
1566
|
+
};
|
1567
|
+
|
1568
|
+
var attributes = {
|
1569
|
+
'html': 'innerHTML',
|
1570
|
+
'class': 'className',
|
1571
|
+
'for': 'htmlFor',
|
1572
|
+
'defaultValue': 'defaultValue',
|
1573
|
+
'text': (Browser.Engine.trident || (Browser.Engine.webkit && Browser.Engine.version < 420)) ? 'innerText' : 'textContent'
|
1574
|
+
};
|
1575
|
+
var bools = ['compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', 'disabled', 'readonly', 'multiple', 'selected', 'noresize', 'defer'];
|
1576
|
+
var camels = ['value', 'type', 'defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', 'frameBorder', 'maxLength', 'readOnly', 'rowSpan', 'tabIndex', 'useMap'];
|
1577
|
+
|
1578
|
+
bools = bools.associate(bools);
|
1579
|
+
|
1580
|
+
Hash.extend(attributes, bools);
|
1581
|
+
Hash.extend(attributes, camels.associate(camels.map(String.toLowerCase)));
|
1582
|
+
|
1583
|
+
var inserters = {
|
1584
|
+
|
1585
|
+
before: function(context, element){
|
1586
|
+
if (element.parentNode) element.parentNode.insertBefore(context, element);
|
1587
|
+
},
|
1588
|
+
|
1589
|
+
after: function(context, element){
|
1590
|
+
if (!element.parentNode) return;
|
1591
|
+
var next = element.nextSibling;
|
1592
|
+
(next) ? element.parentNode.insertBefore(context, next) : element.parentNode.appendChild(context);
|
1593
|
+
},
|
1594
|
+
|
1595
|
+
bottom: function(context, element){
|
1596
|
+
element.appendChild(context);
|
1597
|
+
},
|
1598
|
+
|
1599
|
+
top: function(context, element){
|
1600
|
+
var first = element.firstChild;
|
1601
|
+
(first) ? element.insertBefore(context, first) : element.appendChild(context);
|
1602
|
+
}
|
1603
|
+
|
1604
|
+
};
|
1605
|
+
|
1606
|
+
inserters.inside = inserters.bottom;
|
1607
|
+
|
1608
|
+
Hash.each(inserters, function(inserter, where){
|
1609
|
+
|
1610
|
+
where = where.capitalize();
|
1611
|
+
|
1612
|
+
Element.implement('inject' + where, function(el){
|
1613
|
+
inserter(this, document.id(el, true));
|
1614
|
+
return this;
|
1615
|
+
});
|
1616
|
+
|
1617
|
+
Element.implement('grab' + where, function(el){
|
1618
|
+
inserter(document.id(el, true), this);
|
1619
|
+
return this;
|
1620
|
+
});
|
1621
|
+
|
1622
|
+
});
|
1623
|
+
|
1624
|
+
Element.implement({
|
1625
|
+
|
1626
|
+
set: function(prop, value){
|
1627
|
+
switch ($type(prop)){
|
1628
|
+
case 'object':
|
1629
|
+
for (var p in prop) this.set(p, prop[p]);
|
1630
|
+
break;
|
1631
|
+
case 'string':
|
1632
|
+
var property = Element.Properties.get(prop);
|
1633
|
+
(property && property.set) ? property.set.apply(this, Array.slice(arguments, 1)) : this.setProperty(prop, value);
|
1634
|
+
}
|
1635
|
+
return this;
|
1636
|
+
},
|
1637
|
+
|
1638
|
+
get: function(prop){
|
1639
|
+
var property = Element.Properties.get(prop);
|
1640
|
+
return (property && property.get) ? property.get.apply(this, Array.slice(arguments, 1)) : this.getProperty(prop);
|
1641
|
+
},
|
1642
|
+
|
1643
|
+
erase: function(prop){
|
1644
|
+
var property = Element.Properties.get(prop);
|
1645
|
+
(property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop);
|
1646
|
+
return this;
|
1647
|
+
},
|
1648
|
+
|
1649
|
+
setProperty: function(attribute, value){
|
1650
|
+
var key = attributes[attribute];
|
1651
|
+
if (value == undefined) return this.removeProperty(attribute);
|
1652
|
+
if (key && bools[attribute]) value = !!value;
|
1653
|
+
(key) ? this[key] = value : this.setAttribute(attribute, '' + value);
|
1654
|
+
return this;
|
1655
|
+
},
|
1656
|
+
|
1657
|
+
setProperties: function(attributes){
|
1658
|
+
for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]);
|
1659
|
+
return this;
|
1660
|
+
},
|
1661
|
+
|
1662
|
+
getProperty: function(attribute){
|
1663
|
+
var key = attributes[attribute];
|
1664
|
+
var value = (key) ? this[key] : this.getAttribute(attribute, 2);
|
1665
|
+
return (bools[attribute]) ? !!value : (key) ? value : value || null;
|
1666
|
+
},
|
1667
|
+
|
1668
|
+
getProperties: function(){
|
1669
|
+
var args = $A(arguments);
|
1670
|
+
return args.map(this.getProperty, this).associate(args);
|
1671
|
+
},
|
1672
|
+
|
1673
|
+
removeProperty: function(attribute){
|
1674
|
+
var key = attributes[attribute];
|
1675
|
+
(key) ? this[key] = (key && bools[attribute]) ? false : '' : this.removeAttribute(attribute);
|
1676
|
+
return this;
|
1677
|
+
},
|
1678
|
+
|
1679
|
+
removeProperties: function(){
|
1680
|
+
Array.each(arguments, this.removeProperty, this);
|
1681
|
+
return this;
|
1682
|
+
},
|
1683
|
+
|
1684
|
+
hasClass: function(className){
|
1685
|
+
return this.className.contains(className, ' ');
|
1686
|
+
},
|
1687
|
+
|
1688
|
+
addClass: function(className){
|
1689
|
+
if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean();
|
1690
|
+
return this;
|
1691
|
+
},
|
1692
|
+
|
1693
|
+
removeClass: function(className){
|
1694
|
+
this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1');
|
1695
|
+
return this;
|
1696
|
+
},
|
1697
|
+
|
1698
|
+
toggleClass: function(className){
|
1699
|
+
return this.hasClass(className) ? this.removeClass(className) : this.addClass(className);
|
1700
|
+
},
|
1701
|
+
|
1702
|
+
adopt: function(){
|
1703
|
+
Array.flatten(arguments).each(function(element){
|
1704
|
+
element = document.id(element, true);
|
1705
|
+
if (element) this.appendChild(element);
|
1706
|
+
}, this);
|
1707
|
+
return this;
|
1708
|
+
},
|
1709
|
+
|
1710
|
+
appendText: function(text, where){
|
1711
|
+
return this.grab(this.getDocument().newTextNode(text), where);
|
1712
|
+
},
|
1713
|
+
|
1714
|
+
grab: function(el, where){
|
1715
|
+
inserters[where || 'bottom'](document.id(el, true), this);
|
1716
|
+
return this;
|
1717
|
+
},
|
1718
|
+
|
1719
|
+
inject: function(el, where){
|
1720
|
+
inserters[where || 'bottom'](this, document.id(el, true));
|
1721
|
+
return this;
|
1722
|
+
},
|
1723
|
+
|
1724
|
+
replaces: function(el){
|
1725
|
+
el = document.id(el, true);
|
1726
|
+
el.parentNode.replaceChild(this, el);
|
1727
|
+
return this;
|
1728
|
+
},
|
1729
|
+
|
1730
|
+
wraps: function(el, where){
|
1731
|
+
el = document.id(el, true);
|
1732
|
+
return this.replaces(el).grab(el, where);
|
1733
|
+
},
|
1734
|
+
|
1735
|
+
getPrevious: function(match, nocash){
|
1736
|
+
return walk(this, 'previousSibling', null, match, false, nocash);
|
1737
|
+
},
|
1738
|
+
|
1739
|
+
getAllPrevious: function(match, nocash){
|
1740
|
+
return walk(this, 'previousSibling', null, match, true, nocash);
|
1741
|
+
},
|
1742
|
+
|
1743
|
+
getNext: function(match, nocash){
|
1744
|
+
return walk(this, 'nextSibling', null, match, false, nocash);
|
1745
|
+
},
|
1746
|
+
|
1747
|
+
getAllNext: function(match, nocash){
|
1748
|
+
return walk(this, 'nextSibling', null, match, true, nocash);
|
1749
|
+
},
|
1750
|
+
|
1751
|
+
getFirst: function(match, nocash){
|
1752
|
+
return walk(this, 'nextSibling', 'firstChild', match, false, nocash);
|
1753
|
+
},
|
1754
|
+
|
1755
|
+
getLast: function(match, nocash){
|
1756
|
+
return walk(this, 'previousSibling', 'lastChild', match, false, nocash);
|
1757
|
+
},
|
1758
|
+
|
1759
|
+
getParent: function(match, nocash){
|
1760
|
+
return walk(this, 'parentNode', null, match, false, nocash);
|
1761
|
+
},
|
1762
|
+
|
1763
|
+
getParents: function(match, nocash){
|
1764
|
+
return walk(this, 'parentNode', null, match, true, nocash);
|
1765
|
+
},
|
1766
|
+
|
1767
|
+
getSiblings: function(match, nocash) {
|
1768
|
+
return this.getParent().getChildren(match, nocash).erase(this);
|
1769
|
+
},
|
1770
|
+
|
1771
|
+
getChildren: function(match, nocash){
|
1772
|
+
return walk(this, 'nextSibling', 'firstChild', match, true, nocash);
|
1773
|
+
},
|
1774
|
+
|
1775
|
+
getWindow: function(){
|
1776
|
+
return this.ownerDocument.window;
|
1777
|
+
},
|
1778
|
+
|
1779
|
+
getDocument: function(){
|
1780
|
+
return this.ownerDocument;
|
1781
|
+
},
|
1782
|
+
|
1783
|
+
getElementById: function(id, nocash){
|
1784
|
+
var el = this.ownerDocument.getElementById(id);
|
1785
|
+
if (!el) return null;
|
1786
|
+
for (var parent = el.parentNode; parent != this; parent = parent.parentNode){
|
1787
|
+
if (!parent) return null;
|
1788
|
+
}
|
1789
|
+
return document.id(el, nocash);
|
1790
|
+
},
|
1791
|
+
|
1792
|
+
getSelected: function(){
|
1793
|
+
return new Elements($A(this.options).filter(function(option){
|
1794
|
+
return option.selected;
|
1795
|
+
}));
|
1796
|
+
},
|
1797
|
+
|
1798
|
+
getComputedStyle: function(property){
|
1799
|
+
if (this.currentStyle) return this.currentStyle[property.camelCase()];
|
1800
|
+
var computed = this.getDocument().defaultView.getComputedStyle(this, null);
|
1801
|
+
return (computed) ? computed.getPropertyValue([property.hyphenate()]) : null;
|
1802
|
+
},
|
1803
|
+
|
1804
|
+
toQueryString: function(){
|
1805
|
+
var queryString = [];
|
1806
|
+
this.getElements('input, select, textarea', true).each(function(el){
|
1807
|
+
if (!el.name || el.disabled || el.type == 'submit' || el.type == 'reset' || el.type == 'file') return;
|
1808
|
+
var value = (el.tagName.toLowerCase() == 'select') ? Element.getSelected(el).map(function(opt){
|
1809
|
+
return opt.value;
|
1810
|
+
}) : ((el.type == 'radio' || el.type == 'checkbox') && !el.checked) ? null : el.value;
|
1811
|
+
$splat(value).each(function(val){
|
1812
|
+
if (typeof val != 'undefined') queryString.push(el.name + '=' + encodeURIComponent(val));
|
1813
|
+
});
|
1814
|
+
});
|
1815
|
+
return queryString.join('&');
|
1816
|
+
},
|
1817
|
+
|
1818
|
+
clone: function(contents, keepid){
|
1819
|
+
contents = contents !== false;
|
1820
|
+
var clone = this.cloneNode(contents);
|
1821
|
+
var clean = function(node, element){
|
1822
|
+
if (!keepid) node.removeAttribute('id');
|
1823
|
+
if (Browser.Engine.trident){
|
1824
|
+
node.clearAttributes();
|
1825
|
+
node.mergeAttributes(element);
|
1826
|
+
node.removeAttribute('uid');
|
1827
|
+
if (node.options){
|
1828
|
+
var no = node.options, eo = element.options;
|
1829
|
+
for (var j = no.length; j--;) no[j].selected = eo[j].selected;
|
1830
|
+
}
|
1831
|
+
}
|
1832
|
+
var prop = props[element.tagName.toLowerCase()];
|
1833
|
+
if (prop && element[prop]) node[prop] = element[prop];
|
1834
|
+
};
|
1835
|
+
|
1836
|
+
if (contents){
|
1837
|
+
var ce = clone.getElementsByTagName('*'), te = this.getElementsByTagName('*');
|
1838
|
+
for (var i = ce.length; i--;) clean(ce[i], te[i]);
|
1839
|
+
}
|
1840
|
+
|
1841
|
+
clean(clone, this);
|
1842
|
+
return document.id(clone);
|
1843
|
+
},
|
1844
|
+
|
1845
|
+
destroy: function(){
|
1846
|
+
Element.empty(this);
|
1847
|
+
Element.dispose(this);
|
1848
|
+
clean(this, true);
|
1849
|
+
return null;
|
1850
|
+
},
|
1851
|
+
|
1852
|
+
empty: function(){
|
1853
|
+
$A(this.childNodes).each(function(node){
|
1854
|
+
Element.destroy(node);
|
1855
|
+
});
|
1856
|
+
return this;
|
1857
|
+
},
|
1858
|
+
|
1859
|
+
dispose: function(){
|
1860
|
+
return (this.parentNode) ? this.parentNode.removeChild(this) : this;
|
1861
|
+
},
|
1862
|
+
|
1863
|
+
hasChild: function(el){
|
1864
|
+
el = document.id(el, true);
|
1865
|
+
if (!el) return false;
|
1866
|
+
if (Browser.Engine.webkit && Browser.Engine.version < 420) return $A(this.getElementsByTagName(el.tagName)).contains(el);
|
1867
|
+
return (this.contains) ? (this != el && this.contains(el)) : !!(this.compareDocumentPosition(el) & 16);
|
1868
|
+
},
|
1869
|
+
|
1870
|
+
match: function(tag){
|
1871
|
+
return (!tag || (tag == this) || (Element.get(this, 'tag') == tag));
|
1872
|
+
}
|
1873
|
+
|
1874
|
+
});
|
1875
|
+
|
1876
|
+
Native.implement([Element, Window, Document], {
|
1877
|
+
|
1878
|
+
addListener: function(type, fn){
|
1879
|
+
if (type == 'unload'){
|
1880
|
+
var old = fn, self = this;
|
1881
|
+
fn = function(){
|
1882
|
+
self.removeListener('unload', fn);
|
1883
|
+
old();
|
1884
|
+
};
|
1885
|
+
} else {
|
1886
|
+
collected[this.uid] = this;
|
1887
|
+
}
|
1888
|
+
if (this.addEventListener) this.addEventListener(type, fn, false);
|
1889
|
+
else this.attachEvent('on' + type, fn);
|
1890
|
+
return this;
|
1891
|
+
},
|
1892
|
+
|
1893
|
+
removeListener: function(type, fn){
|
1894
|
+
if (this.removeEventListener) this.removeEventListener(type, fn, false);
|
1895
|
+
else this.detachEvent('on' + type, fn);
|
1896
|
+
return this;
|
1897
|
+
},
|
1898
|
+
|
1899
|
+
retrieve: function(property, dflt){
|
1900
|
+
var storage = get(this.uid), prop = storage[property];
|
1901
|
+
if (dflt != undefined && prop == undefined) prop = storage[property] = dflt;
|
1902
|
+
return $pick(prop);
|
1903
|
+
},
|
1904
|
+
|
1905
|
+
store: function(property, value){
|
1906
|
+
var storage = get(this.uid);
|
1907
|
+
storage[property] = value;
|
1908
|
+
return this;
|
1909
|
+
},
|
1910
|
+
|
1911
|
+
eliminate: function(property){
|
1912
|
+
var storage = get(this.uid);
|
1913
|
+
delete storage[property];
|
1914
|
+
return this;
|
1915
|
+
}
|
1916
|
+
|
1917
|
+
});
|
1918
|
+
|
1919
|
+
window.addListener('unload', purge);
|
1920
|
+
|
1921
|
+
})();
|
1922
|
+
|
1923
|
+
Element.Properties = new Hash;
|
1924
|
+
|
1925
|
+
Element.Properties.style = {
|
1926
|
+
|
1927
|
+
set: function(style){
|
1928
|
+
this.style.cssText = style;
|
1929
|
+
},
|
1930
|
+
|
1931
|
+
get: function(){
|
1932
|
+
return this.style.cssText;
|
1933
|
+
},
|
1934
|
+
|
1935
|
+
erase: function(){
|
1936
|
+
this.style.cssText = '';
|
1937
|
+
}
|
1938
|
+
|
1939
|
+
};
|
1940
|
+
|
1941
|
+
Element.Properties.tag = {
|
1942
|
+
|
1943
|
+
get: function(){
|
1944
|
+
return this.tagName.toLowerCase();
|
1945
|
+
}
|
1946
|
+
|
1947
|
+
};
|
1948
|
+
|
1949
|
+
Element.Properties.html = (function(){
|
1950
|
+
var wrapper = document.createElement('div');
|
1951
|
+
|
1952
|
+
var translations = {
|
1953
|
+
table: [1, '<table>', '</table>'],
|
1954
|
+
select: [1, '<select>', '</select>'],
|
1955
|
+
tbody: [2, '<table><tbody>', '</tbody></table>'],
|
1956
|
+
tr: [3, '<table><tbody><tr>', '</tr></tbody></table>']
|
1957
|
+
};
|
1958
|
+
translations.thead = translations.tfoot = translations.tbody;
|
1959
|
+
|
1960
|
+
var html = {
|
1961
|
+
set: function(){
|
1962
|
+
var html = Array.flatten(arguments).join('');
|
1963
|
+
var wrap = Browser.Engine.trident && translations[this.get('tag')];
|
1964
|
+
if (wrap){
|
1965
|
+
var first = wrapper;
|
1966
|
+
first.innerHTML = wrap[1] + html + wrap[2];
|
1967
|
+
for (var i = wrap[0]; i--;) first = first.firstChild;
|
1968
|
+
this.empty().adopt(first.childNodes);
|
1969
|
+
} else {
|
1970
|
+
this.innerHTML = html;
|
1971
|
+
}
|
1972
|
+
}
|
1973
|
+
};
|
1974
|
+
|
1975
|
+
html.erase = html.set;
|
1976
|
+
|
1977
|
+
return html;
|
1978
|
+
})();
|
1979
|
+
|
1980
|
+
if (Browser.Engine.webkit && Browser.Engine.version < 420) Element.Properties.text = {
|
1981
|
+
get: function(){
|
1982
|
+
if (this.innerText) return this.innerText;
|
1983
|
+
var temp = this.ownerDocument.newElement('div', {html: this.innerHTML}).inject(this.ownerDocument.body);
|
1984
|
+
var text = temp.innerText;
|
1985
|
+
temp.destroy();
|
1986
|
+
return text;
|
1987
|
+
}
|
1988
|
+
};
|
1989
|
+
|
1990
|
+
|
1991
|
+
/*
|
1992
|
+
Script: Element.Event.js
|
1993
|
+
Contains Element methods for dealing with events, and custom Events.
|
1994
|
+
|
1995
|
+
License:
|
1996
|
+
MIT-style license.
|
1997
|
+
*/
|
1998
|
+
|
1999
|
+
Element.Properties.events = {set: function(events){
|
2000
|
+
this.addEvents(events);
|
2001
|
+
}};
|
2002
|
+
|
2003
|
+
Native.implement([Element, Window, Document], {
|
2004
|
+
|
2005
|
+
addEvent: function(type, fn){
|
2006
|
+
var events = this.retrieve('events', {});
|
2007
|
+
events[type] = events[type] || {'keys': [], 'values': []};
|
2008
|
+
if (events[type].keys.contains(fn)) return this;
|
2009
|
+
events[type].keys.push(fn);
|
2010
|
+
var realType = type, custom = Element.Events.get(type), condition = fn, self = this;
|
2011
|
+
if (custom){
|
2012
|
+
if (custom.onAdd) custom.onAdd.call(this, fn);
|
2013
|
+
if (custom.condition){
|
2014
|
+
condition = function(event){
|
2015
|
+
if (custom.condition.call(this, event)) return fn.call(this, event);
|
2016
|
+
return true;
|
2017
|
+
};
|
2018
|
+
}
|
2019
|
+
realType = custom.base || realType;
|
2020
|
+
}
|
2021
|
+
var defn = function(){
|
2022
|
+
return fn.call(self);
|
2023
|
+
};
|
2024
|
+
var nativeEvent = Element.NativeEvents[realType];
|
2025
|
+
if (nativeEvent){
|
2026
|
+
if (nativeEvent == 2){
|
2027
|
+
defn = function(event){
|
2028
|
+
event = new Event(event, self.getWindow());
|
2029
|
+
if (condition.call(self, event) === false) event.stop();
|
2030
|
+
};
|
2031
|
+
}
|
2032
|
+
this.addListener(realType, defn);
|
2033
|
+
}
|
2034
|
+
events[type].values.push(defn);
|
2035
|
+
return this;
|
2036
|
+
},
|
2037
|
+
|
2038
|
+
removeEvent: function(type, fn){
|
2039
|
+
var events = this.retrieve('events');
|
2040
|
+
if (!events || !events[type]) return this;
|
2041
|
+
var pos = events[type].keys.indexOf(fn);
|
2042
|
+
if (pos == -1) return this;
|
2043
|
+
events[type].keys.splice(pos, 1);
|
2044
|
+
var value = events[type].values.splice(pos, 1)[0];
|
2045
|
+
var custom = Element.Events.get(type);
|
2046
|
+
if (custom){
|
2047
|
+
if (custom.onRemove) custom.onRemove.call(this, fn);
|
2048
|
+
type = custom.base || type;
|
2049
|
+
}
|
2050
|
+
return (Element.NativeEvents[type]) ? this.removeListener(type, value) : this;
|
2051
|
+
},
|
2052
|
+
|
2053
|
+
addEvents: function(events){
|
2054
|
+
for (var event in events) this.addEvent(event, events[event]);
|
2055
|
+
return this;
|
2056
|
+
},
|
2057
|
+
|
2058
|
+
removeEvents: function(events){
|
2059
|
+
var type;
|
2060
|
+
if ($type(events) == 'object'){
|
2061
|
+
for (type in events) this.removeEvent(type, events[type]);
|
2062
|
+
return this;
|
2063
|
+
}
|
2064
|
+
var attached = this.retrieve('events');
|
2065
|
+
if (!attached) return this;
|
2066
|
+
if (!events){
|
2067
|
+
for (type in attached) this.removeEvents(type);
|
2068
|
+
this.eliminate('events');
|
2069
|
+
} else if (attached[events]){
|
2070
|
+
while (attached[events].keys[0]) this.removeEvent(events, attached[events].keys[0]);
|
2071
|
+
attached[events] = null;
|
2072
|
+
}
|
2073
|
+
return this;
|
2074
|
+
},
|
2075
|
+
|
2076
|
+
fireEvent: function(type, args, delay){
|
2077
|
+
var events = this.retrieve('events');
|
2078
|
+
if (!events || !events[type]) return this;
|
2079
|
+
events[type].keys.each(function(fn){
|
2080
|
+
fn.create({'bind': this, 'delay': delay, 'arguments': args})();
|
2081
|
+
}, this);
|
2082
|
+
return this;
|
2083
|
+
},
|
2084
|
+
|
2085
|
+
cloneEvents: function(from, type){
|
2086
|
+
from = document.id(from);
|
2087
|
+
var fevents = from.retrieve('events');
|
2088
|
+
if (!fevents) return this;
|
2089
|
+
if (!type){
|
2090
|
+
for (var evType in fevents) this.cloneEvents(from, evType);
|
2091
|
+
} else if (fevents[type]){
|
2092
|
+
fevents[type].keys.each(function(fn){
|
2093
|
+
this.addEvent(type, fn);
|
2094
|
+
}, this);
|
2095
|
+
}
|
2096
|
+
return this;
|
2097
|
+
}
|
2098
|
+
|
2099
|
+
});
|
2100
|
+
|
2101
|
+
Element.NativeEvents = {
|
2102
|
+
click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons
|
2103
|
+
mousewheel: 2, DOMMouseScroll: 2, //mouse wheel
|
2104
|
+
mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement
|
2105
|
+
keydown: 2, keypress: 2, keyup: 2, //keyboard
|
2106
|
+
focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, //form elements
|
2107
|
+
load: 1, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window
|
2108
|
+
error: 1, abort: 1, scroll: 1 //misc
|
2109
|
+
};
|
2110
|
+
|
2111
|
+
(function(){
|
2112
|
+
|
2113
|
+
var $check = function(event){
|
2114
|
+
var related = event.relatedTarget;
|
2115
|
+
if (related == undefined) return true;
|
2116
|
+
if (related === false) return false;
|
2117
|
+
return ($type(this) != 'document' && related != this && related.prefix != 'xul' && !this.hasChild(related));
|
2118
|
+
};
|
2119
|
+
|
2120
|
+
Element.Events = new Hash({
|
2121
|
+
|
2122
|
+
mouseenter: {
|
2123
|
+
base: 'mouseover',
|
2124
|
+
condition: $check
|
2125
|
+
},
|
2126
|
+
|
2127
|
+
mouseleave: {
|
2128
|
+
base: 'mouseout',
|
2129
|
+
condition: $check
|
2130
|
+
},
|
2131
|
+
|
2132
|
+
mousewheel: {
|
2133
|
+
base: (Browser.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel'
|
2134
|
+
}
|
2135
|
+
|
2136
|
+
});
|
2137
|
+
|
2138
|
+
})();
|
2139
|
+
|
2140
|
+
|
2141
|
+
/*
|
2142
|
+
Script: Element.Style.js
|
2143
|
+
Contains methods for interacting with the styles of Elements in a fashionable way.
|
2144
|
+
|
2145
|
+
License:
|
2146
|
+
MIT-style license.
|
2147
|
+
*/
|
2148
|
+
|
2149
|
+
Element.Properties.styles = {set: function(styles){
|
2150
|
+
this.setStyles(styles);
|
2151
|
+
}};
|
2152
|
+
|
2153
|
+
Element.Properties.opacity = {
|
2154
|
+
|
2155
|
+
set: function(opacity, novisibility){
|
2156
|
+
if (!novisibility){
|
2157
|
+
if (opacity == 0){
|
2158
|
+
if (this.style.visibility != 'hidden') this.style.visibility = 'hidden';
|
2159
|
+
} else {
|
2160
|
+
if (this.style.visibility != 'visible') this.style.visibility = 'visible';
|
2161
|
+
}
|
2162
|
+
}
|
2163
|
+
if (!this.currentStyle || !this.currentStyle.hasLayout) this.style.zoom = 1;
|
2164
|
+
if (Browser.Engine.trident) this.style.filter = (opacity == 1) ? '' : 'alpha(opacity=' + opacity * 100 + ')';
|
2165
|
+
this.style.opacity = opacity;
|
2166
|
+
this.store('opacity', opacity);
|
2167
|
+
},
|
2168
|
+
|
2169
|
+
get: function(){
|
2170
|
+
return this.retrieve('opacity', 1);
|
2171
|
+
}
|
2172
|
+
|
2173
|
+
};
|
2174
|
+
|
2175
|
+
Element.implement({
|
2176
|
+
|
2177
|
+
setOpacity: function(value){
|
2178
|
+
return this.set('opacity', value, true);
|
2179
|
+
},
|
2180
|
+
|
2181
|
+
getOpacity: function(){
|
2182
|
+
return this.get('opacity');
|
2183
|
+
},
|
2184
|
+
|
2185
|
+
setStyle: function(property, value){
|
2186
|
+
switch (property){
|
2187
|
+
case 'opacity': return this.set('opacity', parseFloat(value));
|
2188
|
+
case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat';
|
2189
|
+
}
|
2190
|
+
property = property.camelCase();
|
2191
|
+
if ($type(value) != 'string'){
|
2192
|
+
var map = (Element.Styles.get(property) || '@').split(' ');
|
2193
|
+
value = $splat(value).map(function(val, i){
|
2194
|
+
if (!map[i]) return '';
|
2195
|
+
return ($type(val) == 'number') ? map[i].replace('@', Math.round(val)) : val;
|
2196
|
+
}).join(' ');
|
2197
|
+
} else if (value == String(Number(value))){
|
2198
|
+
value = Math.round(value);
|
2199
|
+
}
|
2200
|
+
this.style[property] = value;
|
2201
|
+
return this;
|
2202
|
+
},
|
2203
|
+
|
2204
|
+
getStyle: function(property){
|
2205
|
+
switch (property){
|
2206
|
+
case 'opacity': return this.get('opacity');
|
2207
|
+
case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat';
|
2208
|
+
}
|
2209
|
+
property = property.camelCase();
|
2210
|
+
var result = this.style[property];
|
2211
|
+
if (!$chk(result)){
|
2212
|
+
result = [];
|
2213
|
+
for (var style in Element.ShortStyles){
|
2214
|
+
if (property != style) continue;
|
2215
|
+
for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s));
|
2216
|
+
return result.join(' ');
|
2217
|
+
}
|
2218
|
+
result = this.getComputedStyle(property);
|
2219
|
+
}
|
2220
|
+
if (result){
|
2221
|
+
result = String(result);
|
2222
|
+
var color = result.match(/rgba?\([\d\s,]+\)/);
|
2223
|
+
if (color) result = result.replace(color[0], color[0].rgbToHex());
|
2224
|
+
}
|
2225
|
+
if (Browser.Engine.presto || (Browser.Engine.trident && !$chk(parseInt(result, 10)))){
|
2226
|
+
if (property.test(/^(height|width)$/)){
|
2227
|
+
var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0;
|
2228
|
+
values.each(function(value){
|
2229
|
+
size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt();
|
2230
|
+
}, this);
|
2231
|
+
return this['offset' + property.capitalize()] - size + 'px';
|
2232
|
+
}
|
2233
|
+
if ((Browser.Engine.presto) && String(result).test('px')) return result;
|
2234
|
+
if (property.test(/(border(.+)Width|margin|padding)/)) return '0px';
|
2235
|
+
}
|
2236
|
+
return result;
|
2237
|
+
},
|
2238
|
+
|
2239
|
+
setStyles: function(styles){
|
2240
|
+
for (var style in styles) this.setStyle(style, styles[style]);
|
2241
|
+
return this;
|
2242
|
+
},
|
2243
|
+
|
2244
|
+
getStyles: function(){
|
2245
|
+
var result = {};
|
2246
|
+
Array.flatten(arguments).each(function(key){
|
2247
|
+
result[key] = this.getStyle(key);
|
2248
|
+
}, this);
|
2249
|
+
return result;
|
2250
|
+
}
|
2251
|
+
|
2252
|
+
});
|
2253
|
+
|
2254
|
+
Element.Styles = new Hash({
|
2255
|
+
left: '@px', top: '@px', bottom: '@px', right: '@px',
|
2256
|
+
width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px',
|
2257
|
+
backgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px @px', color: 'rgb(@, @, @)',
|
2258
|
+
fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)',
|
2259
|
+
margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)',
|
2260
|
+
borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)',
|
2261
|
+
zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@'
|
2262
|
+
});
|
2263
|
+
|
2264
|
+
Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}};
|
2265
|
+
|
2266
|
+
['Top', 'Right', 'Bottom', 'Left'].each(function(direction){
|
2267
|
+
var Short = Element.ShortStyles;
|
2268
|
+
var All = Element.Styles;
|
2269
|
+
['margin', 'padding'].each(function(style){
|
2270
|
+
var sd = style + direction;
|
2271
|
+
Short[style][sd] = All[sd] = '@px';
|
2272
|
+
});
|
2273
|
+
var bd = 'border' + direction;
|
2274
|
+
Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)';
|
2275
|
+
var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color';
|
2276
|
+
Short[bd] = {};
|
2277
|
+
Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';
|
2278
|
+
Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';
|
2279
|
+
Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)';
|
2280
|
+
});
|
2281
|
+
|
2282
|
+
|
2283
|
+
/*
|
2284
|
+
Script: Element.Dimensions.js
|
2285
|
+
Contains methods to work with size, scroll, or positioning of Elements and the window object.
|
2286
|
+
|
2287
|
+
License:
|
2288
|
+
MIT-style license.
|
2289
|
+
|
2290
|
+
Credits:
|
2291
|
+
- Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html).
|
2292
|
+
- Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html).
|
2293
|
+
*/
|
2294
|
+
|
2295
|
+
(function(){
|
2296
|
+
|
2297
|
+
Element.implement({
|
2298
|
+
|
2299
|
+
scrollTo: function(x, y){
|
2300
|
+
if (isBody(this)){
|
2301
|
+
this.getWindow().scrollTo(x, y);
|
2302
|
+
} else {
|
2303
|
+
this.scrollLeft = x;
|
2304
|
+
this.scrollTop = y;
|
2305
|
+
}
|
2306
|
+
return this;
|
2307
|
+
},
|
2308
|
+
|
2309
|
+
getSize: function(){
|
2310
|
+
if (isBody(this)) return this.getWindow().getSize();
|
2311
|
+
return {x: this.offsetWidth, y: this.offsetHeight};
|
2312
|
+
},
|
2313
|
+
|
2314
|
+
getScrollSize: function(){
|
2315
|
+
if (isBody(this)) return this.getWindow().getScrollSize();
|
2316
|
+
return {x: this.scrollWidth, y: this.scrollHeight};
|
2317
|
+
},
|
2318
|
+
|
2319
|
+
getScroll: function(){
|
2320
|
+
if (isBody(this)) return this.getWindow().getScroll();
|
2321
|
+
return {x: this.scrollLeft, y: this.scrollTop};
|
2322
|
+
},
|
2323
|
+
|
2324
|
+
getScrolls: function(){
|
2325
|
+
var element = this, position = {x: 0, y: 0};
|
2326
|
+
while (element && !isBody(element)){
|
2327
|
+
position.x += element.scrollLeft;
|
2328
|
+
position.y += element.scrollTop;
|
2329
|
+
element = element.parentNode;
|
2330
|
+
}
|
2331
|
+
return position;
|
2332
|
+
},
|
2333
|
+
|
2334
|
+
getOffsetParent: function(){
|
2335
|
+
var element = this;
|
2336
|
+
if (isBody(element)) return null;
|
2337
|
+
if (!Browser.Engine.trident) return element.offsetParent;
|
2338
|
+
while ((element = element.parentNode) && !isBody(element)){
|
2339
|
+
if (styleString(element, 'position') != 'static') return element;
|
2340
|
+
}
|
2341
|
+
return null;
|
2342
|
+
},
|
2343
|
+
|
2344
|
+
getOffsets: function(){
|
2345
|
+
if (this.getBoundingClientRect){
|
2346
|
+
var bound = this.getBoundingClientRect(),
|
2347
|
+
html = document.id(this.getDocument().documentElement),
|
2348
|
+
scroll = html.getScroll(),
|
2349
|
+
isFixed = (styleString(this, 'position') == 'fixed');
|
2350
|
+
return {
|
2351
|
+
x: parseInt(bound.left, 10) + ((isFixed) ? 0 : scroll.x) - html.clientLeft,
|
2352
|
+
y: parseInt(bound.top, 10) + ((isFixed) ? 0 : scroll.y) - html.clientTop
|
2353
|
+
};
|
2354
|
+
}
|
2355
|
+
|
2356
|
+
var element = this, position = {x: 0, y: 0};
|
2357
|
+
if (isBody(this)) return position;
|
2358
|
+
|
2359
|
+
while (element && !isBody(element)){
|
2360
|
+
position.x += element.offsetLeft;
|
2361
|
+
position.y += element.offsetTop;
|
2362
|
+
|
2363
|
+
if (Browser.Engine.gecko){
|
2364
|
+
if (!borderBox(element)){
|
2365
|
+
position.x += leftBorder(element);
|
2366
|
+
position.y += topBorder(element);
|
2367
|
+
}
|
2368
|
+
var parent = element.parentNode;
|
2369
|
+
if (parent && styleString(parent, 'overflow') != 'visible'){
|
2370
|
+
position.x += leftBorder(parent);
|
2371
|
+
position.y += topBorder(parent);
|
2372
|
+
}
|
2373
|
+
} else if (element != this && Browser.Engine.webkit){
|
2374
|
+
position.x += leftBorder(element);
|
2375
|
+
position.y += topBorder(element);
|
2376
|
+
}
|
2377
|
+
|
2378
|
+
element = element.offsetParent;
|
2379
|
+
}
|
2380
|
+
if (Browser.Engine.gecko && !borderBox(this)){
|
2381
|
+
position.x -= leftBorder(this);
|
2382
|
+
position.y -= topBorder(this);
|
2383
|
+
}
|
2384
|
+
return position;
|
2385
|
+
},
|
2386
|
+
|
2387
|
+
getPosition: function(relative){
|
2388
|
+
if (isBody(this)) return {x: 0, y: 0};
|
2389
|
+
var offset = this.getOffsets(), scroll = this.getScrolls();
|
2390
|
+
var position = {x: offset.x - scroll.x, y: offset.y - scroll.y};
|
2391
|
+
var relativePosition = (relative && (relative = document.id(relative))) ? relative.getPosition() : {x: 0, y: 0};
|
2392
|
+
return {x: position.x - relativePosition.x, y: position.y - relativePosition.y};
|
2393
|
+
},
|
2394
|
+
|
2395
|
+
getCoordinates: function(element){
|
2396
|
+
if (isBody(this)) return this.getWindow().getCoordinates();
|
2397
|
+
var position = this.getPosition(element), size = this.getSize();
|
2398
|
+
var obj = {left: position.x, top: position.y, width: size.x, height: size.y};
|
2399
|
+
obj.right = obj.left + obj.width;
|
2400
|
+
obj.bottom = obj.top + obj.height;
|
2401
|
+
return obj;
|
2402
|
+
},
|
2403
|
+
|
2404
|
+
computePosition: function(obj){
|
2405
|
+
return {left: obj.x - styleNumber(this, 'margin-left'), top: obj.y - styleNumber(this, 'margin-top')};
|
2406
|
+
},
|
2407
|
+
|
2408
|
+
setPosition: function(obj){
|
2409
|
+
return this.setStyles(this.computePosition(obj));
|
2410
|
+
}
|
2411
|
+
|
2412
|
+
});
|
2413
|
+
|
2414
|
+
|
2415
|
+
Native.implement([Document, Window], {
|
2416
|
+
|
2417
|
+
getSize: function(){
|
2418
|
+
if (Browser.Engine.presto || Browser.Engine.webkit) {
|
2419
|
+
var win = this.getWindow();
|
2420
|
+
return {x: win.innerWidth, y: win.innerHeight};
|
2421
|
+
}
|
2422
|
+
var doc = getCompatElement(this);
|
2423
|
+
return {x: doc.clientWidth, y: doc.clientHeight};
|
2424
|
+
},
|
2425
|
+
|
2426
|
+
getScroll: function(){
|
2427
|
+
var win = this.getWindow(), doc = getCompatElement(this);
|
2428
|
+
return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};
|
2429
|
+
},
|
2430
|
+
|
2431
|
+
getScrollSize: function(){
|
2432
|
+
var doc = getCompatElement(this), min = this.getSize();
|
2433
|
+
return {x: Math.max(doc.scrollWidth, min.x), y: Math.max(doc.scrollHeight, min.y)};
|
2434
|
+
},
|
2435
|
+
|
2436
|
+
getPosition: function(){
|
2437
|
+
return {x: 0, y: 0};
|
2438
|
+
},
|
2439
|
+
|
2440
|
+
getCoordinates: function(){
|
2441
|
+
var size = this.getSize();
|
2442
|
+
return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x};
|
2443
|
+
}
|
2444
|
+
|
2445
|
+
});
|
2446
|
+
|
2447
|
+
// private methods
|
2448
|
+
|
2449
|
+
var styleString = Element.getComputedStyle;
|
2450
|
+
|
2451
|
+
function styleNumber(element, style){
|
2452
|
+
return styleString(element, style).toInt() || 0;
|
2453
|
+
};
|
2454
|
+
|
2455
|
+
function borderBox(element){
|
2456
|
+
return styleString(element, '-moz-box-sizing') == 'border-box';
|
2457
|
+
};
|
2458
|
+
|
2459
|
+
function topBorder(element){
|
2460
|
+
return styleNumber(element, 'border-top-width');
|
2461
|
+
};
|
2462
|
+
|
2463
|
+
function leftBorder(element){
|
2464
|
+
return styleNumber(element, 'border-left-width');
|
2465
|
+
};
|
2466
|
+
|
2467
|
+
function isBody(element){
|
2468
|
+
return (/^(?:body|html)$/i).test(element.tagName);
|
2469
|
+
};
|
2470
|
+
|
2471
|
+
function getCompatElement(element){
|
2472
|
+
var doc = element.getDocument();
|
2473
|
+
return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
|
2474
|
+
};
|
2475
|
+
|
2476
|
+
})();
|
2477
|
+
|
2478
|
+
//aliases
|
2479
|
+
Element.alias('setPosition', 'position'); //compatability
|
2480
|
+
|
2481
|
+
Native.implement([Window, Document, Element], {
|
2482
|
+
|
2483
|
+
getHeight: function(){
|
2484
|
+
return this.getSize().y;
|
2485
|
+
},
|
2486
|
+
|
2487
|
+
getWidth: function(){
|
2488
|
+
return this.getSize().x;
|
2489
|
+
},
|
2490
|
+
|
2491
|
+
getScrollTop: function(){
|
2492
|
+
return this.getScroll().y;
|
2493
|
+
},
|
2494
|
+
|
2495
|
+
getScrollLeft: function(){
|
2496
|
+
return this.getScroll().x;
|
2497
|
+
},
|
2498
|
+
|
2499
|
+
getScrollHeight: function(){
|
2500
|
+
return this.getScrollSize().y;
|
2501
|
+
},
|
2502
|
+
|
2503
|
+
getScrollWidth: function(){
|
2504
|
+
return this.getScrollSize().x;
|
2505
|
+
},
|
2506
|
+
|
2507
|
+
getTop: function(){
|
2508
|
+
return this.getPosition().y;
|
2509
|
+
},
|
2510
|
+
|
2511
|
+
getLeft: function(){
|
2512
|
+
return this.getPosition().x;
|
2513
|
+
}
|
2514
|
+
|
2515
|
+
});
|
2516
|
+
|
2517
|
+
|
2518
|
+
/*
|
2519
|
+
Script: Selectors.js
|
2520
|
+
Adds advanced CSS Querying capabilities for targeting elements. Also includes pseudoselectors support.
|
2521
|
+
|
2522
|
+
License:
|
2523
|
+
MIT-style license.
|
2524
|
+
*/
|
2525
|
+
|
2526
|
+
Native.implement([Document, Element], {
|
2527
|
+
|
2528
|
+
getElements: function(expression, nocash){
|
2529
|
+
expression = expression.split(',');
|
2530
|
+
var items, local = {};
|
2531
|
+
for (var i = 0, l = expression.length; i < l; i++){
|
2532
|
+
var selector = expression[i], elements = Selectors.Utils.search(this, selector, local);
|
2533
|
+
if (i != 0 && elements.item) elements = $A(elements);
|
2534
|
+
items = (i == 0) ? elements : (items.item) ? $A(items).concat(elements) : items.concat(elements);
|
2535
|
+
}
|
2536
|
+
return new Elements(items, {ddup: (expression.length > 1), cash: !nocash});
|
2537
|
+
}
|
2538
|
+
|
2539
|
+
});
|
2540
|
+
|
2541
|
+
Element.implement({
|
2542
|
+
|
2543
|
+
match: function(selector){
|
2544
|
+
if (!selector || (selector == this)) return true;
|
2545
|
+
var tagid = Selectors.Utils.parseTagAndID(selector);
|
2546
|
+
var tag = tagid[0], id = tagid[1];
|
2547
|
+
if (!Selectors.Filters.byID(this, id) || !Selectors.Filters.byTag(this, tag)) return false;
|
2548
|
+
var parsed = Selectors.Utils.parseSelector(selector);
|
2549
|
+
return (parsed) ? Selectors.Utils.filter(this, parsed, {}) : true;
|
2550
|
+
}
|
2551
|
+
|
2552
|
+
});
|
2553
|
+
|
2554
|
+
var Selectors = {Cache: {nth: {}, parsed: {}}};
|
2555
|
+
|
2556
|
+
Selectors.RegExps = {
|
2557
|
+
id: (/#([\w-]+)/),
|
2558
|
+
tag: (/^(\w+|\*)/),
|
2559
|
+
quick: (/^(\w+|\*)$/),
|
2560
|
+
splitter: (/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g),
|
2561
|
+
combined: (/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)(["']?)([^\4]*?)\4)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g)
|
2562
|
+
};
|
2563
|
+
|
2564
|
+
Selectors.Utils = {
|
2565
|
+
|
2566
|
+
chk: function(item, uniques){
|
2567
|
+
if (!uniques) return true;
|
2568
|
+
var uid = $uid(item);
|
2569
|
+
if (!uniques[uid]) return uniques[uid] = true;
|
2570
|
+
return false;
|
2571
|
+
},
|
2572
|
+
|
2573
|
+
parseNthArgument: function(argument){
|
2574
|
+
if (Selectors.Cache.nth[argument]) return Selectors.Cache.nth[argument];
|
2575
|
+
var parsed = argument.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/);
|
2576
|
+
if (!parsed) return false;
|
2577
|
+
var inta = parseInt(parsed[1], 10);
|
2578
|
+
var a = (inta || inta === 0) ? inta : 1;
|
2579
|
+
var special = parsed[2] || false;
|
2580
|
+
var b = parseInt(parsed[3], 10) || 0;
|
2581
|
+
if (a != 0){
|
2582
|
+
b--;
|
2583
|
+
while (b < 1) b += a;
|
2584
|
+
while (b >= a) b -= a;
|
2585
|
+
} else {
|
2586
|
+
a = b;
|
2587
|
+
special = 'index';
|
2588
|
+
}
|
2589
|
+
switch (special){
|
2590
|
+
case 'n': parsed = {a: a, b: b, special: 'n'}; break;
|
2591
|
+
case 'odd': parsed = {a: 2, b: 0, special: 'n'}; break;
|
2592
|
+
case 'even': parsed = {a: 2, b: 1, special: 'n'}; break;
|
2593
|
+
case 'first': parsed = {a: 0, special: 'index'}; break;
|
2594
|
+
case 'last': parsed = {special: 'last-child'}; break;
|
2595
|
+
case 'only': parsed = {special: 'only-child'}; break;
|
2596
|
+
default: parsed = {a: (a - 1), special: 'index'};
|
2597
|
+
}
|
2598
|
+
|
2599
|
+
return Selectors.Cache.nth[argument] = parsed;
|
2600
|
+
},
|
2601
|
+
|
2602
|
+
parseSelector: function(selector){
|
2603
|
+
if (Selectors.Cache.parsed[selector]) return Selectors.Cache.parsed[selector];
|
2604
|
+
var m, parsed = {classes: [], pseudos: [], attributes: []};
|
2605
|
+
while ((m = Selectors.RegExps.combined.exec(selector))){
|
2606
|
+
var cn = m[1], an = m[2], ao = m[3], av = m[5], pn = m[6], pa = m[7];
|
2607
|
+
if (cn){
|
2608
|
+
parsed.classes.push(cn);
|
2609
|
+
} else if (pn){
|
2610
|
+
var parser = Selectors.Pseudo.get(pn);
|
2611
|
+
if (parser) parsed.pseudos.push({parser: parser, argument: pa});
|
2612
|
+
else parsed.attributes.push({name: pn, operator: '=', value: pa});
|
2613
|
+
} else if (an){
|
2614
|
+
parsed.attributes.push({name: an, operator: ao, value: av});
|
2615
|
+
}
|
2616
|
+
}
|
2617
|
+
if (!parsed.classes.length) delete parsed.classes;
|
2618
|
+
if (!parsed.attributes.length) delete parsed.attributes;
|
2619
|
+
if (!parsed.pseudos.length) delete parsed.pseudos;
|
2620
|
+
if (!parsed.classes && !parsed.attributes && !parsed.pseudos) parsed = null;
|
2621
|
+
return Selectors.Cache.parsed[selector] = parsed;
|
2622
|
+
},
|
2623
|
+
|
2624
|
+
parseTagAndID: function(selector){
|
2625
|
+
var tag = selector.match(Selectors.RegExps.tag);
|
2626
|
+
var id = selector.match(Selectors.RegExps.id);
|
2627
|
+
return [(tag) ? tag[1] : '*', (id) ? id[1] : false];
|
2628
|
+
},
|
2629
|
+
|
2630
|
+
filter: function(item, parsed, local){
|
2631
|
+
var i;
|
2632
|
+
if (parsed.classes){
|
2633
|
+
for (i = parsed.classes.length; i--; i){
|
2634
|
+
var cn = parsed.classes[i];
|
2635
|
+
if (!Selectors.Filters.byClass(item, cn)) return false;
|
2636
|
+
}
|
2637
|
+
}
|
2638
|
+
if (parsed.attributes){
|
2639
|
+
for (i = parsed.attributes.length; i--; i){
|
2640
|
+
var att = parsed.attributes[i];
|
2641
|
+
if (!Selectors.Filters.byAttribute(item, att.name, att.operator, att.value)) return false;
|
2642
|
+
}
|
2643
|
+
}
|
2644
|
+
if (parsed.pseudos){
|
2645
|
+
for (i = parsed.pseudos.length; i--; i){
|
2646
|
+
var psd = parsed.pseudos[i];
|
2647
|
+
if (!Selectors.Filters.byPseudo(item, psd.parser, psd.argument, local)) return false;
|
2648
|
+
}
|
2649
|
+
}
|
2650
|
+
return true;
|
2651
|
+
},
|
2652
|
+
|
2653
|
+
getByTagAndID: function(ctx, tag, id){
|
2654
|
+
if (id){
|
2655
|
+
var item = (ctx.getElementById) ? ctx.getElementById(id, true) : Element.getElementById(ctx, id, true);
|
2656
|
+
return (item && Selectors.Filters.byTag(item, tag)) ? [item] : [];
|
2657
|
+
} else {
|
2658
|
+
return ctx.getElementsByTagName(tag);
|
2659
|
+
}
|
2660
|
+
},
|
2661
|
+
|
2662
|
+
search: function(self, expression, local){
|
2663
|
+
var splitters = [];
|
2664
|
+
|
2665
|
+
var selectors = expression.trim().replace(Selectors.RegExps.splitter, function(m0, m1, m2){
|
2666
|
+
splitters.push(m1);
|
2667
|
+
return ':)' + m2;
|
2668
|
+
}).split(':)');
|
2669
|
+
|
2670
|
+
var items, filtered, item;
|
2671
|
+
|
2672
|
+
for (var i = 0, l = selectors.length; i < l; i++){
|
2673
|
+
|
2674
|
+
var selector = selectors[i];
|
2675
|
+
|
2676
|
+
if (i == 0 && Selectors.RegExps.quick.test(selector)){
|
2677
|
+
items = self.getElementsByTagName(selector);
|
2678
|
+
continue;
|
2679
|
+
}
|
2680
|
+
|
2681
|
+
var splitter = splitters[i - 1];
|
2682
|
+
|
2683
|
+
var tagid = Selectors.Utils.parseTagAndID(selector);
|
2684
|
+
var tag = tagid[0], id = tagid[1];
|
2685
|
+
|
2686
|
+
if (i == 0){
|
2687
|
+
items = Selectors.Utils.getByTagAndID(self, tag, id);
|
2688
|
+
} else {
|
2689
|
+
var uniques = {}, found = [];
|
2690
|
+
for (var j = 0, k = items.length; j < k; j++) found = Selectors.Getters[splitter](found, items[j], tag, id, uniques);
|
2691
|
+
items = found;
|
2692
|
+
}
|
2693
|
+
|
2694
|
+
var parsed = Selectors.Utils.parseSelector(selector);
|
2695
|
+
|
2696
|
+
if (parsed){
|
2697
|
+
filtered = [];
|
2698
|
+
for (var m = 0, n = items.length; m < n; m++){
|
2699
|
+
item = items[m];
|
2700
|
+
if (Selectors.Utils.filter(item, parsed, local)) filtered.push(item);
|
2701
|
+
}
|
2702
|
+
items = filtered;
|
2703
|
+
}
|
2704
|
+
|
2705
|
+
}
|
2706
|
+
|
2707
|
+
return items;
|
2708
|
+
|
2709
|
+
}
|
2710
|
+
|
2711
|
+
};
|
2712
|
+
|
2713
|
+
Selectors.Getters = {
|
2714
|
+
|
2715
|
+
' ': function(found, self, tag, id, uniques){
|
2716
|
+
var items = Selectors.Utils.getByTagAndID(self, tag, id);
|
2717
|
+
for (var i = 0, l = items.length; i < l; i++){
|
2718
|
+
var item = items[i];
|
2719
|
+
if (Selectors.Utils.chk(item, uniques)) found.push(item);
|
2720
|
+
}
|
2721
|
+
return found;
|
2722
|
+
},
|
2723
|
+
|
2724
|
+
'>': function(found, self, tag, id, uniques){
|
2725
|
+
var children = Selectors.Utils.getByTagAndID(self, tag, id);
|
2726
|
+
for (var i = 0, l = children.length; i < l; i++){
|
2727
|
+
var child = children[i];
|
2728
|
+
if (child.parentNode == self && Selectors.Utils.chk(child, uniques)) found.push(child);
|
2729
|
+
}
|
2730
|
+
return found;
|
2731
|
+
},
|
2732
|
+
|
2733
|
+
'+': function(found, self, tag, id, uniques){
|
2734
|
+
while ((self = self.nextSibling)){
|
2735
|
+
if (self.nodeType == 1){
|
2736
|
+
if (Selectors.Utils.chk(self, uniques) && Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id)) found.push(self);
|
2737
|
+
break;
|
2738
|
+
}
|
2739
|
+
}
|
2740
|
+
return found;
|
2741
|
+
},
|
2742
|
+
|
2743
|
+
'~': function(found, self, tag, id, uniques){
|
2744
|
+
while ((self = self.nextSibling)){
|
2745
|
+
if (self.nodeType == 1){
|
2746
|
+
if (!Selectors.Utils.chk(self, uniques)) break;
|
2747
|
+
if (Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id)) found.push(self);
|
2748
|
+
}
|
2749
|
+
}
|
2750
|
+
return found;
|
2751
|
+
}
|
2752
|
+
|
2753
|
+
};
|
2754
|
+
|
2755
|
+
Selectors.Filters = {
|
2756
|
+
|
2757
|
+
byTag: function(self, tag){
|
2758
|
+
return (tag == '*' || (self.tagName && self.tagName.toLowerCase() == tag));
|
2759
|
+
},
|
2760
|
+
|
2761
|
+
byID: function(self, id){
|
2762
|
+
return (!id || (self.id && self.id == id));
|
2763
|
+
},
|
2764
|
+
|
2765
|
+
byClass: function(self, klass){
|
2766
|
+
return (self.className && self.className.contains(klass, ' '));
|
2767
|
+
},
|
2768
|
+
|
2769
|
+
byPseudo: function(self, parser, argument, local){
|
2770
|
+
return parser.call(self, argument, local);
|
2771
|
+
},
|
2772
|
+
|
2773
|
+
byAttribute: function(self, name, operator, value){
|
2774
|
+
var result = Element.prototype.getProperty.call(self, name);
|
2775
|
+
if (!result) return (operator == '!=');
|
2776
|
+
if (!operator || value == undefined) return true;
|
2777
|
+
switch (operator){
|
2778
|
+
case '=': return (result == value);
|
2779
|
+
case '*=': return (result.contains(value));
|
2780
|
+
case '^=': return (result.substr(0, value.length) == value);
|
2781
|
+
case '$=': return (result.substr(result.length - value.length) == value);
|
2782
|
+
case '!=': return (result != value);
|
2783
|
+
case '~=': return result.contains(value, ' ');
|
2784
|
+
case '|=': return result.contains(value, '-');
|
2785
|
+
}
|
2786
|
+
return false;
|
2787
|
+
}
|
2788
|
+
|
2789
|
+
};
|
2790
|
+
|
2791
|
+
Selectors.Pseudo = new Hash({
|
2792
|
+
|
2793
|
+
// w3c pseudo selectors
|
2794
|
+
|
2795
|
+
checked: function(){
|
2796
|
+
return this.checked;
|
2797
|
+
},
|
2798
|
+
|
2799
|
+
empty: function(){
|
2800
|
+
return !(this.innerText || this.textContent || '').length;
|
2801
|
+
},
|
2802
|
+
|
2803
|
+
not: function(selector){
|
2804
|
+
return !Element.match(this, selector);
|
2805
|
+
},
|
2806
|
+
|
2807
|
+
contains: function(text){
|
2808
|
+
return (this.innerText || this.textContent || '').contains(text);
|
2809
|
+
},
|
2810
|
+
|
2811
|
+
'first-child': function(){
|
2812
|
+
return Selectors.Pseudo.index.call(this, 0);
|
2813
|
+
},
|
2814
|
+
|
2815
|
+
'last-child': function(){
|
2816
|
+
var element = this;
|
2817
|
+
while ((element = element.nextSibling)){
|
2818
|
+
if (element.nodeType == 1) return false;
|
2819
|
+
}
|
2820
|
+
return true;
|
2821
|
+
},
|
2822
|
+
|
2823
|
+
'only-child': function(){
|
2824
|
+
var prev = this;
|
2825
|
+
while ((prev = prev.previousSibling)){
|
2826
|
+
if (prev.nodeType == 1) return false;
|
2827
|
+
}
|
2828
|
+
var next = this;
|
2829
|
+
while ((next = next.nextSibling)){
|
2830
|
+
if (next.nodeType == 1) return false;
|
2831
|
+
}
|
2832
|
+
return true;
|
2833
|
+
},
|
2834
|
+
|
2835
|
+
'nth-child': function(argument, local){
|
2836
|
+
argument = (argument == undefined) ? 'n' : argument;
|
2837
|
+
var parsed = Selectors.Utils.parseNthArgument(argument);
|
2838
|
+
if (parsed.special != 'n') return Selectors.Pseudo[parsed.special].call(this, parsed.a, local);
|
2839
|
+
var count = 0;
|
2840
|
+
local.positions = local.positions || {};
|
2841
|
+
var uid = $uid(this);
|
2842
|
+
if (!local.positions[uid]){
|
2843
|
+
var self = this;
|
2844
|
+
while ((self = self.previousSibling)){
|
2845
|
+
if (self.nodeType != 1) continue;
|
2846
|
+
count ++;
|
2847
|
+
var position = local.positions[$uid(self)];
|
2848
|
+
if (position != undefined){
|
2849
|
+
count = position + count;
|
2850
|
+
break;
|
2851
|
+
}
|
2852
|
+
}
|
2853
|
+
local.positions[uid] = count;
|
2854
|
+
}
|
2855
|
+
return (local.positions[uid] % parsed.a == parsed.b);
|
2856
|
+
},
|
2857
|
+
|
2858
|
+
// custom pseudo selectors
|
2859
|
+
|
2860
|
+
index: function(index){
|
2861
|
+
var element = this, count = 0;
|
2862
|
+
while ((element = element.previousSibling)){
|
2863
|
+
if (element.nodeType == 1 && ++count > index) return false;
|
2864
|
+
}
|
2865
|
+
return (count == index);
|
2866
|
+
},
|
2867
|
+
|
2868
|
+
even: function(argument, local){
|
2869
|
+
return Selectors.Pseudo['nth-child'].call(this, '2n+1', local);
|
2870
|
+
},
|
2871
|
+
|
2872
|
+
odd: function(argument, local){
|
2873
|
+
return Selectors.Pseudo['nth-child'].call(this, '2n', local);
|
2874
|
+
},
|
2875
|
+
|
2876
|
+
selected: function(){
|
2877
|
+
return this.selected;
|
2878
|
+
},
|
2879
|
+
|
2880
|
+
enabled: function(){
|
2881
|
+
return (this.disabled === false);
|
2882
|
+
}
|
2883
|
+
|
2884
|
+
});
|
2885
|
+
|
2886
|
+
|
2887
|
+
/*
|
2888
|
+
Script: Domready.js
|
2889
|
+
Contains the domready custom event.
|
2890
|
+
|
2891
|
+
License:
|
2892
|
+
MIT-style license.
|
2893
|
+
*/
|
2894
|
+
|
2895
|
+
Element.Events.domready = {
|
2896
|
+
|
2897
|
+
onAdd: function(fn){
|
2898
|
+
if (Browser.loaded) fn.call(this);
|
2899
|
+
}
|
2900
|
+
|
2901
|
+
};
|
2902
|
+
|
2903
|
+
(function(){
|
2904
|
+
|
2905
|
+
var domready = function(){
|
2906
|
+
if (Browser.loaded) return;
|
2907
|
+
Browser.loaded = true;
|
2908
|
+
window.fireEvent('domready');
|
2909
|
+
document.fireEvent('domready');
|
2910
|
+
};
|
2911
|
+
|
2912
|
+
if (Browser.Engine.trident){
|
2913
|
+
var temp = document.createElement('div');
|
2914
|
+
(function(){
|
2915
|
+
($try(function(){
|
2916
|
+
temp.doScroll(); // Technique by Diego Perini
|
2917
|
+
return document.id(temp).inject(document.body).set('html', 'temp').dispose();
|
2918
|
+
})) ? domready() : arguments.callee.delay(50);
|
2919
|
+
})();
|
2920
|
+
} else if (Browser.Engine.webkit && Browser.Engine.version < 525){
|
2921
|
+
(function(){
|
2922
|
+
(['loaded', 'complete'].contains(document.readyState)) ? domready() : arguments.callee.delay(50);
|
2923
|
+
})();
|
2924
|
+
} else {
|
2925
|
+
window.addEvent('load', domready);
|
2926
|
+
document.addEvent('DOMContentLoaded', domready);
|
2927
|
+
}
|
2928
|
+
|
2929
|
+
})();
|
2930
|
+
|
2931
|
+
|
2932
|
+
/*
|
2933
|
+
Script: JSON.js
|
2934
|
+
JSON encoder and decoder.
|
2935
|
+
|
2936
|
+
License:
|
2937
|
+
MIT-style license.
|
2938
|
+
|
2939
|
+
See Also:
|
2940
|
+
<http://www.json.org/>
|
2941
|
+
*/
|
2942
|
+
|
2943
|
+
var JSON = new Hash({
|
2944
|
+
|
2945
|
+
$specialChars: {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'},
|
2946
|
+
|
2947
|
+
$replaceChars: function(chr){
|
2948
|
+
return JSON.$specialChars[chr] || '\\u00' + Math.floor(chr.charCodeAt() / 16).toString(16) + (chr.charCodeAt() % 16).toString(16);
|
2949
|
+
},
|
2950
|
+
|
2951
|
+
encode: function(obj){
|
2952
|
+
switch ($type(obj)){
|
2953
|
+
case 'string':
|
2954
|
+
return '"' + obj.replace(/[\x00-\x1f\\"]/g, JSON.$replaceChars) + '"';
|
2955
|
+
case 'array':
|
2956
|
+
return '[' + String(obj.map(JSON.encode).clean()) + ']';
|
2957
|
+
case 'object': case 'hash':
|
2958
|
+
var string = [];
|
2959
|
+
Hash.each(obj, function(value, key){
|
2960
|
+
var json = JSON.encode(value);
|
2961
|
+
if (json) string.push(JSON.encode(key) + ':' + json);
|
2962
|
+
});
|
2963
|
+
return '{' + string + '}';
|
2964
|
+
case 'number': case 'boolean': return String(obj);
|
2965
|
+
case false: return 'null';
|
2966
|
+
}
|
2967
|
+
return null;
|
2968
|
+
},
|
2969
|
+
|
2970
|
+
decode: function(string, secure){
|
2971
|
+
if ($type(string) != 'string' || !string.length) return null;
|
2972
|
+
if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null;
|
2973
|
+
return eval('(' + string + ')');
|
2974
|
+
}
|
2975
|
+
|
2976
|
+
});
|
2977
|
+
|
2978
|
+
Native.implement([Hash, Array, String, Number], {
|
2979
|
+
|
2980
|
+
toJSON: function(){
|
2981
|
+
return JSON.encode(this);
|
2982
|
+
}
|
2983
|
+
|
2984
|
+
});
|
2985
|
+
|
2986
|
+
|
2987
|
+
/*
|
2988
|
+
Script: Cookie.js
|
2989
|
+
Class for creating, loading, and saving browser Cookies.
|
2990
|
+
|
2991
|
+
License:
|
2992
|
+
MIT-style license.
|
2993
|
+
|
2994
|
+
Credits:
|
2995
|
+
Based on the functions by Peter-Paul Koch (http://quirksmode.org).
|
2996
|
+
*/
|
2997
|
+
|
2998
|
+
var Cookie = new Class({
|
2999
|
+
|
3000
|
+
Implements: Options,
|
3001
|
+
|
3002
|
+
options: {
|
3003
|
+
path: false,
|
3004
|
+
domain: false,
|
3005
|
+
duration: false,
|
3006
|
+
secure: false,
|
3007
|
+
document: document
|
3008
|
+
},
|
3009
|
+
|
3010
|
+
initialize: function(key, options){
|
3011
|
+
this.key = key;
|
3012
|
+
this.setOptions(options);
|
3013
|
+
},
|
3014
|
+
|
3015
|
+
write: function(value){
|
3016
|
+
value = encodeURIComponent(value);
|
3017
|
+
if (this.options.domain) value += '; domain=' + this.options.domain;
|
3018
|
+
if (this.options.path) value += '; path=' + this.options.path;
|
3019
|
+
if (this.options.duration){
|
3020
|
+
var date = new Date();
|
3021
|
+
date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);
|
3022
|
+
value += '; expires=' + date.toGMTString();
|
3023
|
+
}
|
3024
|
+
if (this.options.secure) value += '; secure';
|
3025
|
+
this.options.document.cookie = this.key + '=' + value;
|
3026
|
+
return this;
|
3027
|
+
},
|
3028
|
+
|
3029
|
+
read: function(){
|
3030
|
+
var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)');
|
3031
|
+
return (value) ? decodeURIComponent(value[1]) : null;
|
3032
|
+
},
|
3033
|
+
|
3034
|
+
dispose: function(){
|
3035
|
+
new Cookie(this.key, $merge(this.options, {duration: -1})).write('');
|
3036
|
+
return this;
|
3037
|
+
}
|
3038
|
+
|
3039
|
+
});
|
3040
|
+
|
3041
|
+
Cookie.write = function(key, value, options){
|
3042
|
+
return new Cookie(key, options).write(value);
|
3043
|
+
};
|
3044
|
+
|
3045
|
+
Cookie.read = function(key){
|
3046
|
+
return new Cookie(key).read();
|
3047
|
+
};
|
3048
|
+
|
3049
|
+
Cookie.dispose = function(key, options){
|
3050
|
+
return new Cookie(key, options).dispose();
|
3051
|
+
};
|
3052
|
+
|
3053
|
+
|
3054
|
+
/*
|
3055
|
+
Script: Swiff.js
|
3056
|
+
Wrapper for embedding SWF movies. Supports (and fixes) External Interface Communication.
|
3057
|
+
|
3058
|
+
License:
|
3059
|
+
MIT-style license.
|
3060
|
+
|
3061
|
+
Credits:
|
3062
|
+
Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject.
|
3063
|
+
*/
|
3064
|
+
|
3065
|
+
var Swiff = new Class({
|
3066
|
+
|
3067
|
+
Implements: [Options],
|
3068
|
+
|
3069
|
+
options: {
|
3070
|
+
id: null,
|
3071
|
+
height: 1,
|
3072
|
+
width: 1,
|
3073
|
+
container: null,
|
3074
|
+
properties: {},
|
3075
|
+
params: {
|
3076
|
+
quality: 'high',
|
3077
|
+
allowScriptAccess: 'always',
|
3078
|
+
wMode: 'transparent',
|
3079
|
+
swLiveConnect: true
|
3080
|
+
},
|
3081
|
+
callBacks: {},
|
3082
|
+
vars: {}
|
3083
|
+
},
|
3084
|
+
|
3085
|
+
toElement: function(){
|
3086
|
+
return this.object;
|
3087
|
+
},
|
3088
|
+
|
3089
|
+
initialize: function(path, options){
|
3090
|
+
this.instance = 'Swiff_' + $time();
|
3091
|
+
|
3092
|
+
this.setOptions(options);
|
3093
|
+
options = this.options;
|
3094
|
+
var id = this.id = options.id || this.instance;
|
3095
|
+
var container = document.id(options.container);
|
3096
|
+
|
3097
|
+
Swiff.CallBacks[this.instance] = {};
|
3098
|
+
|
3099
|
+
var params = options.params, vars = options.vars, callBacks = options.callBacks;
|
3100
|
+
var properties = $extend({height: options.height, width: options.width}, options.properties);
|
3101
|
+
|
3102
|
+
var self = this;
|
3103
|
+
|
3104
|
+
for (var callBack in callBacks){
|
3105
|
+
Swiff.CallBacks[this.instance][callBack] = (function(option){
|
3106
|
+
return function(){
|
3107
|
+
return option.apply(self.object, arguments);
|
3108
|
+
};
|
3109
|
+
})(callBacks[callBack]);
|
3110
|
+
vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack;
|
3111
|
+
}
|
3112
|
+
|
3113
|
+
params.flashVars = Hash.toQueryString(vars);
|
3114
|
+
if (Browser.Engine.trident){
|
3115
|
+
properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
|
3116
|
+
params.movie = path;
|
3117
|
+
} else {
|
3118
|
+
properties.type = 'application/x-shockwave-flash';
|
3119
|
+
properties.data = path;
|
3120
|
+
}
|
3121
|
+
var build = '<object id="' + id + '"';
|
3122
|
+
for (var property in properties) build += ' ' + property + '="' + properties[property] + '"';
|
3123
|
+
build += '>';
|
3124
|
+
for (var param in params){
|
3125
|
+
if (params[param]) build += '<param name="' + param + '" value="' + params[param] + '" />';
|
3126
|
+
}
|
3127
|
+
build += '</object>';
|
3128
|
+
this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild;
|
3129
|
+
},
|
3130
|
+
|
3131
|
+
replaces: function(element){
|
3132
|
+
element = document.id(element, true);
|
3133
|
+
element.parentNode.replaceChild(this.toElement(), element);
|
3134
|
+
return this;
|
3135
|
+
},
|
3136
|
+
|
3137
|
+
inject: function(element){
|
3138
|
+
document.id(element, true).appendChild(this.toElement());
|
3139
|
+
return this;
|
3140
|
+
},
|
3141
|
+
|
3142
|
+
remote: function(){
|
3143
|
+
return Swiff.remote.apply(Swiff, [this.toElement()].extend(arguments));
|
3144
|
+
}
|
3145
|
+
|
3146
|
+
});
|
3147
|
+
|
3148
|
+
Swiff.CallBacks = {};
|
3149
|
+
|
3150
|
+
Swiff.remote = function(obj, fn){
|
3151
|
+
var rs = obj.CallFunction('<invoke name="' + fn + '" returntype="javascript">' + __flash__argumentsToXML(arguments, 2) + '</invoke>');
|
3152
|
+
return eval(rs);
|
3153
|
+
};
|
3154
|
+
|
3155
|
+
|
3156
|
+
/*
|
3157
|
+
Script: Fx.js
|
3158
|
+
Contains the basic animation logic to be extended by all other Fx Classes.
|
3159
|
+
|
3160
|
+
License:
|
3161
|
+
MIT-style license.
|
3162
|
+
*/
|
3163
|
+
|
3164
|
+
var Fx = new Class({
|
3165
|
+
|
3166
|
+
Implements: [Chain, Events, Options],
|
3167
|
+
|
3168
|
+
options: {
|
3169
|
+
/*
|
3170
|
+
onStart: $empty,
|
3171
|
+
onCancel: $empty,
|
3172
|
+
onComplete: $empty,
|
3173
|
+
*/
|
3174
|
+
fps: 50,
|
3175
|
+
unit: false,
|
3176
|
+
duration: 500,
|
3177
|
+
link: 'ignore'
|
3178
|
+
},
|
3179
|
+
|
3180
|
+
initialize: function(options){
|
3181
|
+
this.subject = this.subject || this;
|
3182
|
+
this.setOptions(options);
|
3183
|
+
this.options.duration = Fx.Durations[this.options.duration] || this.options.duration.toInt();
|
3184
|
+
var wait = this.options.wait;
|
3185
|
+
if (wait === false) this.options.link = 'cancel';
|
3186
|
+
},
|
3187
|
+
|
3188
|
+
getTransition: function(){
|
3189
|
+
return function(p){
|
3190
|
+
return -(Math.cos(Math.PI * p) - 1) / 2;
|
3191
|
+
};
|
3192
|
+
},
|
3193
|
+
|
3194
|
+
step: function(){
|
3195
|
+
var time = $time();
|
3196
|
+
if (time < this.time + this.options.duration){
|
3197
|
+
var delta = this.transition((time - this.time) / this.options.duration);
|
3198
|
+
this.set(this.compute(this.from, this.to, delta));
|
3199
|
+
} else {
|
3200
|
+
this.set(this.compute(this.from, this.to, 1));
|
3201
|
+
this.complete();
|
3202
|
+
}
|
3203
|
+
},
|
3204
|
+
|
3205
|
+
set: function(now){
|
3206
|
+
return now;
|
3207
|
+
},
|
3208
|
+
|
3209
|
+
compute: function(from, to, delta){
|
3210
|
+
return Fx.compute(from, to, delta);
|
3211
|
+
},
|
3212
|
+
|
3213
|
+
check: function(){
|
3214
|
+
if (!this.timer) return true;
|
3215
|
+
switch (this.options.link){
|
3216
|
+
case 'cancel': this.cancel(); return true;
|
3217
|
+
case 'chain': this.chain(this.caller.bind(this, arguments)); return false;
|
3218
|
+
}
|
3219
|
+
return false;
|
3220
|
+
},
|
3221
|
+
|
3222
|
+
start: function(from, to){
|
3223
|
+
if (!this.check(from, to)) return this;
|
3224
|
+
this.from = from;
|
3225
|
+
this.to = to;
|
3226
|
+
this.time = 0;
|
3227
|
+
this.transition = this.getTransition();
|
3228
|
+
this.startTimer();
|
3229
|
+
this.onStart();
|
3230
|
+
return this;
|
3231
|
+
},
|
3232
|
+
|
3233
|
+
complete: function(){
|
3234
|
+
if (this.stopTimer()) this.onComplete();
|
3235
|
+
return this;
|
3236
|
+
},
|
3237
|
+
|
3238
|
+
cancel: function(){
|
3239
|
+
if (this.stopTimer()) this.onCancel();
|
3240
|
+
return this;
|
3241
|
+
},
|
3242
|
+
|
3243
|
+
onStart: function(){
|
3244
|
+
this.fireEvent('start', this.subject);
|
3245
|
+
},
|
3246
|
+
|
3247
|
+
onComplete: function(){
|
3248
|
+
this.fireEvent('complete', this.subject);
|
3249
|
+
if (!this.callChain()) this.fireEvent('chainComplete', this.subject);
|
3250
|
+
},
|
3251
|
+
|
3252
|
+
onCancel: function(){
|
3253
|
+
this.fireEvent('cancel', this.subject).clearChain();
|
3254
|
+
},
|
3255
|
+
|
3256
|
+
pause: function(){
|
3257
|
+
this.stopTimer();
|
3258
|
+
return this;
|
3259
|
+
},
|
3260
|
+
|
3261
|
+
resume: function(){
|
3262
|
+
this.startTimer();
|
3263
|
+
return this;
|
3264
|
+
},
|
3265
|
+
|
3266
|
+
stopTimer: function(){
|
3267
|
+
if (!this.timer) return false;
|
3268
|
+
this.time = $time() - this.time;
|
3269
|
+
this.timer = $clear(this.timer);
|
3270
|
+
return true;
|
3271
|
+
},
|
3272
|
+
|
3273
|
+
startTimer: function(){
|
3274
|
+
if (this.timer) return false;
|
3275
|
+
this.time = $time() - this.time;
|
3276
|
+
this.timer = this.step.periodical(Math.round(1000 / this.options.fps), this);
|
3277
|
+
return true;
|
3278
|
+
}
|
3279
|
+
|
3280
|
+
});
|
3281
|
+
|
3282
|
+
Fx.compute = function(from, to, delta){
|
3283
|
+
return (to - from) * delta + from;
|
3284
|
+
};
|
3285
|
+
|
3286
|
+
Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000};
|
3287
|
+
|
3288
|
+
|
3289
|
+
/*
|
3290
|
+
Script: Fx.CSS.js
|
3291
|
+
Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements.
|
3292
|
+
|
3293
|
+
License:
|
3294
|
+
MIT-style license.
|
3295
|
+
*/
|
3296
|
+
|
3297
|
+
Fx.CSS = new Class({
|
3298
|
+
|
3299
|
+
Extends: Fx,
|
3300
|
+
|
3301
|
+
//prepares the base from/to object
|
3302
|
+
|
3303
|
+
prepare: function(element, property, values){
|
3304
|
+
values = $splat(values);
|
3305
|
+
var values1 = values[1];
|
3306
|
+
if (!$chk(values1)){
|
3307
|
+
values[1] = values[0];
|
3308
|
+
values[0] = element.getStyle(property);
|
3309
|
+
}
|
3310
|
+
var parsed = values.map(this.parse);
|
3311
|
+
return {from: parsed[0], to: parsed[1]};
|
3312
|
+
},
|
3313
|
+
|
3314
|
+
//parses a value into an array
|
3315
|
+
|
3316
|
+
parse: function(value){
|
3317
|
+
value = $lambda(value)();
|
3318
|
+
value = (typeof value == 'string') ? value.split(' ') : $splat(value);
|
3319
|
+
return value.map(function(val){
|
3320
|
+
val = String(val);
|
3321
|
+
var found = false;
|
3322
|
+
Fx.CSS.Parsers.each(function(parser, key){
|
3323
|
+
if (found) return;
|
3324
|
+
var parsed = parser.parse(val);
|
3325
|
+
if ($chk(parsed)) found = {value: parsed, parser: parser};
|
3326
|
+
});
|
3327
|
+
found = found || {value: val, parser: Fx.CSS.Parsers.String};
|
3328
|
+
return found;
|
3329
|
+
});
|
3330
|
+
},
|
3331
|
+
|
3332
|
+
//computes by a from and to prepared objects, using their parsers.
|
3333
|
+
|
3334
|
+
compute: function(from, to, delta){
|
3335
|
+
var computed = [];
|
3336
|
+
(Math.min(from.length, to.length)).times(function(i){
|
3337
|
+
computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser});
|
3338
|
+
});
|
3339
|
+
computed.$family = {name: 'fx:css:value'};
|
3340
|
+
return computed;
|
3341
|
+
},
|
3342
|
+
|
3343
|
+
//serves the value as settable
|
3344
|
+
|
3345
|
+
serve: function(value, unit){
|
3346
|
+
if ($type(value) != 'fx:css:value') value = this.parse(value);
|
3347
|
+
var returned = [];
|
3348
|
+
value.each(function(bit){
|
3349
|
+
returned = returned.concat(bit.parser.serve(bit.value, unit));
|
3350
|
+
});
|
3351
|
+
return returned;
|
3352
|
+
},
|
3353
|
+
|
3354
|
+
//renders the change to an element
|
3355
|
+
|
3356
|
+
render: function(element, property, value, unit){
|
3357
|
+
element.setStyle(property, this.serve(value, unit));
|
3358
|
+
},
|
3359
|
+
|
3360
|
+
//searches inside the page css to find the values for a selector
|
3361
|
+
|
3362
|
+
search: function(selector){
|
3363
|
+
if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];
|
3364
|
+
var to = {};
|
3365
|
+
Array.each(document.styleSheets, function(sheet, j){
|
3366
|
+
var href = sheet.href;
|
3367
|
+
if (href && href.contains('://') && !href.contains(document.domain)) return;
|
3368
|
+
var rules = sheet.rules || sheet.cssRules;
|
3369
|
+
Array.each(rules, function(rule, i){
|
3370
|
+
if (!rule.style) return;
|
3371
|
+
var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){
|
3372
|
+
return m.toLowerCase();
|
3373
|
+
}) : null;
|
3374
|
+
if (!selectorText || !selectorText.test('^' + selector + '$')) return;
|
3375
|
+
Element.Styles.each(function(value, style){
|
3376
|
+
if (!rule.style[style] || Element.ShortStyles[style]) return;
|
3377
|
+
value = String(rule.style[style]);
|
3378
|
+
to[style] = (value.test(/^rgb/)) ? value.rgbToHex() : value;
|
3379
|
+
});
|
3380
|
+
});
|
3381
|
+
});
|
3382
|
+
return Fx.CSS.Cache[selector] = to;
|
3383
|
+
}
|
3384
|
+
|
3385
|
+
});
|
3386
|
+
|
3387
|
+
Fx.CSS.Cache = {};
|
3388
|
+
|
3389
|
+
Fx.CSS.Parsers = new Hash({
|
3390
|
+
|
3391
|
+
Color: {
|
3392
|
+
parse: function(value){
|
3393
|
+
if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true);
|
3394
|
+
return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false;
|
3395
|
+
},
|
3396
|
+
compute: function(from, to, delta){
|
3397
|
+
return from.map(function(value, i){
|
3398
|
+
return Math.round(Fx.compute(from[i], to[i], delta));
|
3399
|
+
});
|
3400
|
+
},
|
3401
|
+
serve: function(value){
|
3402
|
+
return value.map(Number);
|
3403
|
+
}
|
3404
|
+
},
|
3405
|
+
|
3406
|
+
Number: {
|
3407
|
+
parse: parseFloat,
|
3408
|
+
compute: Fx.compute,
|
3409
|
+
serve: function(value, unit){
|
3410
|
+
return (unit) ? value + unit : value;
|
3411
|
+
}
|
3412
|
+
},
|
3413
|
+
|
3414
|
+
String: {
|
3415
|
+
parse: $lambda(false),
|
3416
|
+
compute: $arguments(1),
|
3417
|
+
serve: $arguments(0)
|
3418
|
+
}
|
3419
|
+
|
3420
|
+
});
|
3421
|
+
|
3422
|
+
|
3423
|
+
/*
|
3424
|
+
Script: Fx.Tween.js
|
3425
|
+
Formerly Fx.Style, effect to transition any CSS property for an element.
|
3426
|
+
|
3427
|
+
License:
|
3428
|
+
MIT-style license.
|
3429
|
+
*/
|
3430
|
+
|
3431
|
+
Fx.Tween = new Class({
|
3432
|
+
|
3433
|
+
Extends: Fx.CSS,
|
3434
|
+
|
3435
|
+
initialize: function(element, options){
|
3436
|
+
this.element = this.subject = document.id(element);
|
3437
|
+
this.parent(options);
|
3438
|
+
},
|
3439
|
+
|
3440
|
+
set: function(property, now){
|
3441
|
+
if (arguments.length == 1){
|
3442
|
+
now = property;
|
3443
|
+
property = this.property || this.options.property;
|
3444
|
+
}
|
3445
|
+
this.render(this.element, property, now, this.options.unit);
|
3446
|
+
return this;
|
3447
|
+
},
|
3448
|
+
|
3449
|
+
start: function(property, from, to){
|
3450
|
+
if (!this.check(property, from, to)) return this;
|
3451
|
+
var args = Array.flatten(arguments);
|
3452
|
+
this.property = this.options.property || args.shift();
|
3453
|
+
var parsed = this.prepare(this.element, this.property, args);
|
3454
|
+
return this.parent(parsed.from, parsed.to);
|
3455
|
+
}
|
3456
|
+
|
3457
|
+
});
|
3458
|
+
|
3459
|
+
Element.Properties.tween = {
|
3460
|
+
|
3461
|
+
set: function(options){
|
3462
|
+
var tween = this.retrieve('tween');
|
3463
|
+
if (tween) tween.cancel();
|
3464
|
+
return this.eliminate('tween').store('tween:options', $extend({link: 'cancel'}, options));
|
3465
|
+
},
|
3466
|
+
|
3467
|
+
get: function(options){
|
3468
|
+
if (options || !this.retrieve('tween')){
|
3469
|
+
if (options || !this.retrieve('tween:options')) this.set('tween', options);
|
3470
|
+
this.store('tween', new Fx.Tween(this, this.retrieve('tween:options')));
|
3471
|
+
}
|
3472
|
+
return this.retrieve('tween');
|
3473
|
+
}
|
3474
|
+
|
3475
|
+
};
|
3476
|
+
|
3477
|
+
Element.implement({
|
3478
|
+
|
3479
|
+
tween: function(property, from, to){
|
3480
|
+
this.get('tween').start(arguments);
|
3481
|
+
return this;
|
3482
|
+
},
|
3483
|
+
|
3484
|
+
fade: function(how){
|
3485
|
+
var fade = this.get('tween'), o = 'opacity', toggle;
|
3486
|
+
how = $pick(how, 'toggle');
|
3487
|
+
switch (how){
|
3488
|
+
case 'in': fade.start(o, 1); break;
|
3489
|
+
case 'out': fade.start(o, 0); break;
|
3490
|
+
case 'show': fade.set(o, 1); break;
|
3491
|
+
case 'hide': fade.set(o, 0); break;
|
3492
|
+
case 'toggle':
|
3493
|
+
var flag = this.retrieve('fade:flag', this.get('opacity') == 1);
|
3494
|
+
fade.start(o, (flag) ? 0 : 1);
|
3495
|
+
this.store('fade:flag', !flag);
|
3496
|
+
toggle = true;
|
3497
|
+
break;
|
3498
|
+
default: fade.start(o, arguments);
|
3499
|
+
}
|
3500
|
+
if (!toggle) this.eliminate('fade:flag');
|
3501
|
+
return this;
|
3502
|
+
},
|
3503
|
+
|
3504
|
+
highlight: function(start, end){
|
3505
|
+
if (!end){
|
3506
|
+
end = this.retrieve('highlight:original', this.getStyle('background-color'));
|
3507
|
+
end = (end == 'transparent') ? '#fff' : end;
|
3508
|
+
}
|
3509
|
+
var tween = this.get('tween');
|
3510
|
+
tween.start('background-color', start || '#ffff88', end).chain(function(){
|
3511
|
+
this.setStyle('background-color', this.retrieve('highlight:original'));
|
3512
|
+
tween.callChain();
|
3513
|
+
}.bind(this));
|
3514
|
+
return this;
|
3515
|
+
}
|
3516
|
+
|
3517
|
+
});
|
3518
|
+
|
3519
|
+
|
3520
|
+
/*
|
3521
|
+
Script: Fx.Morph.js
|
3522
|
+
Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules.
|
3523
|
+
|
3524
|
+
License:
|
3525
|
+
MIT-style license.
|
3526
|
+
*/
|
3527
|
+
|
3528
|
+
Fx.Morph = new Class({
|
3529
|
+
|
3530
|
+
Extends: Fx.CSS,
|
3531
|
+
|
3532
|
+
initialize: function(element, options){
|
3533
|
+
this.element = this.subject = document.id(element);
|
3534
|
+
this.parent(options);
|
3535
|
+
},
|
3536
|
+
|
3537
|
+
set: function(now){
|
3538
|
+
if (typeof now == 'string') now = this.search(now);
|
3539
|
+
for (var p in now) this.render(this.element, p, now[p], this.options.unit);
|
3540
|
+
return this;
|
3541
|
+
},
|
3542
|
+
|
3543
|
+
compute: function(from, to, delta){
|
3544
|
+
var now = {};
|
3545
|
+
for (var p in from) now[p] = this.parent(from[p], to[p], delta);
|
3546
|
+
return now;
|
3547
|
+
},
|
3548
|
+
|
3549
|
+
start: function(properties){
|
3550
|
+
if (!this.check(properties)) return this;
|
3551
|
+
if (typeof properties == 'string') properties = this.search(properties);
|
3552
|
+
var from = {}, to = {};
|
3553
|
+
for (var p in properties){
|
3554
|
+
var parsed = this.prepare(this.element, p, properties[p]);
|
3555
|
+
from[p] = parsed.from;
|
3556
|
+
to[p] = parsed.to;
|
3557
|
+
}
|
3558
|
+
return this.parent(from, to);
|
3559
|
+
}
|
3560
|
+
|
3561
|
+
});
|
3562
|
+
|
3563
|
+
Element.Properties.morph = {
|
3564
|
+
|
3565
|
+
set: function(options){
|
3566
|
+
var morph = this.retrieve('morph');
|
3567
|
+
if (morph) morph.cancel();
|
3568
|
+
return this.eliminate('morph').store('morph:options', $extend({link: 'cancel'}, options));
|
3569
|
+
},
|
3570
|
+
|
3571
|
+
get: function(options){
|
3572
|
+
if (options || !this.retrieve('morph')){
|
3573
|
+
if (options || !this.retrieve('morph:options')) this.set('morph', options);
|
3574
|
+
this.store('morph', new Fx.Morph(this, this.retrieve('morph:options')));
|
3575
|
+
}
|
3576
|
+
return this.retrieve('morph');
|
3577
|
+
}
|
3578
|
+
|
3579
|
+
};
|
3580
|
+
|
3581
|
+
Element.implement({
|
3582
|
+
|
3583
|
+
morph: function(props){
|
3584
|
+
this.get('morph').start(props);
|
3585
|
+
return this;
|
3586
|
+
}
|
3587
|
+
|
3588
|
+
});
|
3589
|
+
|
3590
|
+
|
3591
|
+
/*
|
3592
|
+
Script: Fx.Transitions.js
|
3593
|
+
Contains a set of advanced transitions to be used with any of the Fx Classes.
|
3594
|
+
|
3595
|
+
License:
|
3596
|
+
MIT-style license.
|
3597
|
+
|
3598
|
+
Credits:
|
3599
|
+
Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>, modified and optimized to be used with MooTools.
|
3600
|
+
*/
|
3601
|
+
|
3602
|
+
Fx.implement({
|
3603
|
+
|
3604
|
+
getTransition: function(){
|
3605
|
+
var trans = this.options.transition || Fx.Transitions.Sine.easeInOut;
|
3606
|
+
if (typeof trans == 'string'){
|
3607
|
+
var data = trans.split(':');
|
3608
|
+
trans = Fx.Transitions;
|
3609
|
+
trans = trans[data[0]] || trans[data[0].capitalize()];
|
3610
|
+
if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')];
|
3611
|
+
}
|
3612
|
+
return trans;
|
3613
|
+
}
|
3614
|
+
|
3615
|
+
});
|
3616
|
+
|
3617
|
+
Fx.Transition = function(transition, params){
|
3618
|
+
params = $splat(params);
|
3619
|
+
return $extend(transition, {
|
3620
|
+
easeIn: function(pos){
|
3621
|
+
return transition(pos, params);
|
3622
|
+
},
|
3623
|
+
easeOut: function(pos){
|
3624
|
+
return 1 - transition(1 - pos, params);
|
3625
|
+
},
|
3626
|
+
easeInOut: function(pos){
|
3627
|
+
return (pos <= 0.5) ? transition(2 * pos, params) / 2 : (2 - transition(2 * (1 - pos), params)) / 2;
|
3628
|
+
}
|
3629
|
+
});
|
3630
|
+
};
|
3631
|
+
|
3632
|
+
Fx.Transitions = new Hash({
|
3633
|
+
|
3634
|
+
linear: $arguments(0)
|
3635
|
+
|
3636
|
+
});
|
3637
|
+
|
3638
|
+
Fx.Transitions.extend = function(transitions){
|
3639
|
+
for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);
|
3640
|
+
};
|
3641
|
+
|
3642
|
+
Fx.Transitions.extend({
|
3643
|
+
|
3644
|
+
Pow: function(p, x){
|
3645
|
+
return Math.pow(p, x[0] || 6);
|
3646
|
+
},
|
3647
|
+
|
3648
|
+
Expo: function(p){
|
3649
|
+
return Math.pow(2, 8 * (p - 1));
|
3650
|
+
},
|
3651
|
+
|
3652
|
+
Circ: function(p){
|
3653
|
+
return 1 - Math.sin(Math.acos(p));
|
3654
|
+
},
|
3655
|
+
|
3656
|
+
Sine: function(p){
|
3657
|
+
return 1 - Math.sin((1 - p) * Math.PI / 2);
|
3658
|
+
},
|
3659
|
+
|
3660
|
+
Back: function(p, x){
|
3661
|
+
x = x[0] || 1.618;
|
3662
|
+
return Math.pow(p, 2) * ((x + 1) * p - x);
|
3663
|
+
},
|
3664
|
+
|
3665
|
+
Bounce: function(p){
|
3666
|
+
var value;
|
3667
|
+
for (var a = 0, b = 1; 1; a += b, b /= 2){
|
3668
|
+
if (p >= (7 - 4 * a) / 11){
|
3669
|
+
value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
|
3670
|
+
break;
|
3671
|
+
}
|
3672
|
+
}
|
3673
|
+
return value;
|
3674
|
+
},
|
3675
|
+
|
3676
|
+
Elastic: function(p, x){
|
3677
|
+
return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x[0] || 1) / 3);
|
3678
|
+
}
|
3679
|
+
|
3680
|
+
});
|
3681
|
+
|
3682
|
+
['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){
|
3683
|
+
Fx.Transitions[transition] = new Fx.Transition(function(p){
|
3684
|
+
return Math.pow(p, [i + 2]);
|
3685
|
+
});
|
3686
|
+
});
|
3687
|
+
|
3688
|
+
|
3689
|
+
/*
|
3690
|
+
Script: Request.js
|
3691
|
+
Powerful all purpose Request Class. Uses XMLHTTPRequest.
|
3692
|
+
|
3693
|
+
License:
|
3694
|
+
MIT-style license.
|
3695
|
+
*/
|
3696
|
+
|
3697
|
+
var Request = new Class({
|
3698
|
+
|
3699
|
+
Implements: [Chain, Events, Options],
|
3700
|
+
|
3701
|
+
options: {/*
|
3702
|
+
onRequest: $empty,
|
3703
|
+
onComplete: $empty,
|
3704
|
+
onCancel: $empty,
|
3705
|
+
onSuccess: $empty,
|
3706
|
+
onFailure: $empty,
|
3707
|
+
onException: $empty,*/
|
3708
|
+
url: '',
|
3709
|
+
data: '',
|
3710
|
+
headers: {
|
3711
|
+
'X-Requested-With': 'XMLHttpRequest',
|
3712
|
+
'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
|
3713
|
+
},
|
3714
|
+
async: true,
|
3715
|
+
format: false,
|
3716
|
+
method: 'post',
|
3717
|
+
link: 'ignore',
|
3718
|
+
isSuccess: null,
|
3719
|
+
emulation: true,
|
3720
|
+
urlEncoded: true,
|
3721
|
+
encoding: 'utf-8',
|
3722
|
+
evalScripts: false,
|
3723
|
+
evalResponse: false,
|
3724
|
+
noCache: false
|
3725
|
+
},
|
3726
|
+
|
3727
|
+
initialize: function(options){
|
3728
|
+
this.xhr = new Browser.Request();
|
3729
|
+
this.setOptions(options);
|
3730
|
+
this.options.isSuccess = this.options.isSuccess || this.isSuccess;
|
3731
|
+
this.headers = new Hash(this.options.headers);
|
3732
|
+
},
|
3733
|
+
|
3734
|
+
onStateChange: function(){
|
3735
|
+
if (this.xhr.readyState != 4 || !this.running) return;
|
3736
|
+
this.running = false;
|
3737
|
+
this.status = 0;
|
3738
|
+
$try(function(){
|
3739
|
+
this.status = this.xhr.status;
|
3740
|
+
}.bind(this));
|
3741
|
+
this.xhr.onreadystatechange = $empty;
|
3742
|
+
if (this.options.isSuccess.call(this, this.status)){
|
3743
|
+
this.response = {text: this.xhr.responseText, xml: this.xhr.responseXML};
|
3744
|
+
this.success(this.response.text, this.response.xml);
|
3745
|
+
} else {
|
3746
|
+
this.response = {text: null, xml: null};
|
3747
|
+
this.failure();
|
3748
|
+
}
|
3749
|
+
},
|
3750
|
+
|
3751
|
+
isSuccess: function(){
|
3752
|
+
return ((this.status >= 200) && (this.status < 300));
|
3753
|
+
},
|
3754
|
+
|
3755
|
+
processScripts: function(text){
|
3756
|
+
if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return $exec(text);
|
3757
|
+
return text.stripScripts(this.options.evalScripts);
|
3758
|
+
},
|
3759
|
+
|
3760
|
+
success: function(text, xml){
|
3761
|
+
this.onSuccess(this.processScripts(text), xml);
|
3762
|
+
},
|
3763
|
+
|
3764
|
+
onSuccess: function(){
|
3765
|
+
this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain();
|
3766
|
+
},
|
3767
|
+
|
3768
|
+
failure: function(){
|
3769
|
+
this.onFailure();
|
3770
|
+
},
|
3771
|
+
|
3772
|
+
onFailure: function(){
|
3773
|
+
this.fireEvent('complete').fireEvent('failure', this.xhr);
|
3774
|
+
},
|
3775
|
+
|
3776
|
+
setHeader: function(name, value){
|
3777
|
+
this.headers.set(name, value);
|
3778
|
+
return this;
|
3779
|
+
},
|
3780
|
+
|
3781
|
+
getHeader: function(name){
|
3782
|
+
return $try(function(){
|
3783
|
+
return this.xhr.getResponseHeader(name);
|
3784
|
+
}.bind(this));
|
3785
|
+
},
|
3786
|
+
|
3787
|
+
check: function(){
|
3788
|
+
if (!this.running) return true;
|
3789
|
+
switch (this.options.link){
|
3790
|
+
case 'cancel': this.cancel(); return true;
|
3791
|
+
case 'chain': this.chain(this.caller.bind(this, arguments)); return false;
|
3792
|
+
}
|
3793
|
+
return false;
|
3794
|
+
},
|
3795
|
+
|
3796
|
+
send: function(options){
|
3797
|
+
if (!this.check(options)) return this;
|
3798
|
+
this.running = true;
|
3799
|
+
|
3800
|
+
var type = $type(options);
|
3801
|
+
if (type == 'string' || type == 'element') options = {data: options};
|
3802
|
+
|
3803
|
+
var old = this.options;
|
3804
|
+
options = $extend({data: old.data, url: old.url, method: old.method}, options);
|
3805
|
+
var data = options.data, url = options.url, method = options.method.toLowerCase();
|
3806
|
+
|
3807
|
+
switch ($type(data)){
|
3808
|
+
case 'element': data = document.id(data).toQueryString(); break;
|
3809
|
+
case 'object': case 'hash': data = Hash.toQueryString(data);
|
3810
|
+
}
|
3811
|
+
|
3812
|
+
if (this.options.format){
|
3813
|
+
var format = 'format=' + this.options.format;
|
3814
|
+
data = (data) ? format + '&' + data : format;
|
3815
|
+
}
|
3816
|
+
|
3817
|
+
if (this.options.emulation && !['get', 'post'].contains(method)){
|
3818
|
+
var _method = '_method=' + method;
|
3819
|
+
data = (data) ? _method + '&' + data : _method;
|
3820
|
+
method = 'post';
|
3821
|
+
}
|
3822
|
+
|
3823
|
+
if (this.options.urlEncoded && method == 'post'){
|
3824
|
+
var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';
|
3825
|
+
this.headers.set('Content-type', 'application/x-www-form-urlencoded' + encoding);
|
3826
|
+
}
|
3827
|
+
|
3828
|
+
if (this.options.noCache){
|
3829
|
+
var noCache = 'noCache=' + new Date().getTime();
|
3830
|
+
data = (data) ? noCache + '&' + data : noCache;
|
3831
|
+
}
|
3832
|
+
|
3833
|
+
var trimPosition = url.lastIndexOf('/');
|
3834
|
+
if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition);
|
3835
|
+
|
3836
|
+
if (data && method == 'get'){
|
3837
|
+
url = url + (url.contains('?') ? '&' : '?') + data;
|
3838
|
+
data = null;
|
3839
|
+
}
|
3840
|
+
|
3841
|
+
this.xhr.open(method.toUpperCase(), url, this.options.async);
|
3842
|
+
|
3843
|
+
this.xhr.onreadystatechange = this.onStateChange.bind(this);
|
3844
|
+
|
3845
|
+
this.headers.each(function(value, key){
|
3846
|
+
try {
|
3847
|
+
this.xhr.setRequestHeader(key, value);
|
3848
|
+
} catch (e){
|
3849
|
+
this.fireEvent('exception', [key, value]);
|
3850
|
+
}
|
3851
|
+
}, this);
|
3852
|
+
|
3853
|
+
this.fireEvent('request');
|
3854
|
+
this.xhr.send(data);
|
3855
|
+
if (!this.options.async) this.onStateChange();
|
3856
|
+
return this;
|
3857
|
+
},
|
3858
|
+
|
3859
|
+
cancel: function(){
|
3860
|
+
if (!this.running) return this;
|
3861
|
+
this.running = false;
|
3862
|
+
this.xhr.abort();
|
3863
|
+
this.xhr.onreadystatechange = $empty;
|
3864
|
+
this.xhr = new Browser.Request();
|
3865
|
+
this.fireEvent('cancel');
|
3866
|
+
return this;
|
3867
|
+
}
|
3868
|
+
|
3869
|
+
});
|
3870
|
+
|
3871
|
+
(function(){
|
3872
|
+
|
3873
|
+
var methods = {};
|
3874
|
+
['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){
|
3875
|
+
methods[method] = function(){
|
3876
|
+
var params = Array.link(arguments, {url: String.type, data: $defined});
|
3877
|
+
return this.send($extend(params, {method: method}));
|
3878
|
+
};
|
3879
|
+
});
|
3880
|
+
|
3881
|
+
Request.implement(methods);
|
3882
|
+
|
3883
|
+
})();
|
3884
|
+
|
3885
|
+
Element.Properties.send = {
|
3886
|
+
|
3887
|
+
set: function(options){
|
3888
|
+
var send = this.retrieve('send');
|
3889
|
+
if (send) send.cancel();
|
3890
|
+
return this.eliminate('send').store('send:options', $extend({
|
3891
|
+
data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action')
|
3892
|
+
}, options));
|
3893
|
+
},
|
3894
|
+
|
3895
|
+
get: function(options){
|
3896
|
+
if (options || !this.retrieve('send')){
|
3897
|
+
if (options || !this.retrieve('send:options')) this.set('send', options);
|
3898
|
+
this.store('send', new Request(this.retrieve('send:options')));
|
3899
|
+
}
|
3900
|
+
return this.retrieve('send');
|
3901
|
+
}
|
3902
|
+
|
3903
|
+
};
|
3904
|
+
|
3905
|
+
Element.implement({
|
3906
|
+
|
3907
|
+
send: function(url){
|
3908
|
+
var sender = this.get('send');
|
3909
|
+
sender.send({data: this, url: url || sender.options.url});
|
3910
|
+
return this;
|
3911
|
+
}
|
3912
|
+
|
3913
|
+
});
|
3914
|
+
|
3915
|
+
|
3916
|
+
/*
|
3917
|
+
Script: Request.HTML.js
|
3918
|
+
Extends the basic Request Class with additional methods for interacting with HTML responses.
|
3919
|
+
|
3920
|
+
License:
|
3921
|
+
MIT-style license.
|
3922
|
+
*/
|
3923
|
+
|
3924
|
+
Request.HTML = new Class({
|
3925
|
+
|
3926
|
+
Extends: Request,
|
3927
|
+
|
3928
|
+
options: {
|
3929
|
+
update: false,
|
3930
|
+
append: false,
|
3931
|
+
evalScripts: true,
|
3932
|
+
filter: false
|
3933
|
+
},
|
3934
|
+
|
3935
|
+
processHTML: function(text){
|
3936
|
+
var match = text.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
|
3937
|
+
text = (match) ? match[1] : text;
|
3938
|
+
|
3939
|
+
var container = new Element('div');
|
3940
|
+
|
3941
|
+
return $try(function(){
|
3942
|
+
var root = '<root>' + text + '</root>', doc;
|
3943
|
+
if (Browser.Engine.trident){
|
3944
|
+
doc = new ActiveXObject('Microsoft.XMLDOM');
|
3945
|
+
doc.async = false;
|
3946
|
+
doc.loadXML(root);
|
3947
|
+
} else {
|
3948
|
+
doc = new DOMParser().parseFromString(root, 'text/xml');
|
3949
|
+
}
|
3950
|
+
root = doc.getElementsByTagName('root')[0];
|
3951
|
+
if (!root) return null;
|
3952
|
+
for (var i = 0, k = root.childNodes.length; i < k; i++){
|
3953
|
+
var child = Element.clone(root.childNodes[i], true, true);
|
3954
|
+
if (child) container.grab(child);
|
3955
|
+
}
|
3956
|
+
return container;
|
3957
|
+
}) || container.set('html', text);
|
3958
|
+
},
|
3959
|
+
|
3960
|
+
success: function(text){
|
3961
|
+
var options = this.options, response = this.response;
|
3962
|
+
|
3963
|
+
response.html = text.stripScripts(function(script){
|
3964
|
+
response.javascript = script;
|
3965
|
+
});
|
3966
|
+
|
3967
|
+
var temp = this.processHTML(response.html);
|
3968
|
+
|
3969
|
+
response.tree = temp.childNodes;
|
3970
|
+
response.elements = temp.getElements('*');
|
3971
|
+
|
3972
|
+
if (options.filter) response.tree = response.elements.filter(options.filter);
|
3973
|
+
if (options.update) document.id(options.update).empty().set('html', response.html);
|
3974
|
+
else if (options.append) document.id(options.append).adopt(temp.getChildren());
|
3975
|
+
if (options.evalScripts) $exec(response.javascript);
|
3976
|
+
|
3977
|
+
this.onSuccess(response.tree, response.elements, response.html, response.javascript);
|
3978
|
+
}
|
3979
|
+
|
3980
|
+
});
|
3981
|
+
|
3982
|
+
Element.Properties.load = {
|
3983
|
+
|
3984
|
+
set: function(options){
|
3985
|
+
var load = this.retrieve('load');
|
3986
|
+
if (load) load.cancel();
|
3987
|
+
return this.eliminate('load').store('load:options', $extend({data: this, link: 'cancel', update: this, method: 'get'}, options));
|
3988
|
+
},
|
3989
|
+
|
3990
|
+
get: function(options){
|
3991
|
+
if (options || ! this.retrieve('load')){
|
3992
|
+
if (options || !this.retrieve('load:options')) this.set('load', options);
|
3993
|
+
this.store('load', new Request.HTML(this.retrieve('load:options')));
|
3994
|
+
}
|
3995
|
+
return this.retrieve('load');
|
3996
|
+
}
|
3997
|
+
|
3998
|
+
};
|
3999
|
+
|
4000
|
+
Element.implement({
|
4001
|
+
|
4002
|
+
load: function(){
|
4003
|
+
this.get('load').send(Array.link(arguments, {data: Object.type, url: String.type}));
|
4004
|
+
return this;
|
4005
|
+
}
|
4006
|
+
|
4007
|
+
});
|
4008
|
+
|
4009
|
+
|
4010
|
+
/*
|
4011
|
+
Script: Request.JSON.js
|
4012
|
+
Extends the basic Request Class with additional methods for sending and receiving JSON data.
|
4013
|
+
|
4014
|
+
License:
|
4015
|
+
MIT-style license.
|
4016
|
+
*/
|
4017
|
+
|
4018
|
+
Request.JSON = new Class({
|
4019
|
+
|
4020
|
+
Extends: Request,
|
4021
|
+
|
4022
|
+
options: {
|
4023
|
+
secure: true
|
4024
|
+
},
|
4025
|
+
|
4026
|
+
initialize: function(options){
|
4027
|
+
this.parent(options);
|
4028
|
+
this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});
|
4029
|
+
},
|
4030
|
+
|
4031
|
+
success: function(text){
|
4032
|
+
this.response.json = JSON.decode(text, this.options.secure);
|
4033
|
+
this.onSuccess(this.response.json, text);
|
4034
|
+
}
|
4035
|
+
|
4036
|
+
});
|