echo_base 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.gitignore +21 -3
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +51 -2
- data/VERSION +1 -0
- data/echo_base.gemspec +165 -15
- data/lib/echo_base.rb +0 -3
- data/lib/generators/echo_base/USAGE +5 -0
- data/lib/generators/echo_base/echo_base_generator.rb +44 -0
- data/lib/generators/echo_base/templates/.infinity_test +25 -0
- data/lib/generators/echo_base/templates/.rspec +1 -0
- data/lib/generators/echo_base/templates/.rvmrc +1 -0
- data/lib/generators/echo_base/templates/Capfile +4 -0
- data/lib/generators/echo_base/templates/Gemfile +37 -0
- data/lib/generators/echo_base/templates/Gemfile.lock +235 -0
- data/lib/generators/echo_base/templates/app/controllers/application_controller.rb +20 -0
- data/lib/generators/echo_base/templates/app/controllers/sessions_controller.rb +15 -0
- data/lib/generators/echo_base/templates/app/controllers/users_controller.rb +83 -0
- data/lib/generators/echo_base/templates/app/helpers/application_helper.rb +2 -0
- data/lib/generators/echo_base/templates/app/helpers/sessions_helper.rb +2 -0
- data/lib/generators/echo_base/templates/app/helpers/users_helper.rb +2 -0
- data/lib/generators/echo_base/templates/app/models/authorization.rb +14 -0
- data/lib/generators/echo_base/templates/app/models/user.rb +11 -0
- data/lib/generators/echo_base/templates/app/views/shared/_js.html.erb +14 -0
- data/lib/generators/echo_base/templates/app/views/users/_form.html.erb +37 -0
- data/lib/generators/echo_base/templates/app/views/users/_sidebar.html.erb +13 -0
- data/lib/generators/echo_base/templates/app/views/users/edit.html.erb +19 -0
- data/lib/generators/echo_base/templates/app/views/users/index.html.erb +48 -0
- data/lib/generators/echo_base/templates/app/views/users/new.html.erb +18 -0
- data/lib/generators/echo_base/templates/app/views/users/show.html.erb +44 -0
- data/lib/generators/echo_base/templates/application.html.erb +48 -0
- data/lib/generators/echo_base/templates/autotest/discover.rb +2 -0
- data/lib/generators/echo_base/templates/config/cucumber.yml +8 -0
- data/lib/generators/echo_base/templates/config/deploy.rb +24 -0
- data/lib/generators/echo_base/templates/config/environments/development.rb +26 -0
- data/lib/generators/echo_base/templates/config/environments/production.rb +50 -0
- data/lib/generators/echo_base/templates/config/environments/test.rb +35 -0
- data/lib/generators/echo_base/templates/config/initializers/hoptoad.rb +4 -0
- data/lib/generators/echo_base/templates/config/initializers/omniauth.rb +10 -0
- data/lib/generators/echo_base/templates/config/newrelic.yml.example +0 -0
- data/lib/generators/echo_base/templates/config/omniauth.yml.example +62 -0
- data/lib/generators/echo_base/templates/config/routes.rb +5 -0
- data/lib/generators/echo_base/templates/db/migrate/20101008210657_create_authorizations.rb +15 -0
- data/lib/generators/echo_base/templates/db/migrate/20101009192412_create_users.rb +17 -0
- data/lib/generators/echo_base/templates/features/manage_authentications.feature +45 -0
- data/lib/generators/echo_base/templates/features/manage_users.feature +45 -0
- data/lib/generators/echo_base/templates/features/step_definitions/authentication_steps.rb +14 -0
- data/lib/generators/echo_base/templates/features/step_definitions/users_steps.rb +14 -0
- data/lib/generators/echo_base/templates/features/step_definitions/web_steps.rb +219 -0
- data/lib/generators/echo_base/templates/features/support/env.rb +57 -0
- data/lib/generators/echo_base/templates/features/support/paths.rb +39 -0
- data/lib/generators/echo_base/templates/public/404.html +26 -0
- data/lib/generators/echo_base/templates/public/422.html +26 -0
- data/lib/generators/echo_base/templates/public/500.html +26 -0
- data/lib/generators/echo_base/templates/public/favicon.ico +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/arrow.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/avatar.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/boxbar-background.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/breadcrumb.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/button-background-active.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/button-background.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/24/about +12 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/24/anchor-hover.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/24/anchor.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/24/cross-hover.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/24/cross.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/24/download-hover.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/24/download.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/24/edit-hover.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/24/edit.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/24/export-hover.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/24/export.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/24/show-hover.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/24/show.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/add.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/application_edit.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/calendar-hover.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/calendar.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/cross.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/delete.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/download.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/edit.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/key.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/pdf.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/search.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/see-less.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/see-more.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/send-mail.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/show.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/source +1 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/tick.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/upload.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/logo.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/menubar-background.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/search-button.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/session/account.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/session/config.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/session/home.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/session/logout.png +0 -0
- data/lib/generators/echo_base/templates/public/images/web-app-theme/tipsy.gif +0 -0
- data/lib/generators/echo_base/templates/public/javascripts/application.js +2 -0
- data/lib/generators/echo_base/templates/public/javascripts/dd_belatedpng.js +328 -0
- data/lib/generators/echo_base/templates/public/javascripts/jquery-1.4.2.min.js +154 -0
- data/lib/generators/echo_base/templates/public/javascripts/modernizr-1.5.min.js +28 -0
- data/lib/generators/echo_base/templates/public/javascripts/rails.js +132 -0
- data/lib/generators/echo_base/templates/public/robots.txt +5 -0
- data/lib/generators/echo_base/templates/public/stylesheets/.gitkeep +0 -0
- data/lib/generators/echo_base/templates/public/stylesheets/handheld.css +7 -0
- data/lib/generators/echo_base/templates/public/stylesheets/style.css +571 -0
- data/lib/generators/echo_base/templates/public/stylesheets/web-app-theme/base.css +397 -0
- data/lib/generators/echo_base/templates/public/stylesheets/web-app-theme/override.css +1 -0
- data/lib/generators/echo_base/templates/public/stylesheets/web-app-theme/themes/default/images/arrow.png +0 -0
- data/lib/generators/echo_base/templates/public/stylesheets/web-app-theme/themes/default/images/boxbar-background.png +0 -0
- data/lib/generators/echo_base/templates/public/stylesheets/web-app-theme/themes/default/images/button-background-active.png +0 -0
- data/lib/generators/echo_base/templates/public/stylesheets/web-app-theme/themes/default/images/button-background.png +0 -0
- data/lib/generators/echo_base/templates/public/stylesheets/web-app-theme/themes/default/images/menubar-background.png +0 -0
- data/lib/generators/echo_base/templates/public/stylesheets/web-app-theme/themes/default/style.css +466 -0
- data/lib/generators/echo_base/templates/spec/controllers/sessions_controller_spec.rb +5 -0
- data/lib/generators/echo_base/templates/spec/controllers/users_controller_spec.rb +125 -0
- data/lib/generators/echo_base/templates/spec/helpers/users_helper_spec.rb +15 -0
- data/lib/generators/echo_base/templates/spec/models/authorization_spec.rb +5 -0
- data/lib/generators/echo_base/templates/spec/models/user_spec.rb +5 -0
- data/lib/generators/echo_base/templates/spec/routing/users_routing_spec.rb +35 -0
- data/lib/generators/echo_base/templates/spec/spec_helper.rb +16 -0
- data/lib/generators/echo_base/templates/spec/views/users/edit.html.erb_spec.rb +27 -0
- data/lib/generators/echo_base/templates/spec/views/users/index.html.erb_spec.rb +36 -0
- data/lib/generators/echo_base/templates/spec/views/users/new.html.erb_spec.rb +27 -0
- data/lib/generators/echo_base/templates/spec/views/users/show.html.erb_spec.rb +27 -0
- data/test/helper.rb +10 -0
- data/test/test_echo_base.rb +7 -0
- metadata +145 -36
- data/Gemfile +0 -4
- data/lib/echo_base/version.rb +0 -3
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module NavigationHelpers
|
|
2
|
+
# Maps a name to a path. Used by the
|
|
3
|
+
#
|
|
4
|
+
# When /^I go to (.+)$/ do |page_name|
|
|
5
|
+
#
|
|
6
|
+
# step definition in web_steps.rb
|
|
7
|
+
#
|
|
8
|
+
def path_to(page_name)
|
|
9
|
+
case page_name
|
|
10
|
+
|
|
11
|
+
when /the home\s?page/
|
|
12
|
+
'/'
|
|
13
|
+
when /the new authentication page/
|
|
14
|
+
new_authentication_path
|
|
15
|
+
|
|
16
|
+
when /the new users page/
|
|
17
|
+
new_users_path
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# Add more mappings here.
|
|
21
|
+
# Here is an example that pulls values out of the Regexp:
|
|
22
|
+
#
|
|
23
|
+
# when /^(.*)'s profile page$/i
|
|
24
|
+
# user_profile_path(User.find_by_login($1))
|
|
25
|
+
|
|
26
|
+
else
|
|
27
|
+
begin
|
|
28
|
+
page_name =~ /the (.*) page/
|
|
29
|
+
path_components = $1.split(/\s+/)
|
|
30
|
+
self.send(path_components.push('path').join('_').to_sym)
|
|
31
|
+
rescue Object => e
|
|
32
|
+
raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
|
|
33
|
+
"Now, go and add a mapping in #{__FILE__}"
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
World(NavigationHelpers)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>The page you were looking for doesn't exist (404)</title>
|
|
5
|
+
<style type="text/css">
|
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
|
7
|
+
div.dialog {
|
|
8
|
+
width: 25em;
|
|
9
|
+
padding: 0 4em;
|
|
10
|
+
margin: 4em auto 0 auto;
|
|
11
|
+
border: 1px solid #ccc;
|
|
12
|
+
border-right-color: #999;
|
|
13
|
+
border-bottom-color: #999;
|
|
14
|
+
}
|
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<!-- This file lives in public/404.html -->
|
|
21
|
+
<div class="dialog">
|
|
22
|
+
<h1>The page you were looking for doesn't exist.</h1>
|
|
23
|
+
<p>You may have mistyped the address or the page may have moved.</p>
|
|
24
|
+
</div>
|
|
25
|
+
</body>
|
|
26
|
+
</html>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>The change you wanted was rejected (422)</title>
|
|
5
|
+
<style type="text/css">
|
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
|
7
|
+
div.dialog {
|
|
8
|
+
width: 25em;
|
|
9
|
+
padding: 0 4em;
|
|
10
|
+
margin: 4em auto 0 auto;
|
|
11
|
+
border: 1px solid #ccc;
|
|
12
|
+
border-right-color: #999;
|
|
13
|
+
border-bottom-color: #999;
|
|
14
|
+
}
|
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<!-- This file lives in public/422.html -->
|
|
21
|
+
<div class="dialog">
|
|
22
|
+
<h1>The change you wanted was rejected.</h1>
|
|
23
|
+
<p>Maybe you tried to change something you didn't have access to.</p>
|
|
24
|
+
</div>
|
|
25
|
+
</body>
|
|
26
|
+
</html>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>We're sorry, but something went wrong (500)</title>
|
|
5
|
+
<style type="text/css">
|
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
|
7
|
+
div.dialog {
|
|
8
|
+
width: 25em;
|
|
9
|
+
padding: 0 4em;
|
|
10
|
+
margin: 4em auto 0 auto;
|
|
11
|
+
border: 1px solid #ccc;
|
|
12
|
+
border-right-color: #999;
|
|
13
|
+
border-bottom-color: #999;
|
|
14
|
+
}
|
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<!-- This file lives in public/500.html -->
|
|
21
|
+
<div class="dialog">
|
|
22
|
+
<h1>We're sorry, but something went wrong.</h1>
|
|
23
|
+
<p>We've been notified about this issue and we'll take a look at it shortly.</p>
|
|
24
|
+
</div>
|
|
25
|
+
</body>
|
|
26
|
+
</html>
|
|
File without changes
|
|
Binary file
|
|
Binary file
|
data/lib/generators/echo_base/templates/public/images/web-app-theme/button-background-active.png
ADDED
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
The icons here listed belong to the "Fugue Icons" library available at "http://p.yusukekamiyamane.com".
|
|
2
|
+
|
|
3
|
+
To add a new icon, enlarge the icon canvas to 24x24 pixels.
|
|
4
|
+
Give it the name 'action-hover.png', where 'action' is the name of the action related to the button.
|
|
5
|
+
|
|
6
|
+
To create an icon 'action.png' using an icon 'action-hover.png' do the following steps:
|
|
7
|
+
- Transparency 40%
|
|
8
|
+
- Saturation -30 (in a range between -100 and 100)
|
|
9
|
+
- Brightness +30 (in a range between -100 and 100)
|
|
10
|
+
- Yellow channel -20 (color_balance tool, in a range between -100 and 100).
|
|
11
|
+
|
|
12
|
+
Gimp was used to create this.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/24/download-hover.png
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
data/lib/generators/echo_base/templates/public/images/web-app-theme/icons/application_edit.png
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
The icons here listed belong to the "Fugue Icons" library available at "http://p.yusukekamiyamane.com".
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DD_belatedPNG: Adds IE6 support: PNG images for CSS background-image and HTML <IMG/>.
|
|
3
|
+
* Author: Drew Diller
|
|
4
|
+
* Email: drew.diller@gmail.com
|
|
5
|
+
* URL: http://www.dillerdesign.com/experiment/DD_belatedPNG/
|
|
6
|
+
* Version: 0.0.8a
|
|
7
|
+
* Licensed under the MIT License: http://dillerdesign.com/experiment/DD_belatedPNG/#license
|
|
8
|
+
*
|
|
9
|
+
* Example usage:
|
|
10
|
+
* DD_belatedPNG.fix('.png_bg'); // argument is a CSS selector
|
|
11
|
+
* DD_belatedPNG.fixPng( someNode ); // argument is an HTMLDomElement
|
|
12
|
+
**/
|
|
13
|
+
|
|
14
|
+
/*
|
|
15
|
+
PLEASE READ:
|
|
16
|
+
Absolutely everything in this script is SILLY. I know this. IE's rendering of certain pixels doesn't make sense, so neither does this code!
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
var DD_belatedPNG = {
|
|
20
|
+
ns: 'DD_belatedPNG',
|
|
21
|
+
imgSize: {},
|
|
22
|
+
delay: 10,
|
|
23
|
+
nodesFixed: 0,
|
|
24
|
+
createVmlNameSpace: function () { /* enable VML */
|
|
25
|
+
if (document.namespaces && !document.namespaces[this.ns]) {
|
|
26
|
+
document.namespaces.add(this.ns, 'urn:schemas-microsoft-com:vml');
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
createVmlStyleSheet: function () { /* style VML, enable behaviors */
|
|
30
|
+
/*
|
|
31
|
+
Just in case lots of other developers have added
|
|
32
|
+
lots of other stylesheets using document.createStyleSheet
|
|
33
|
+
and hit the 31-limit mark, let's not use that method!
|
|
34
|
+
further reading: http://msdn.microsoft.com/en-us/library/ms531194(VS.85).aspx
|
|
35
|
+
*/
|
|
36
|
+
var screenStyleSheet, printStyleSheet;
|
|
37
|
+
screenStyleSheet = document.createElement('style');
|
|
38
|
+
screenStyleSheet.setAttribute('media', 'screen');
|
|
39
|
+
document.documentElement.firstChild.insertBefore(screenStyleSheet, document.documentElement.firstChild.firstChild);
|
|
40
|
+
if (screenStyleSheet.styleSheet) {
|
|
41
|
+
screenStyleSheet = screenStyleSheet.styleSheet;
|
|
42
|
+
screenStyleSheet.addRule(this.ns + '\\:*', '{behavior:url(#default#VML)}');
|
|
43
|
+
screenStyleSheet.addRule(this.ns + '\\:shape', 'position:absolute;');
|
|
44
|
+
screenStyleSheet.addRule('img.' + this.ns + '_sizeFinder', 'behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;'); /* large negative top value for avoiding vertical scrollbars for large images, suggested by James O'Brien, http://www.thanatopsic.org/hendrik/ */
|
|
45
|
+
this.screenStyleSheet = screenStyleSheet;
|
|
46
|
+
|
|
47
|
+
/* Add a print-media stylesheet, for preventing VML artifacts from showing up in print (including preview). */
|
|
48
|
+
/* Thanks to Rémi Prévost for automating this! */
|
|
49
|
+
printStyleSheet = document.createElement('style');
|
|
50
|
+
printStyleSheet.setAttribute('media', 'print');
|
|
51
|
+
document.documentElement.firstChild.insertBefore(printStyleSheet, document.documentElement.firstChild.firstChild);
|
|
52
|
+
printStyleSheet = printStyleSheet.styleSheet;
|
|
53
|
+
printStyleSheet.addRule(this.ns + '\\:*', '{display: none !important;}');
|
|
54
|
+
printStyleSheet.addRule('img.' + this.ns + '_sizeFinder', '{display: none !important;}');
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
readPropertyChange: function () {
|
|
58
|
+
var el, display, v;
|
|
59
|
+
el = event.srcElement;
|
|
60
|
+
if (!el.vmlInitiated) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (event.propertyName.search('background') != -1 || event.propertyName.search('border') != -1) {
|
|
64
|
+
DD_belatedPNG.applyVML(el);
|
|
65
|
+
}
|
|
66
|
+
if (event.propertyName == 'style.display') {
|
|
67
|
+
display = (el.currentStyle.display == 'none') ? 'none' : 'block';
|
|
68
|
+
for (v in el.vml) {
|
|
69
|
+
if (el.vml.hasOwnProperty(v)) {
|
|
70
|
+
el.vml[v].shape.style.display = display;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (event.propertyName.search('filter') != -1) {
|
|
75
|
+
DD_belatedPNG.vmlOpacity(el);
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
vmlOpacity: function (el) {
|
|
79
|
+
if (el.currentStyle.filter.search('lpha') != -1) {
|
|
80
|
+
var trans = el.currentStyle.filter;
|
|
81
|
+
trans = parseInt(trans.substring(trans.lastIndexOf('=')+1, trans.lastIndexOf(')')), 10)/100;
|
|
82
|
+
el.vml.color.shape.style.filter = el.currentStyle.filter; /* complete guesswork */
|
|
83
|
+
el.vml.image.fill.opacity = trans; /* complete guesswork */
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
handlePseudoHover: function (el) {
|
|
87
|
+
setTimeout(function () { /* wouldn't work as intended without setTimeout */
|
|
88
|
+
DD_belatedPNG.applyVML(el);
|
|
89
|
+
}, 1);
|
|
90
|
+
},
|
|
91
|
+
/**
|
|
92
|
+
* This is the method to use in a document.
|
|
93
|
+
* @param {String} selector - REQUIRED - a CSS selector, such as '#doc .container'
|
|
94
|
+
**/
|
|
95
|
+
fix: function (selector) {
|
|
96
|
+
if (this.screenStyleSheet) {
|
|
97
|
+
var selectors, i;
|
|
98
|
+
selectors = selector.split(','); /* multiple selectors supported, no need for multiple calls to this anymore */
|
|
99
|
+
for (i=0; i<selectors.length; i++) {
|
|
100
|
+
this.screenStyleSheet.addRule(selectors[i], 'behavior:expression(DD_belatedPNG.fixPng(this))'); /* seems to execute the function without adding it to the stylesheet - interesting... */
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
applyVML: function (el) {
|
|
105
|
+
el.runtimeStyle.cssText = '';
|
|
106
|
+
this.vmlFill(el);
|
|
107
|
+
this.vmlOffsets(el);
|
|
108
|
+
this.vmlOpacity(el);
|
|
109
|
+
if (el.isImg) {
|
|
110
|
+
this.copyImageBorders(el);
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
attachHandlers: function (el) {
|
|
114
|
+
var self, handlers, handler, moreForAs, a, h;
|
|
115
|
+
self = this;
|
|
116
|
+
handlers = {resize: 'vmlOffsets', move: 'vmlOffsets'};
|
|
117
|
+
if (el.nodeName == 'A') {
|
|
118
|
+
moreForAs = {mouseleave: 'handlePseudoHover', mouseenter: 'handlePseudoHover', focus: 'handlePseudoHover', blur: 'handlePseudoHover'};
|
|
119
|
+
for (a in moreForAs) {
|
|
120
|
+
if (moreForAs.hasOwnProperty(a)) {
|
|
121
|
+
handlers[a] = moreForAs[a];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
for (h in handlers) {
|
|
126
|
+
if (handlers.hasOwnProperty(h)) {
|
|
127
|
+
handler = function () {
|
|
128
|
+
self[handlers[h]](el);
|
|
129
|
+
};
|
|
130
|
+
el.attachEvent('on' + h, handler);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
el.attachEvent('onpropertychange', this.readPropertyChange);
|
|
134
|
+
},
|
|
135
|
+
giveLayout: function (el) {
|
|
136
|
+
el.style.zoom = 1;
|
|
137
|
+
if (el.currentStyle.position == 'static') {
|
|
138
|
+
el.style.position = 'relative';
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
copyImageBorders: function (el) {
|
|
142
|
+
var styles, s;
|
|
143
|
+
styles = {'borderStyle':true, 'borderWidth':true, 'borderColor':true};
|
|
144
|
+
for (s in styles) {
|
|
145
|
+
if (styles.hasOwnProperty(s)) {
|
|
146
|
+
el.vml.color.shape.style[s] = el.currentStyle[s];
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
vmlFill: function (el) {
|
|
151
|
+
if (!el.currentStyle) {
|
|
152
|
+
return;
|
|
153
|
+
} else {
|
|
154
|
+
var elStyle, noImg, lib, v, img, imgLoaded;
|
|
155
|
+
elStyle = el.currentStyle;
|
|
156
|
+
}
|
|
157
|
+
for (v in el.vml) {
|
|
158
|
+
if (el.vml.hasOwnProperty(v)) {
|
|
159
|
+
el.vml[v].shape.style.zIndex = elStyle.zIndex;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
el.runtimeStyle.backgroundColor = '';
|
|
163
|
+
el.runtimeStyle.backgroundImage = '';
|
|
164
|
+
noImg = true;
|
|
165
|
+
if (elStyle.backgroundImage != 'none' || el.isImg) {
|
|
166
|
+
if (!el.isImg) {
|
|
167
|
+
el.vmlBg = elStyle.backgroundImage;
|
|
168
|
+
el.vmlBg = el.vmlBg.substr(5, el.vmlBg.lastIndexOf('")')-5);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
el.vmlBg = el.src;
|
|
172
|
+
}
|
|
173
|
+
lib = this;
|
|
174
|
+
if (!lib.imgSize[el.vmlBg]) { /* determine size of loaded image */
|
|
175
|
+
img = document.createElement('img');
|
|
176
|
+
lib.imgSize[el.vmlBg] = img;
|
|
177
|
+
img.className = lib.ns + '_sizeFinder';
|
|
178
|
+
img.runtimeStyle.cssText = 'behavior:none; position:absolute; left:-10000px; top:-10000px; border:none; margin:0; padding:0;'; /* make sure to set behavior to none to prevent accidental matching of the helper elements! */
|
|
179
|
+
imgLoaded = function () {
|
|
180
|
+
this.width = this.offsetWidth; /* weird cache-busting requirement! */
|
|
181
|
+
this.height = this.offsetHeight;
|
|
182
|
+
lib.vmlOffsets(el);
|
|
183
|
+
};
|
|
184
|
+
img.attachEvent('onload', imgLoaded);
|
|
185
|
+
img.src = el.vmlBg;
|
|
186
|
+
img.removeAttribute('width');
|
|
187
|
+
img.removeAttribute('height');
|
|
188
|
+
document.body.insertBefore(img, document.body.firstChild);
|
|
189
|
+
}
|
|
190
|
+
el.vml.image.fill.src = el.vmlBg;
|
|
191
|
+
noImg = false;
|
|
192
|
+
}
|
|
193
|
+
el.vml.image.fill.on = !noImg;
|
|
194
|
+
el.vml.image.fill.color = 'none';
|
|
195
|
+
el.vml.color.shape.style.backgroundColor = elStyle.backgroundColor;
|
|
196
|
+
el.runtimeStyle.backgroundImage = 'none';
|
|
197
|
+
el.runtimeStyle.backgroundColor = 'transparent';
|
|
198
|
+
},
|
|
199
|
+
/* IE can't figure out what do when the offsetLeft and the clientLeft add up to 1, and the VML ends up getting fuzzy... so we have to push/enlarge things by 1 pixel and then clip off the excess */
|
|
200
|
+
vmlOffsets: function (el) {
|
|
201
|
+
var thisStyle, size, fudge, makeVisible, bg, bgR, dC, altC, b, c, v;
|
|
202
|
+
thisStyle = el.currentStyle;
|
|
203
|
+
size = {'W':el.clientWidth+1, 'H':el.clientHeight+1, 'w':this.imgSize[el.vmlBg].width, 'h':this.imgSize[el.vmlBg].height, 'L':el.offsetLeft, 'T':el.offsetTop, 'bLW':el.clientLeft, 'bTW':el.clientTop};
|
|
204
|
+
fudge = (size.L + size.bLW == 1) ? 1 : 0;
|
|
205
|
+
/* vml shape, left, top, width, height, origin */
|
|
206
|
+
makeVisible = function (vml, l, t, w, h, o) {
|
|
207
|
+
vml.coordsize = w+','+h;
|
|
208
|
+
vml.coordorigin = o+','+o;
|
|
209
|
+
vml.path = 'm0,0l'+w+',0l'+w+','+h+'l0,'+h+' xe';
|
|
210
|
+
vml.style.width = w + 'px';
|
|
211
|
+
vml.style.height = h + 'px';
|
|
212
|
+
vml.style.left = l + 'px';
|
|
213
|
+
vml.style.top = t + 'px';
|
|
214
|
+
};
|
|
215
|
+
makeVisible(el.vml.color.shape, (size.L + (el.isImg ? 0 : size.bLW)), (size.T + (el.isImg ? 0 : size.bTW)), (size.W-1), (size.H-1), 0);
|
|
216
|
+
makeVisible(el.vml.image.shape, (size.L + size.bLW), (size.T + size.bTW), (size.W), (size.H), 1 );
|
|
217
|
+
bg = {'X':0, 'Y':0};
|
|
218
|
+
if (el.isImg) {
|
|
219
|
+
bg.X = parseInt(thisStyle.paddingLeft, 10) + 1;
|
|
220
|
+
bg.Y = parseInt(thisStyle.paddingTop, 10) + 1;
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
for (b in bg) {
|
|
224
|
+
if (bg.hasOwnProperty(b)) {
|
|
225
|
+
this.figurePercentage(bg, size, b, thisStyle['backgroundPosition'+b]);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
el.vml.image.fill.position = (bg.X/size.W) + ',' + (bg.Y/size.H);
|
|
230
|
+
bgR = thisStyle.backgroundRepeat;
|
|
231
|
+
dC = {'T':1, 'R':size.W+fudge, 'B':size.H, 'L':1+fudge}; /* these are defaults for repeat of any kind */
|
|
232
|
+
altC = { 'X': {'b1': 'L', 'b2': 'R', 'd': 'W'}, 'Y': {'b1': 'T', 'b2': 'B', 'd': 'H'} };
|
|
233
|
+
if (bgR != 'repeat' || el.isImg) {
|
|
234
|
+
c = {'T':(bg.Y), 'R':(bg.X+size.w), 'B':(bg.Y+size.h), 'L':(bg.X)}; /* these are defaults for no-repeat - clips down to the image location */
|
|
235
|
+
if (bgR.search('repeat-') != -1) { /* now let's revert to dC for repeat-x or repeat-y */
|
|
236
|
+
v = bgR.split('repeat-')[1].toUpperCase();
|
|
237
|
+
c[altC[v].b1] = 1;
|
|
238
|
+
c[altC[v].b2] = size[altC[v].d];
|
|
239
|
+
}
|
|
240
|
+
if (c.B > size.H) {
|
|
241
|
+
c.B = size.H;
|
|
242
|
+
}
|
|
243
|
+
el.vml.image.shape.style.clip = 'rect('+c.T+'px '+(c.R+fudge)+'px '+c.B+'px '+(c.L+fudge)+'px)';
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
el.vml.image.shape.style.clip = 'rect('+dC.T+'px '+dC.R+'px '+dC.B+'px '+dC.L+'px)';
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
figurePercentage: function (bg, size, axis, position) {
|
|
250
|
+
var horizontal, fraction;
|
|
251
|
+
fraction = true;
|
|
252
|
+
horizontal = (axis == 'X');
|
|
253
|
+
switch(position) {
|
|
254
|
+
case 'left':
|
|
255
|
+
case 'top':
|
|
256
|
+
bg[axis] = 0;
|
|
257
|
+
break;
|
|
258
|
+
case 'center':
|
|
259
|
+
bg[axis] = 0.5;
|
|
260
|
+
break;
|
|
261
|
+
case 'right':
|
|
262
|
+
case 'bottom':
|
|
263
|
+
bg[axis] = 1;
|
|
264
|
+
break;
|
|
265
|
+
default:
|
|
266
|
+
if (position.search('%') != -1) {
|
|
267
|
+
bg[axis] = parseInt(position, 10) / 100;
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
fraction = false;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
bg[axis] = Math.ceil( fraction ? ( (size[horizontal?'W': 'H'] * bg[axis]) - (size[horizontal?'w': 'h'] * bg[axis]) ) : parseInt(position, 10) );
|
|
274
|
+
if (bg[axis] % 2 === 0) {
|
|
275
|
+
bg[axis]++;
|
|
276
|
+
}
|
|
277
|
+
return bg[axis];
|
|
278
|
+
},
|
|
279
|
+
fixPng: function (el) {
|
|
280
|
+
el.style.behavior = 'none';
|
|
281
|
+
var lib, els, nodeStr, v, e;
|
|
282
|
+
if (el.nodeName == 'BODY' || el.nodeName == 'TD' || el.nodeName == 'TR') { /* elements not supported yet */
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
el.isImg = false;
|
|
286
|
+
if (el.nodeName == 'IMG') {
|
|
287
|
+
if(el.src.toLowerCase().search(/\.png$/) != -1) {
|
|
288
|
+
el.isImg = true;
|
|
289
|
+
el.style.visibility = 'hidden';
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
else if (el.currentStyle.backgroundImage.toLowerCase().search('.png') == -1) {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
lib = DD_belatedPNG;
|
|
299
|
+
el.vml = {color: {}, image: {}};
|
|
300
|
+
els = {shape: {}, fill: {}};
|
|
301
|
+
for (v in el.vml) {
|
|
302
|
+
if (el.vml.hasOwnProperty(v)) {
|
|
303
|
+
for (e in els) {
|
|
304
|
+
if (els.hasOwnProperty(e)) {
|
|
305
|
+
nodeStr = lib.ns + ':' + e;
|
|
306
|
+
el.vml[v][e] = document.createElement(nodeStr);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
el.vml[v].shape.stroked = false;
|
|
310
|
+
el.vml[v].shape.appendChild(el.vml[v].fill);
|
|
311
|
+
el.parentNode.insertBefore(el.vml[v].shape, el);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
el.vml.image.shape.fillcolor = 'none'; /* Don't show blank white shapeangle when waiting for image to load. */
|
|
315
|
+
el.vml.image.fill.type = 'tile'; /* Makes image show up. */
|
|
316
|
+
el.vml.color.fill.on = false; /* Actually going to apply vml element's style.backgroundColor, so hide the whiteness. */
|
|
317
|
+
lib.attachHandlers(el);
|
|
318
|
+
lib.giveLayout(el);
|
|
319
|
+
lib.giveLayout(el.offsetParent);
|
|
320
|
+
el.vmlInitiated = true;
|
|
321
|
+
lib.applyVML(el); /* Render! */
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
try {
|
|
325
|
+
document.execCommand("BackgroundImageCache", false, true); /* TredoSoft Multiple IE doesn't like this, so try{} it */
|
|
326
|
+
} catch(r) {}
|
|
327
|
+
DD_belatedPNG.createVmlNameSpace();
|
|
328
|
+
DD_belatedPNG.createVmlStyleSheet();
|