fix timing issues on failing scenarios. Fix deprecated jquery functions and update jqueryui

Signed-off-by: Reinier Balt <lrbalt@gmail.com>
This commit is contained in:
Reinier Balt 2013-02-15 20:51:35 +01:00
parent 98fbbccdcb
commit 1b0d08bbb5
39 changed files with 715 additions and 600 deletions

View file

@ -2,7 +2,7 @@ GEM
remote: https://rubygems.org/
specs:
RedCloth (4.2.9)
aasm (3.0.15)
aasm (3.0.16)
actionmailer (3.2.12)
actionpack (= 3.2.12)
mail (~> 2.4.4)
@ -31,7 +31,6 @@ GEM
i18n (~> 0.6)
multi_json (~> 1.0)
acts_as_list (0.1.9)
addressable (2.3.2)
arel (3.0.2)
aruba (0.5.1)
childprocess (~> 0.3.6)
@ -51,8 +50,8 @@ GEM
rack-test (>= 0.5.4)
selenium-webdriver (~> 2.0)
xpath (~> 1.0.0)
childprocess (0.3.6)
ffi (~> 1.0, >= 1.0.6)
childprocess (0.3.8)
ffi (~> 1.0, >= 1.0.11)
coffee-rails (3.2.2)
coffee-script (>= 2.2.0)
railties (~> 3.2.0)
@ -74,36 +73,33 @@ GEM
erubis (2.7.0)
execjs (1.4.0)
multi_json (~> 1.0)
factory_girl (4.1.0)
factory_girl (4.2.0)
activesupport (>= 3.0.0)
factory_girl_rails (4.1.0)
factory_girl (~> 4.1.0)
factory_girl_rails (4.2.1)
factory_girl (~> 4.2.0)
railties (>= 3.0.0)
ffi (1.2.0)
ffi (1.3.1)
formatize (1.1.0)
RedCloth (~> 4.2)
actionpack (~> 3.0)
bluecloth (~> 2.2)
gherkin (2.11.5)
json (>= 1.4.6)
gherkin (2.11.6)
json (>= 1.7.6)
hike (1.2.1)
htmlentities (4.3.1)
i18n (0.6.1)
journey (1.0.4)
jquery-rails (2.1.4)
jquery-rails (2.2.1)
railties (>= 3.0, < 5.0)
thor (>= 0.14, < 2.0)
json (1.7.7)
libv8 (3.11.8.13)
libwebsocket (0.1.7.1)
addressable
websocket
mail (2.4.4)
i18n (>= 0.4.0)
mime-types (~> 1.16)
treetop (~> 1.4.8)
mime-types (1.21)
multi_json (1.5.1)
multi_json (1.6.1)
mysql2 (0.3.11)
nokogiri (1.5.6)
polyglot (0.3.3)
@ -140,18 +136,19 @@ GEM
rspec-expectations (2.12.1)
diff-lcs (~> 1.1.3)
rubyzip (0.9.9)
safe_yaml (0.7.1)
sanitize (2.0.3)
nokogiri (>= 1.4.4, < 1.6)
sass (3.2.5)
sass-rails (3.2.5)
sass-rails (3.2.6)
railties (~> 3.2.0)
sass (>= 3.1.10)
tilt (~> 1.3)
selenium-webdriver (2.27.2)
selenium-webdriver (2.29.0)
childprocess (>= 0.2.5)
libwebsocket (~> 0.1.3)
multi_json (~> 1.0)
rubyzip
websocket (~> 1.0.4)
simplecov (0.7.1)
multi_json (~> 1.0)
simplecov-html (~> 0.7.1)
@ -161,7 +158,7 @@ GEM
multi_json (~> 1.0)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
sqlite3 (1.3.6)
sqlite3 (1.3.7)
swf_fu (2.0.3)
coffee-script
rails (>= 3.1)
@ -170,10 +167,10 @@ GEM
ref
thor (0.17.0)
tilt (1.3.3)
timecop (0.5.7)
tolk (1.3.4)
timecop (0.5.9.2)
tolk (1.3.5)
safe_yaml
will_paginate
ya2yaml (~> 0.26)
treetop (1.4.12)
polyglot
polyglot (>= 0.3.1)
@ -182,12 +179,11 @@ GEM
execjs (>= 0.3.0)
multi_json (~> 1.0, >= 1.0.2)
uniform_notifier (1.1.1)
websocket (1.0.6)
will_paginate (3.0.3)
websocket (1.0.7)
will_paginate (3.0.4)
xpath (1.0.0)
nokogiri (~> 1.3)
ya2yaml (0.31)
yard (0.8.3)
yard (0.8.4.1)
PLATFORMS
ruby

View file

@ -17,7 +17,7 @@
//= require tracks.js
// Stuff in vendor/assets
//= require jquery-ui-1.9.0.custom.min
//= require jquery-ui-1.10.0.custom.min
//= require jquery.ui.touch-punch.min
//= require jquery.blockUI
//= require jquery.cookie

View file

@ -70,7 +70,7 @@ var TracksForm = {
});
/* add behavior to clear the date both buttons for show_from and due */
$(".date_clear").live('click', function() {
$(document).on("click", ".date_clear", function() {
$(this).prev().val('');
});
@ -79,7 +79,7 @@ var TracksForm = {
});
/* submit todo form after entering new todo */
$("button#todo_new_action_submit").live('click', function (ev) {
$(document).on("click", "button#todo_new_action_submit", function (ev) {
if ($('input#predecessor_input').val() != "")
if (!confirm(i18n['todos.unresolved_dependency']))
return false;
@ -89,14 +89,14 @@ var TracksForm = {
});
/* submit multi-todo form after entering multiple new todos */
$("button#todo_multi_new_action_submit").live('click', function (ev) {
$(document).on("click", "button#todo_multi_new_action_submit", function (ev) {
if (TodoItems.askIfNewContextProvided('multi_', this))
submit_with_ajax_and_block_element('form#todo-form-multi-new-action', $(this));
return false;
});
},
enable_dependency_delete: function() {
$('a[class=icon_delete_dep]').live('click', function() {
$(document).on("click", 'a[class=icon_delete_dep]', function() {
var form = $(this).parents('form').get(0);
var predecessor_list = $(form).find('input[name=predecessor_list]');
var id_list = split( predecessor_list.val() );
@ -506,30 +506,30 @@ var TodoItems = {
},
setup_behavior: function() {
/* show the notes of a todo */
$(".show_notes").live('click', function () {
$(document).on("click",".show_notes", function () {
$(this).next().toggle("fast");
return false;
});
$(".show_successors").live('click', function () {
$(document).on("click",".show_successors", function () {
$(this).next().toggle("fast");
return false;
});
/* set behavior for star icon */
$(".item-container a.star_item").live('click', function (ev){
$(document).on("click", ".item-container a.star_item", function (ev){
put_with_ajax_and_block_element(this.href, $(this));
return false;
});
/* set behavior for toggle checkboxes for Recurring Todos */
$(".item-container input.item-checkbox").live('click', function(ev){
$(document).on("click", ".item-container input.item-checkbox", function(ev){
put_with_ajax_and_block_element(this.value, $(this).parents(".item-container"));
return false;
});
/* set behavior for edit icon */
$(".item-container a.edit_item").live('click', function (ev){
$(document).on("click", ".item-container a.edit_item", function (ev){
var ajax_options = default_ajax_options_for_scripts('GET', this.href, $(this).parents('.item-container'));
var id = this.id.substr(15);
ajax_options.complete.push( function(){
@ -540,7 +540,7 @@ var TodoItems = {
});
/* delete button to delete a todo from the list */
$('.item-container a.icon_delete_item').live('click', function(evt){
$(document).on("click",".item-container a.icon_delete_item", function(evt){
var confirm_message = $(this).attr("x_confirm_message")
if(confirm(confirm_message)){
delete_with_ajax_and_block_element(this.href, $(this).parents('.item-container'));
@ -549,13 +549,13 @@ var TodoItems = {
});
/* submit todo form after edit */
$("form.edit_todo_form button.positive").live('click', function (ev) {
$(document).on("click","form.edit_todo_form button.positive", function(evt) {
submit_with_ajax_and_block_element('form.edit_todo_form', $(this));
return false;
});
// for cancelling edit todo form
$('form.edit_todo_form a.negative').live('click', function(){
$(document).on("click",'form.edit_todo_form a.negative', function(){
$(this).parents('.edit-form').fadeOut(200, function () {
$(this).parents('.list').find('.project').fadeIn(500);
$(this).parents('.container').find('.item-show').fadeIn(500);
@ -563,7 +563,7 @@ var TodoItems = {
});
// defer a todo
$(".item-container a.icon_defer_item").live('click', function(ev){
$(document).on("click",".item-container a.icon_defer_item", function(ev){
if ($(this).attr("x_defer_alert") == "true")
alert ($(this).attr("x_defer_date_after_due_date"));
else
@ -572,7 +572,7 @@ var TodoItems = {
});
/* delete button to delete a dependency from the list */
$('.item-container a.delete_dependency_button').live('click', function(evt){
$(document).on("click",'.item-container a.delete_dependency_button', function(evt){
var predecessor_id=$(this).attr("x_predecessors_id");
var ajax_options = default_ajax_options_for_scripts('DELETE', this.href, $(this).parents('.item-container'));
ajax_options.data += "&predecessor="+predecessor_id
@ -609,7 +609,7 @@ var ProjectItems = {
var UsersPage = {
setup_behavior: function() {
/* delete button to delete a user from the list */
$('a.delete_user_button').live('click', function(evt){
$(document).on("click",'a.delete_user_button', function(evt){
var confirm_message = $(this).attr("x_confirm_message")
if(confirm(confirm_message)){
delete_with_ajax_and_block_element(this.href, $(this).parents('.project'));
@ -704,7 +704,7 @@ var ProjectListPage = {
});
/* alphabetize project list */
$('.alphabetize_link').live('click', function(evt){
$(document).on("click",'.alphabetize_link', function(evt) {
var confirm_message = $(this).attr("x_confirm_message")
if(confirm(confirm_message)){
post_with_ajax_and_block_element(this.href, $(this).parents('.alpha_sort'));
@ -722,7 +722,7 @@ var ProjectListPage = {
});
/* delete button to delete a project from the list */
$('a.delete_project_button').live('click', function(evt){
$(document).on("click",'a.delete_project_button', function(evt){
var confirm_message = $(this).attr("x_confirm_message")
if(confirm(confirm_message)){
delete_with_ajax_and_block_element(this.href, $(this).parents('.project'));
@ -731,21 +731,21 @@ var ProjectListPage = {
});
/* set behavior for edit project settings link in both projects list page and project page */
$("a.project_edit_settings").live('click', function (evt) {
$(document).on("click","a.project_edit_settings", function (evt) {
$(this).parent().parent().addClass('project-edit-current'); /* mark project in list */
get_with_ajax_and_block_element(this.href, $(this).parent().parent());
return false;
});
/* submit project form after edit */
$("form.edit-project-form button.positive").live('click', function (ev) {
$(document).on("click", "form.edit-project-form button.positive", function (ev) {
$('div#project_name').editable('enable');
submit_with_ajax_and_block_element('form.edit-project-form', $(this));
return false;
});
/* cancel edit project form */
$('form.edit-project-form a.negative').live('click', function(){
$(document).on("click",'form.edit-project-form a.negative', function(){
$('div#project_name').editable('enable');
$(this).parents('.edit-form').fadeOut(200, function () {
$(this).parents('.project-edit-current').removeClass('project-edit-current');
@ -755,7 +755,7 @@ var ProjectListPage = {
});
/* submit project form after entering new project */
$("form#project_form button.positive").live('click', function (ev) {
$(document).on("click","form#project_form button.positive", function(evt) {
submit_with_ajax_and_block_element('form#project_form', $(this));
return false;
});
@ -820,7 +820,7 @@ var ContextListPage = {
});
/* delete a context using the x button */
$('a.delete_context_button').live('click', function(evt){
$(document).on("click",'a.delete_context_button', function(evt){
var confirm_message = $(this).attr("x_confirm_message")
if(confirm(confirm_message)){
delete_with_ajax_and_block_element(this.href, $(this).parents('.context'));
@ -829,19 +829,19 @@ var ContextListPage = {
});
/* set behavior for edit context settings link in projects list page and project page */
$("a.context_edit_settings").live('click', function (ev) {
$(document).on("click","a.context_edit_settings", function(evt) {
get_with_ajax_and_block_element(this.href, $(this).parent().parent());
return false;
});
/* submit form when editing a context */
$("form.edit-context-form button.positive").live('click', function (ev) {
$(document).on("click","form.edit-context-form button.positive", function(evt) {
submit_with_ajax_and_block_element('form.edit-context-form', $(this));
return false;
});
/* submit form for new context in sidebar */
$("form#context-form button.positive").live('click', function (ev) {
$(document).on("click","form#context-form button.positive", function(evt) {
submit_with_ajax_and_block_element('form#context-form', $(this));
return false;
});
@ -867,13 +867,13 @@ var ContextListPage = {
var IntegrationsPage = {
setup_behavior: function() {
$('#applescript1-contexts').live('change', function(){
$(document).on("change",'#applescript1-contexts', function(){
IntegrationsPage.get_script_for_context("#applescript1", "get_applescript1", this.value);
});
$('#applescript2-contexts').live('change', function(){
$(document).on("change",'#applescript2-contexts', function(){
IntegrationsPage.get_script_for_context("#applescript2", "get_applescript2", this.value);
});
$('#quicksilver-contexts').live('change', function(){
$(document).on("change",'#quicksilver-contexts', function(){
IntegrationsPage.get_script_for_context("#quicksilver", "get_quicksilver_applescript", this.value)
});
},
@ -903,14 +903,14 @@ var FeedsPage = {
var NotesPage = {
setup_behavior: function() {
/* Add note */
$(".add_note_link a").live('click', function(){
$(document).on("click",".add_note_link a", function(){
$('#new-note').show();
$('textarea#note_body').val('');
$('textarea#note_body').focus();
});
/* delete button for note */
$('a.delete_note_button').live('click', function(){
$(document).on("click",'a.delete_note_button', function(){
var confirm_message = $(this).attr("x_confirm_message")
if(confirm(confirm_message)){
delete_with_ajax_and_block_element(this.href, $(this).parents('.project_notes'));
@ -919,7 +919,7 @@ var NotesPage = {
});
/* edit button for note */
$('a.note_edit_settings').live('click', function(){
$(document).on("click",'a.note_edit_settings', function(){
var dom_id = this.id.substr(10);
$('#'+dom_id).toggle();
$('#edit_'+dom_id).show();
@ -928,7 +928,7 @@ var NotesPage = {
});
/* cancel button when editing a note */
$('.edit-note-form a.negative').live('click', function(){
$(document).on("click",'.edit-note-form a.negative', function(){
var dom_id = this.id.substr(14);
/* dom_id == 'note_XX' on notes page and just 'note' on project page */
if (dom_id == 'note') {
@ -941,7 +941,7 @@ var NotesPage = {
});
/* update button when editing a note */
$("form.edit-note-form button.positive").live('click', function (ev) {
$(document).on("click","form.edit-note-form button.positive", function(evt) {
submit_with_ajax_and_block_element($(this).parents('form.edit-note-form'), $(this));
return false;
});
@ -968,7 +968,7 @@ var RecurringTodosPage = {
},
setup_behavior: function() {
/* add new recurring todo plus-button in sidebar */
$("#add-new-recurring-todo").live('click', function(){
$(document).on("click","#add-new-recurring-todo", function(){
$( "#new-recurring-todo" ).dialog( "open" );
});
@ -999,7 +999,7 @@ var RecurringTodosPage = {
});
/* change recurring period radio input on new form */
$("#recurring_period input").live('click', function(){
$(document).on("click","#recurring_period input", function(){
RecurringTodosPage.hide_all_recurring();
$('#recurring_'+this.id.split('_')[4]).show();
});
@ -1032,19 +1032,19 @@ var RecurringTodosPage = {
});
/* change recurring period radio input on edit form */
$("#recurring_edit_period input").live('click', function(){
$(document).on("click","#recurring_edit_period input", function(){
RecurringTodosPage.hide_all_edit_recurring();
$('#recurring_edit_'+this.id.split('_')[5]).show();
});
/* set behavior for edit recurring todo */
$(".item-container a.edit_icon").live('click', function (ev){
$(document).on("click",".item-container a.edit_icon", function(evt){
get_with_ajax_and_block_element(this.href, $(this).parents(".item-container"));
return false;
});
/* delete button to delete a todo from the list */
$('.item-container a.delete_icon').live('click', function(evt){
$(document).on("click",'.item-container a.delete_icon', function(evt){
var confirm_message = $(this).attr("x_confirm_message")
if(confirm(confirm_message)){
delete_with_ajax_and_block_element(this.href, $(this).parents('.project'));
@ -1082,7 +1082,7 @@ function setup_auto_refresh(interval){
}
setTimeout(refresh_page, interval);
$(function(){
$("input").live('keydown', function(){
$(document).on("keydown","input", function(){
field_touched = true;
});
});
@ -1267,13 +1267,13 @@ function enable_rich_interaction(){
TodoItems.setup_drag_and_drop();
/* have to bind on keypress because of limitations of live() */
$('input[name=project_name]').live('keypress', function(){
$(document).on("keypress",'input[name=project_name]', function(){
$(this).bind('blur', project_defaults);
});
$('input[name=context_name]').live('keypress', function(){
$(document).on("keypress",'input[name=context_name]', function(){
$(this).attr('edited', 'true');
});
$('input[name=tag_list]').live('keypress', function(){
$(document).on("keypress",'input[name=tag_list]', function(){
$(this).attr('edited', 'true');
});
@ -1291,8 +1291,10 @@ function enable_rich_interaction(){
$(document).ready(function() {
// fix for IE8. Without this checkboxes don't work AJAXy. See #1152
if($.browser.msie && ( ($.browser.version.substring(0, 2) == "8.") || ($.browser.version.substring(0, 2) == "7.") ) ) {
// fix for IE7/8. Without this checkboxes don't work AJAXy. See #1152
var msie8 = /MSIE 8.0/.test(navigator.userAgent);
var msie7 = /MSIE 7.0/.test(navigator.userAgent);
if(msie8 || msie7) {
$('body').bind('change', function() {
return true;
});

View file

@ -34,7 +34,7 @@ class ApplicationController < ActionController::Base
locale = locale || prefs.locale unless current_user.nil? # otherwise, the locale of the currently logged in user takes over
locale = locale || request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first if request.env['HTTP_ACCEPT_LANGUAGE']
I18n.locale = locale.nil? ? I18n.default_locale : (I18n::available_locales.include?(locale.to_sym) ? locale : I18n.default_locale)
logger.debug("Selected '#{I18n.locale}' as locale")
# logger.debug("Selected '#{I18n.locale}' as locale")
end
def set_session_expiration

View file

@ -0,0 +1,4 @@
<% if @saved -%>
TracksPages.page_notify('notice', '<%=t('projects.status_project_name_changed')%>', 5);
TracksForm.set_project_name("<%= escape_javascript(@project.name)%>");
<% end %>

View file

@ -1,8 +0,0 @@
#TODO: is this dead code?
page['default_project_name_id'].value = @project.name
page['todo_project_name'].value = @project.name
page << "enable_rich_interaction();"
status_message = t('projects.status_project_name_changed')
page.notify :notice, status_message, 5.0

View file

@ -13,6 +13,8 @@ end
When /^I edit the context to rename it to "([^\"]*)"$/ do |new_name|
find("a#link_edit_context_#{@context.id}").click
# wait for the form to appear (which included a submit button)
page.should have_css("button#submit_context_#{@context.id}", :visible=>true)
within "div.edit-form" do
@ -21,6 +23,8 @@ When /^I edit the context to rename it to "([^\"]*)"$/ do |new_name|
end
# wait for the form to go away
page.should_not have_css("button#submit_context_#{@context.id}", :visible => true)
# wait for the changed context to appear
page.should have_css("a#link_edit_context_#{@context.id}", :visible=> true)
end

View file

@ -133,9 +133,11 @@ end
When /^I try to edit the project name to "([^\"]*)"$/ do |new_title|
edit_project_no_wait(@project) do
within "form.edit-project-form" do
fill_in "project[name]", :with => new_title
end
end
end
When /^I edit the default context to "([^"]*)"$/ do |default_context|
edit_project(@project) do
@ -202,15 +204,20 @@ When /^I edit project settings and mark the project as reviewed$/ do
end
When /^I add a note "([^"]*)" to the project$/ do |note_body|
click_link "Add a note"
page.should have_css "div.widgets button#submit_note"
fill_in "note[body]", :with => note_body
click_button "Add note"
submit_button = "div.widgets button#submit_note"
click_link "Add a note"
page.should have_css submit_button
fill_in "note[body]", :with => note_body
elem = find(submit_button)
elem.should_not be_nil # form is hidden
elem.should_not be_visible
elem.should_not be_nil
elem.click
wait_until do
!elem.visible?
end
end
When /^I click on the first note icon$/ do
@ -248,6 +255,7 @@ Then /^I should be able to change the project name in place$/ do
# Note that this is not changing the project name
page.should have_css("div#project_name>form>input")
page.find("div#project_name > form > button[type=cancel]").click
page.should_not have_css("div#project_name>form>input")
end
Then /^I should not be able to change the project name in place$/ do

View file

@ -7,6 +7,7 @@ When /^I mark "([^"]*)" as complete$/ do |action_description|
check "mark_complete_#{todo.id}"
wait_for_ajax
wait_for_animations_to_end
end
When /^I mark "([^"]*)" as uncompleted$/ do |action_description|
@ -16,6 +17,7 @@ When /^I mark "([^"]*)" as uncompleted$/ do |action_description|
uncheck "mark_complete_#{todo.id}"
wait_for_ajax
wait_for_animations_to_end
end
When /^I mark the completed todo "([^"]*)" active$/ do |action_description|
@ -68,6 +70,8 @@ When /I change the (.*) field of "([^\"]*)" to "([^\"]*)"$/ do |field_name, todo
open_edit_form_for(todo)
within "form.edit_todo_form" do
fill_in "#{field_name}", :with => new_value
# force blur event
page.execute_script("$('form.edit_todo_form input.#{field_name}_todo_#{todo.id}').blur();")
end
submit_edit_todo_form(todo)
wait_for_ajax

View file

@ -3,6 +3,8 @@
# newer version of cucumber-rails. Consider adding your own code to a new file
# instead of editing this one. Cucumber will automatically load all features/**/*.rb
# files.
require 'simplecov'
SimpleCov.start 'rails'
require 'cucumber/rails'
@ -56,4 +58,3 @@ end
# The :transaction strategy is faster, but might give you threading problems.
# See https://github.com/cucumber/cucumber-rails/blob/master/features/choose_javascript_database_strategy.feature
Cucumber::Rails::Database.javascript_strategy = :truncation

View file

@ -9,7 +9,7 @@ Capybara.default_wait_time = 5
Capybara.javascript_driver = ENV["JS_DRIVER"] ? ENV["JS_DRIVER"].to_sym : :selenium
if Capybara.javascript_driver == :webkit
require 'capybara/webkit'
# require 'capybara/webkit'
end
if Capybara.javascript_driver == :selenium

View file

@ -22,8 +22,13 @@ module TracksStepHelper
end
def open_edit_form_for(todo)
edit_link = "div#line_todo_#{todo.id} a#icon_edit_todo_#{todo.id}"
# make sure we can open the edit form
page.should have_css(edit_link)
# on calendar page there can be more than 1 occurance of a todo, so we select the first here
all(:css, "div#line_todo_#{todo.id} a#icon_edit_todo_#{todo.id}")[0].click
all(:css, edit_link)[0].click
wait_for_ajax
wait_for_animations_to_end
end

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,10 +1,10 @@
/*!
* jQuery blockUI plugin
* Version 2.38 (29-MAR-2011)
* @requires jQuery v1.2.3 or later
* Version 2.56.0-2013.01.31
* @requires jQuery v1.7 or later
*
* Examples at: http://malsup.com/jquery/block/
* Copyright (c) 2007-2010 M. Alsup
* Copyright (c) 2007-2013 M. Alsup
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
@ -12,22 +12,21 @@
* Thanks to Amir-Hossein Sobhi for some excellent contributions!
*/
;(function($) {
if (/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) {
alert('blockUI requires jQuery v1.2.3 or later! You are using v' + $.fn.jquery);
return;
}
;(function() {
"use strict";
function setup($) {
$.fn._fadeIn = $.fn.fadeIn;
var noOp = function() {};
var noOp = $.noop || function() {};
// this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle
// retarded userAgent strings on Vista)
var msie = /MSIE/.test(navigator.userAgent);
var ie6 = /MSIE 6.0/.test(navigator.userAgent) && ! /MSIE 8.0/.test(navigator.userAgent);
var mode = document.documentMode || 0;
var setExpr = $.browser.msie && (($.browser.version < 8 && !mode) || mode < 8);
var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent) && !mode;
// var setExpr = msie && (($.browser.version < 8 && !mode) || mode < 8);
var setExpr = $.isFunction( document.createElement('div').style.setExpression );
// global $ methods for blocking/unblocking the entire page
$.blockUI = function(opts) { install(window, opts); };
@ -38,7 +37,7 @@ $.growlUI = function(title, message, timeout, onClose) {
var $m = $('<div class="growlUI"></div>');
if (title) $m.append('<h1>'+title+'</h1>');
if (message) $m.append('<h2>'+message+'</h2>');
if (timeout == undefined) timeout = 3000;
if (timeout === undefined) timeout = 3000;
$.blockUI({
message: $m, fadeIn: 700, fadeOut: 1000, centerY: false,
timeout: timeout, showOverlay: false,
@ -49,11 +48,20 @@ $.growlUI = function(title, message, timeout, onClose) {
// plugin method for blocking element content
$.fn.block = function(opts) {
return this.unblock({ fadeOut: 0 }).each(function() {
if ($.css(this,'position') == 'static')
var fullOpts = $.extend({}, $.blockUI.defaults, opts || {});
this.each(function() {
var $el = $(this);
if (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked'))
return;
$el.unblock({ fadeOut: 0 });
});
return this.each(function() {
if ($.css(this,'position') == 'static') {
this.style.position = 'relative';
if ($.browser.msie)
this.style.zoom = 1; // force 'hasLayout'
$(this).data('blockUI.static', true);
}
this.style.zoom = 1; // force 'hasLayout' in ie
install(this, opts);
});
};
@ -65,7 +73,7 @@ $.fn.unblock = function(opts) {
});
};
$.blockUI.version = 2.38; // 2nd generation blocking at no extra cost!
$.blockUI.version = 2.56; // 2nd generation blocking at no extra cost!
// override these in your code to change the default behavior and style
$.blockUI.defaults = {
@ -107,6 +115,10 @@ $.blockUI.defaults = {
cursor: 'wait'
},
// style to replace wait cursor before unblocking to correct issue
// of lingering wait cursor
cursorReset: 'default',
// styles applied when using $.growlUI
growlCSS: {
width: '350px',
@ -126,6 +138,7 @@ $.blockUI.defaults = {
// IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w
// (hat tip to Jorge H. N. de Vasconcelos)
/*jshint scripturl:true */
iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',
// force usage of iframe in non-IE browsers (handy for blocking applets)
@ -166,7 +179,8 @@ $.blockUI.defaults = {
focusInput: true,
// suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)
applyPlatformOpacityRules: true,
// no longer needed in 2012
// applyPlatformOpacityRules: true,
// callback method invoked when fadeIn has completed and blocking message is visible
onBlock: null,
@ -177,11 +191,18 @@ $.blockUI.defaults = {
// onUnblock(element, options)
onUnblock: null,
// callback method invoked when the overlay area is clicked.
// setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used.
onOverlayClick: null,
// don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493
quirksmodeOffsetHack: 4,
// class name of the message block
blockMsgClass: 'blockMsg'
blockMsgClass: 'blockMsg',
// if it is already blocked, then ignore it (don't unblock and reblock)
ignoreIfBlocked: false
};
// private data and functions follow...
@ -190,12 +211,20 @@ var pageBlock = null;
var pageBlockEls = [];
function install(el, opts) {
var css, themedCSS;
var full = (el == window);
var msg = opts && opts.message !== undefined ? opts.message : undefined;
var msg = (opts && opts.message !== undefined ? opts.message : undefined);
opts = $.extend({}, $.blockUI.defaults, opts || {});
if (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked'))
return;
opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});
var css = $.extend({}, $.blockUI.defaults.css, opts.css || {});
var themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});
css = $.extend({}, $.blockUI.defaults.css, opts.css || {});
if (opts.onOverlayClick)
opts.overlayCSS.cursor = 'pointer';
themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});
msg = msg === undefined ? opts.message : msg;
// remove the current block (if there is one)
@ -217,39 +246,45 @@ function install(el, opts) {
data.parent.removeChild(node);
}
$(el).data('blockUI.onUnblock', opts.onUnblock);
var z = opts.baseZ;
// blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;
// layer1 is the iframe layer which is used to supress bleed through of underlying content
// layer2 is the overlay layer which has opacity and a wait cursor (by default)
// layer3 is the message content that is displayed while blocking
var lyr1, lyr2, lyr3, s;
if (msie || opts.forceIframe)
lyr1 = $('<iframe class="blockUI" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="'+opts.iframeSrc+'"></iframe>');
else
lyr1 = $('<div class="blockUI" style="display:none"></div>');
var lyr1 = ($.browser.msie || opts.forceIframe)
? $('<iframe class="blockUI" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="'+opts.iframeSrc+'"></iframe>')
: $('<div class="blockUI" style="display:none"></div>');
if (opts.theme)
lyr2 = $('<div class="blockUI blockOverlay ui-widget-overlay" style="z-index:'+ (z++) +';display:none"></div>');
else
lyr2 = $('<div class="blockUI blockOverlay" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>');
var lyr2 = opts.theme
? $('<div class="blockUI blockOverlay ui-widget-overlay" style="z-index:'+ (z++) +';display:none"></div>')
: $('<div class="blockUI blockOverlay" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>');
var lyr3, s;
if (opts.theme && full) {
s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all" style="z-index:'+z+';display:none;position:fixed">' +
'<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>' +
'<div class="ui-widget-content ui-dialog-content"></div>' +
'</div>';
s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all" style="z-index:'+(z+10)+';display:none;position:fixed">';
if ( opts.title ) {
s += '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>';
}
s += '<div class="ui-widget-content ui-dialog-content"></div>';
s += '</div>';
}
else if (opts.theme) {
s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all" style="z-index:'+z+';display:none;position:absolute">' +
'<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>' +
'<div class="ui-widget-content ui-dialog-content"></div>' +
'</div>';
s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all" style="z-index:'+(z+10)+';display:none;position:absolute">';
if ( opts.title ) {
s += '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>';
}
s += '<div class="ui-widget-content ui-dialog-content"></div>';
s += '</div>';
}
else if (full) {
s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage" style="z-index:'+z+';display:none;position:fixed"></div>';
s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage" style="z-index:'+(z+10)+';display:none;position:fixed"></div>';
}
else {
s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement" style="z-index:'+z+';display:none;position:absolute"></div>';
s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement" style="z-index:'+(z+10)+';display:none;position:absolute"></div>';
}
lyr3 = $(s);
@ -264,12 +299,12 @@ function install(el, opts) {
}
// style the overlay
if (!opts.theme && (!opts.applyPlatformOpacityRules || !($.browser.mozilla && /Linux/.test(navigator.platform))))
if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/)
lyr2.css(opts.overlayCSS);
lyr2.css('position', full ? 'fixed' : 'absolute');
// make iframe layer transparent in IE
if ($.browser.msie || opts.forceIframe)
if (msie || opts.forceIframe)
lyr1.css('opacity',0.0);
//$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);
@ -286,28 +321,32 @@ function install(el, opts) {
}
// ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)
var expr = setExpr && (!$.boxModel || $('object,embed', full ? null : el).length > 0);
var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0);
if (ie6 || expr) {
// give body 100% height
if (full && opts.allowBodyStretch && $.boxModel)
if (full && opts.allowBodyStretch && $.support.boxModel)
$('html,body').css('height','100%');
// fix ie6 issue when blocked element has a border width
if ((ie6 || !$.boxModel) && !full) {
if ((ie6 || !$.support.boxModel) && !full) {
var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');
var fixT = t ? '(0 - '+t+')' : 0;
var fixL = l ? '(0 - '+l+')' : 0;
}
// simulate fixed position
$.each([lyr1,lyr2,lyr3], function(i,o) {
$.each(layers, function(i,o) {
var s = o[0].style;
s.position = 'absolute';
if (i < 2) {
full ? s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"')
: s.setExpression('height','this.parentNode.offsetHeight + "px"');
full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"')
: s.setExpression('width','this.parentNode.offsetWidth + "px"');
if (full)
s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"');
else
s.setExpression('height','this.parentNode.offsetHeight + "px"');
if (full)
s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"');
else
s.setExpression('width','this.parentNode.offsetWidth + "px"');
if (fixL) s.setExpression('left', fixL);
if (fixT) s.setExpression('top', fixT);
}
@ -316,7 +355,7 @@ function install(el, opts) {
s.marginTop = 0;
}
else if (!opts.centerY && full) {
var top = (opts.css && opts.css.top) ? parseInt(opts.css.top) : 0;
var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0;
var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"';
s.setExpression('top',expression);
}
@ -333,7 +372,7 @@ function install(el, opts) {
$(msg).show();
}
if (($.browser.msie || opts.forceIframe) && opts.showOverlay)
if ((msie || opts.forceIframe) && opts.showOverlay)
lyr1.show(); // opacity is zero
if (opts.fadeIn) {
var cb = opts.onBlock ? opts.onBlock : noOp;
@ -368,11 +407,14 @@ function install(el, opts) {
if (opts.timeout) {
// auto-unblock
var to = setTimeout(function() {
full ? $.unblockUI(opts) : $(el).unblock(opts);
if (full)
$.unblockUI(opts);
else
$(el).unblock(opts);
}, opts.timeout);
$(el).data('blockUI.timeout', to);
}
};
}
// remove the block
function remove(el, opts) {
@ -387,11 +429,24 @@ function remove(el, opts) {
opts = $.extend({}, $.blockUI.defaults, opts || {});
bind(0, el, opts); // unbind events
if (opts.onUnblock === null) {
opts.onUnblock = $el.data('blockUI.onUnblock');
$el.removeData('blockUI.onUnblock');
}
var els;
if (full) // crazy selector to handle odd field errors in ie6/7
els = $('body').children().filter('.blockUI').add('body > .blockUI');
else
els = $('.blockUI', el);
els = $el.find('>.blockUI');
// fix cursor issue
if ( opts.cursorReset ) {
if ( els.length > 1 )
els[1].style.cursor = opts.cursorReset;
if ( els.length > 2 )
els[2].style.cursor = opts.cursorReset;
}
if (full)
pageBlock = pageBlockEls = null;
@ -402,10 +457,11 @@ function remove(el, opts) {
}
else
reset(els, data, opts, el);
};
}
// move blocking element back into the DOM where it started
function reset(els,data,opts,el) {
var $el = $(el);
els.each(function(i,o) {
// remove via DOM calls so we don't lose event handlers
if (this.parentNode)
@ -417,12 +473,21 @@ function reset(els,data,opts,el) {
data.el.style.position = data.position;
if (data.parent)
data.parent.appendChild(data.el);
$(el).removeData('blockUI.history');
$el.removeData('blockUI.history');
}
if ($el.data('blockUI.static')) {
$el.css('position', 'static'); // #22
}
if (typeof opts.onUnblock == 'function')
opts.onUnblock(el,opts);
};
// fix issue in Safari 6 where block artifacts remain until reflow
var body = $(document.body), w = body.width(), cssW = body[0].style.width;
body.width(w-1).width(w);
body[0].style.width = cssW;
}
// bind/unbind the handler
function bind(b, el, opts) {
@ -431,7 +496,7 @@ function bind(b, el, opts) {
// don't bother unbinding if there is nothing to unbind
if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))
return;
if (!full)
$el.data('blockUI.isBlocked', b);
// don't bind events when overlay is not in use or if bindEvents is false
@ -439,13 +504,16 @@ function bind(b, el, opts) {
return;
// bind anchors and inputs for mouse and key events
var events = 'mousedown mouseup keydown keypress';
b ? $(document).bind(events, opts, handler) : $(document).unbind(events, handler);
var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove';
if (b)
$(document).bind(events, opts, handler);
else
$(document).unbind(events, handler);
// former impl...
// var $e = $('a,:input');
// b ? $e.bind(events, opts, handler) : $e.unbind(events, handler);
};
}
// event handler to suppress keyboard/mouse events when blocking
function handler(e) {
@ -456,19 +524,23 @@ function handler(e) {
var fwd = !e.shiftKey && e.target === els[els.length-1];
var back = e.shiftKey && e.target === els[0];
if (fwd || back) {
setTimeout(function(){focus(back)},10);
setTimeout(function(){focus(back);},10);
return false;
}
}
}
var opts = e.data;
var target = $(e.target);
if (target.hasClass('blockOverlay') && opts.onOverlayClick)
opts.onOverlayClick();
// allow events within the message content
if ($(e.target).parents('div.' + opts.blockMsgClass).length > 0)
if (target.parents('div.' + opts.blockMsgClass).length > 0)
return true;
// allow events for content that is not being blocked
return $(e.target).parents().children().filter('div.blockUI').length == 0;
};
return target.parents().children().filter('div.blockUI').length === 0;
}
function focus(back) {
if (!pageBlockEls)
@ -476,7 +548,7 @@ function focus(back) {
var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];
if (e)
e.focus();
};
}
function center(el, x, y) {
var p = el.parentNode, s = el.style;
@ -484,10 +556,20 @@ function center(el, x, y) {
var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');
if (x) s.left = l > 0 ? (l+'px') : '0';
if (y) s.top = t > 0 ? (t+'px') : '0';
};
}
function sz(el, p) {
return parseInt($.css(el,p))||0;
};
return parseInt($.css(el,p),10)||0;
}
})(jQuery);
}
/*global define:true */
if (typeof define === 'function' && define.amd && define.amd.jQuery) {
define(['jquery'], setup);
} else {
setup(jQuery);
}
})();

View file

@ -1,13 +1,12 @@
/*
* Superfish v1.4.8 - jQuery menu widget
* Copyright (c) 2008 Joel Birch
* Superfish v1.5.3 - jQuery menu widget
* Copyright (c) 2013 Joel Birch
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
* CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
*/
;(function($){
@ -15,71 +14,110 @@
var sf = $.fn.superfish,
c = sf.c,
$arrow = $(['<span class="',c.arrowClass,'"> &#187;</span>'].join('')),
over = function(){
$arrow = $('<span class="'+c.arrowClass+'"> &#187;</span>'),
over = function(e){
var $$ = $(this), menu = getMenu($$);
if (e.type === 'mouseenter' || e.type==='focusin'){
$$.children('a').data('follow',true);
}
clearTimeout(menu.sfTimer);
$$.showSuperfishUl().siblings().hideSuperfishUl();
},
out = function(){
out = function(e){
var $$ = $(this), menu = getMenu($$), o = sf.op;
clearTimeout(menu.sfTimer);
menu.sfTimer=setTimeout(function(){
var close = function(){
o.retainPath=($.inArray($$[0],o.$path)>-1);
$$.hideSuperfishUl();
if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}
},o.delay);
if (o.$path.length && $$.parents('li.'+o.hoverClass).length<1){
o.onIdle.call();
$.proxy(over,o.$path,e)();
}
};
if (e.type !== 'mouseleave' && e.type !== 'focusout'){
close();
} else {
clearTimeout(menu.sfTimer);
menu.sfTimer=setTimeout(close,o.delay);
}
if (e.type === 'mouseleave' || e.type === 'focusout'){
$$.children('a').data('follow',false);
}
},
getMenu = function($menu){
var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0];
getMenu = function($child){
if ($child.hasClass(c.menuClass)){
$.error('Superfish requires you to update to a version of hoverIntent that supports event-delegation, such as this one: https://github.com/joeldbirch/onHoverIntent');
}
var menu = $child.closest('.'+c.menuClass)[0];
sf.op = sf.o[menu.serial];
return menu;
},
applyHandlers = function($menu){
var targets = 'li:has(ul)';
if (!sf.op.useClick){
if ($.fn.hoverIntent && !sf.op.disableHI){
$menu.hoverIntent(over, out, targets);
} else {
$menu.on('mouseenter', targets, over);
$menu.on('mouseleave', targets, out);
}
}
$menu.on('focusin', targets, over);
$menu.on('focusout', targets, out);
$menu.on('click', 'a', clickHandler);
},
clickHandler = function(e){
var $a = $(this);
var $submenu = $a.next('ul');
var follow = $a.data('follow');
if ( $submenu.length && (sf.op.useClick || !follow) ){
e.preventDefault();
if ($submenu.is(':visible')){
$.proxy(out,$(this).parent(),e)();
} else {
$.proxy(over,$(this).parent(),e)();
}
}
},
addArrows = function($li,o){
if (o.autoArrows) {
$li.children('a').each(function() {
addArrow( $(this) );
});
}
},
addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); };
return this.each(function() {
return this.addClass(c.menuClass).each(function() {
var s = this.serial = sf.o.length;
var o = $.extend({},sf.defaults,op);
o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){
$(this).addClass([o.hoverClass,c.bcClass].join(' '))
var $$ = $(this);
var $liHasUl = $$.find('li:has(ul)');
o.$path = $$.find('li.'+o.pathClass).slice(0,o.pathLevels).each(function(){
$(this).addClass(o.hoverClass+' '+c.bcClass)
.filter('li:has(ul)').removeClass(o.pathClass);
});
sf.o[s] = sf.op = o;
$('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() {
if (o.autoArrows) addArrow( $('>a:first-child',this) );
})
.not('.'+c.bcClass)
.hideSuperfishUl();
addArrows($liHasUl,o);
applyHandlers($$);
$liHasUl.not('.'+c.bcClass).hideSuperfishUl();
var $a = $('a',this);
$a.each(function(i){
var $li = $a.eq(i).parents('li');
$a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});
});
o.onInit.call(this);
}).each(function() {
var menuClasses = [c.menuClass];
if (sf.op.dropShadows && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass);
$(this).addClass(menuClasses.join(' '));
});
};
var sf = $.fn.superfish;
sf.o = [];
sf.op = {};
sf.IE7fix = function(){
var o = sf.op;
if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity!=undefined)
this.toggleClass(sf.c.shadowClass+'-off');
};
sf.c = {
bcClass : 'sf-breadcrumb',
menuClass : 'sf-js-enabled',
anchorClass : 'sf-with-ul',
arrowClass : 'sf-sub-indicator',
shadowClass : 'sf-shadow'
arrowClass : 'sf-sub-indicator'
};
sf.defaults = {
hoverClass : 'sfHover',
@ -87,33 +125,39 @@
pathLevels : 1,
delay : 800,
animation : {opacity:'show'},
animationOut: {opacity:'hide'},
speed : 'normal',
speedOut : 'fast',
autoArrows : true,
dropShadows : true,
disableHI : false, // true disables hoverIntent detection
useClick : false,
onInit : function(){}, // callback functions
onBeforeShow: function(){},
onShow : function(){},
onHide : function(){}
onHide : function(){},
onIdle : function(){}
};
$.fn.extend({
hideSuperfishUl : function(){
var o = sf.op,
not = (o.retainPath===true) ? o.$path : '';
o.retainPath = false;
var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass)
.find('>ul').hide().css('visibility','hidden');
var $ul = $('li.'+o.hoverClass,this).add(this).not(not)
.find('>ul').stop().animate(o.animationOut,o.speedOut,function(){
$ul = $(this);
$ul.css('visibility','hidden').parent().removeClass(o.hoverClass);
o.onHide.call($ul);
});
return this;
},
showSuperfishUl : function(){
var o = sf.op,
sh = sf.c.shadowClass+'-off',
$ul = this.addClass(o.hoverClass)
.find('>ul:hidden').css('visibility','visible');
sf.IE7fix.call($ul);
o.onBeforeShow.call($ul);
$ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); });
$ul.stop().animate(o.animation,o.speed,function(){
o.onShow.call($ul);
});
return this;
}
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 B

After

Width:  |  Height:  |  Size: 434 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 B

After

Width:  |  Height:  |  Size: 274 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 B

After

Width:  |  Height:  |  Size: 274 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 B

After

Width:  |  Height:  |  Size: 395 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 B

After

Width:  |  Height:  |  Size: 268 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -6,6 +6,9 @@
padding-bottom: 2.5em;
position: relative;
}
.sf-navbar ul {
box-shadow: none;
}
.sf-navbar li {
background: #AABDE6;
position: static;
@ -81,13 +84,3 @@ ul.sf-navbar .current ul ul {
.sf-navbar ul li.sfHover > a > .sf-sub-indicator {
background-position: -10px -100px; /* arrow hovers for modern browsers*/
}
/*** remove shadow on first submenu ***/
.sf-navbar > li > ul {
background: transparent;
padding: 0;
-moz-border-radius-bottomleft: 0;
-moz-border-radius-topright: 0;
-webkit-border-top-right-radius: 0;
-webkit-border-bottom-left-radius: 0;
}

View file

@ -11,26 +11,18 @@
.sf-menu ul {
position: absolute;
top: -999em;
width: 12em; /* left offset of submenus need to match (see below) */
width: 10em; /* left offset of submenus need to match (see below) */
}
.sf-item-menu ul {
width: 9.5em;
z-index: 99;
}
.sf-menu ul li {
width: 100%;
}
.sf-menu li:hover {
visibility: inherit; /* fixes IE7 'sticky bug' */
}
.sf-menu li {
float: left;
position: relative;
}
.sf-menu a {
display: block;
position: relative;
@ -147,6 +139,7 @@ ul.sf-menu li li li.sfHover ul {
border-bottom: none;
}
/*** arrows **/
.sf-menu a.sf-with-ul {
padding-right: 2.25em;
@ -161,7 +154,7 @@ ul.sf-menu li li li.sfHover ul {
height: 10px;
text-indent: -999em;
overflow: hidden;
background: url('/assets/arrows-ffffff.png') no-repeat -10px -100px; /* 8-bit indexed alpha png. IE6 gets solid image only */
background: url('../images/arrows-ffffff.png') no-repeat -10px -100px; /* 8-bit indexed alpha png. IE6 gets solid image only */
}
a > .sf-sub-indicator { /* give all except IE6 the correct values */
top: .8em;
@ -187,16 +180,3 @@ li.sfHover > a > .sf-sub-indicator {
.sf-menu ul li.sfHover > a > .sf-sub-indicator {
background-position: -10px 0; /* arrow hovers for modern browsers*/
}
/*** shadows for all but IE6 ***/
.sf-shadow ul {
background: url('/assets/shadow.png') no-repeat bottom right;
padding: 0 8px 9px 0;
-moz-border-radius-bottomleft: 17px;
-moz-border-radius-topright: 17px;
-webkit-border-top-right-radius: 17px;
-webkit-border-bottom-left-radius: 17px;
}
.sf-shadow ul.sf-shadow-off {
background: transparent;
}