spree_enhanced_option_types 0.30.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +9 -0
- data/LICENSE +23 -0
- data/README.markdown +126 -0
- data/README.md +13 -0
- data/Rakefile +29 -0
- data/app/controllers/admin/prototypes_controller_decorator.rb +21 -0
- data/app/controllers/admin/variants_controller_decorator.rb +8 -0
- data/app/controllers/orders_controller_decorator.rb +58 -0
- data/app/helpers/variant_selection.rb +47 -0
- data/app/models/option_types_prototype.rb +2 -0
- data/app/models/option_value_decorator.rb +9 -0
- data/app/models/product_decorator.rb +40 -0
- data/app/models/prototype.rb +6 -0
- data/app/models/variant_decorator.rb +41 -0
- data/app/views/admin/option_types/_option_value_fields.html.erb +10 -0
- data/app/views/admin/option_types/edit.html.erb +34 -0
- data/app/views/admin/products/new.html.erb +58 -0
- data/app/views/admin/prototypes/_form.html.erb +57 -0
- data/app/views/admin/prototypes/_sortable_header.rhtml +3 -0
- data/app/views/admin/variants/_form.html.erb +45 -0
- data/app/views/admin/variants/index.html.erb +62 -0
- data/app/views/products/_cart_form.html.erb +37 -0
- data/app/views/products/_eot_includes.html.erb +25 -0
- data/app/views/products/_radio_2d.html.erb +82 -0
- data/app/views/products/_radio_sets.html.erb +31 -0
- data/app/views/products/_selects.html.erb +26 -0
- data/config/locales/en.yml +14 -0
- data/config/locales/ru.yml +10 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20100825095803_add_sku_to_option_values.rb +9 -0
- data/db/migrate/20101019122221_add_amount_to_option_value.rb +9 -0
- data/db/migrate/20101019122559_add_position_to_option_type_prototype.rb +9 -0
- data/db/migrate/20101019122611_set_default_for_option_value_amount.rb +9 -0
- data/doc/2d.jpg +0 -0
- data/doc/selects.jpg +0 -0
- data/doc/sets.jpg +0 -0
- data/lib/spree_enhanced_option_types.rb +50 -0
- data/lib/spree_enhanced_option_types_hooks.rb +3 -0
- data/lib/tasks/enhanced_option_types.rake +29 -0
- data/lib/tasks/install.rake +27 -0
- data/public/javascripts/enhanced-option-types.js +115 -0
- data/public/javascripts/jquery-ui-1.7.2.custom.min.js +46 -0
- data/public/javascripts/ui.core.js +519 -0
- data/public/javascripts/ui.draggable.js +766 -0
- data/public/javascripts/ui.selectable.js +257 -0
- data/public/javascripts/ui.sortable.js +1019 -0
- data/spree-enhanced-option-types.gemspec +22 -0
- metadata +132 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
<% ov_combinations = options_values_combinations(@product) %>
|
2
|
+
|
3
|
+
<% default_values = @product.default_variant.option_values.group_by{|ov| ov.option_type_id} if @product.default_variant %>
|
4
|
+
<% selected_values = [] %>
|
5
|
+
<% @product.option_types.uniq.each do |option_type|
|
6
|
+
default_value = default_values[option_type.id].first;
|
7
|
+
options = option_type.option_values.map do |ov|
|
8
|
+
[ov.presentation, ov.id, ov == default_value, !possible_combination?(ov_combinations, selected_values+[ov.id])]
|
9
|
+
end.compact
|
10
|
+
%>
|
11
|
+
<div class="option-type-wrapper" id="option-type_<%=option_type.name%>">
|
12
|
+
<span class="option-type"><%= option_type.presentation %></span>
|
13
|
+
<%
|
14
|
+
|
15
|
+
select_options = options.map{|o|
|
16
|
+
selected_attribute = " selected='selected'" if o[2]
|
17
|
+
disabled_attribute = " disabled='disabled'" if o[3]
|
18
|
+
%(<option value="#{html_escape(o[1].to_s)}"#{selected_attribute}#{disabled_attribute}>#{html_escape(o[0].to_s)}</option>)
|
19
|
+
}
|
20
|
+
%>
|
21
|
+
<%= select_tag("option_values[#{@product.id}][#{option_type.id}]", select_options.join.html_safe, :class=>"option-type" ) %>
|
22
|
+
</div>
|
23
|
+
<% selected_values << default_value.id;
|
24
|
+
end %>
|
25
|
+
|
26
|
+
<%= render :partial => 'eot_includes', :locals => {:ov_combinations => ov_combinations} %>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Sample localization file for English. Add more files in this directory for other locales.
|
2
|
+
# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
|
3
|
+
|
4
|
+
en:
|
5
|
+
price_modifier: Price Modifier
|
6
|
+
sku_modifier: SKU Modifier
|
7
|
+
create_variants: Create variants from option types
|
8
|
+
stock_to_small: We're sorry but currently we only have %d items of this kind in stock, please adjust your amount.
|
9
|
+
wrong_combination: "We're sorry but you can't select this combination of options."
|
10
|
+
wrong_quantity: "You have to choose quantity larger then 0"
|
11
|
+
variant_price: Variant price
|
12
|
+
regenerate: "regenerate variants"
|
13
|
+
regenerate_confirm: "This will wipe out all your current variants\nAre you sure?"
|
14
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
ru:
|
2
|
+
price_modifier: "Изменение цены"
|
3
|
+
sku_modifier: "Суффикс артикула"
|
4
|
+
create_variants: "Создать варианты из товарных опций"
|
5
|
+
stock_to_small: "Извините, но у нас в наличии сейчас только %d шт. данного товара, пожалуйста уменьшите кол-во в заказе"
|
6
|
+
wrong_combination: "Извините, но Вы не можете выбрать такую комбинацию опций."
|
7
|
+
wrong_quantity: "Вы должны выбрать кол-во больше нуля"
|
8
|
+
variant_price: "Цена варианта"
|
9
|
+
regenerate: "Сгенерировать варианты"
|
10
|
+
regenerate_confirm: "Перед генерацией все текущие варианты будут удалены.\nВы уверены?"
|
data/config/routes.rb
ADDED
data/doc/2d.jpg
ADDED
Binary file
|
data/doc/selects.jpg
ADDED
Binary file
|
data/doc/sets.jpg
ADDED
Binary file
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spree_core'
|
2
|
+
require 'spree_enhanced_option_types_hooks'
|
3
|
+
|
4
|
+
module SpreeEnhancedOptionTypes
|
5
|
+
class Engine < Rails::Engine
|
6
|
+
|
7
|
+
config.autoload_paths += %W(#{config.root}/lib)
|
8
|
+
|
9
|
+
def self.activate
|
10
|
+
# Activation logic goes here. A good use for this is performing class_eval on classes that are defined
|
11
|
+
# outside of the extension (so that monkey patches are not lost on subsequent requests in development mode.)
|
12
|
+
lambda{
|
13
|
+
Dir.glob(File.join(File.dirname(__FILE__), "../app/**/*_decorator*.rb")) do |c|
|
14
|
+
Rails.env == "production" ? require(c) : load(c)
|
15
|
+
end
|
16
|
+
|
17
|
+
if Spree::Config.instance
|
18
|
+
Spree::Config.set(:variants_partial => 'radio_sets')
|
19
|
+
end
|
20
|
+
|
21
|
+
Spree::BaseController.class_eval do
|
22
|
+
helper VariantSelection
|
23
|
+
end
|
24
|
+
|
25
|
+
Numeric.class_eval do
|
26
|
+
def sign_symbol
|
27
|
+
if self > 0
|
28
|
+
"+"
|
29
|
+
elsif self < 0
|
30
|
+
"-"
|
31
|
+
else
|
32
|
+
""
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
Admin::PrototypesController.class_eval do
|
38
|
+
before_filter :load_sortable
|
39
|
+
|
40
|
+
def load_sortable
|
41
|
+
render_to_string :partial => 'sortable_header'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
config.to_prepare &self.activate
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# add custom rake tasks here
|
2
|
+
namespace :db do
|
3
|
+
desc "Bootstrap your database for Spree."
|
4
|
+
task :bootstrap => :environment do
|
5
|
+
# load initial database fixtures (in db/sample/*.yml) into the current environment's database
|
6
|
+
ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
|
7
|
+
Dir.glob(File.join(EnhancedOptionTypes::Engine.root, "db", 'sample', '*.{yml,csv}')).each do |fixture_file|
|
8
|
+
Fixtures.create_fixtures("#{EnhancedOptionTypes::Engine.root}/db/sample", File.basename(fixture_file, '.*'))
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
namespace :spree do
|
14
|
+
namespace :extensions do
|
15
|
+
namespace :enhanced_option_types do
|
16
|
+
desc "Copies public assets of the Enhanced Option Types to the instance public/ directory."
|
17
|
+
task :update => :environment do
|
18
|
+
is_svn_git_or_dir = proc {|path| path =~ /\.svn/ || path =~ /\.git/ || File.directory?(path) }
|
19
|
+
Dir[EnhancedOptionTypes::Engine.root + "/public/**/*"].reject(&is_svn_git_or_dir).each do |file|
|
20
|
+
path = file.sub(EnhancedOptionTypes::Engine.root, '')
|
21
|
+
directory = File.dirname(path)
|
22
|
+
puts "Copying #{path}..."
|
23
|
+
mkdir_p RAILS_ROOT + directory
|
24
|
+
cp file, RAILS_ROOT + path
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
namespace :spree_enhanced_option_types do
|
2
|
+
desc "Copies all migrations and assets (NOTE: This will be obsolete with Rails 3.1)"
|
3
|
+
task :install do
|
4
|
+
Rake::Task['spree_enhanced_option_types:install:migrations'].invoke
|
5
|
+
Rake::Task['spree_enhanced_option_types:install:assets'].invoke
|
6
|
+
end
|
7
|
+
|
8
|
+
namespace :install do
|
9
|
+
|
10
|
+
desc "Copies all migrations (NOTE: This will be obsolete with Rails 3.1)"
|
11
|
+
task :migrations do
|
12
|
+
source = File.join(File.dirname(__FILE__), '..', '..', 'db')
|
13
|
+
destination = File.join(Rails.root, 'db')
|
14
|
+
puts "INFO: Mirroring assets from #{source} to #{destination}"
|
15
|
+
Spree::FileUtilz.mirror_files(source, destination)
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Copies all assets (NOTE: This will be obsolete with Rails 3.1)"
|
19
|
+
task :assets do
|
20
|
+
source = File.join(File.dirname(__FILE__), '..', '..', 'public')
|
21
|
+
destination = File.join(Rails.root, 'public')
|
22
|
+
puts "INFO: Mirroring assets from #{source} to #{destination}"
|
23
|
+
Spree::FileUtilz.mirror_files(source, destination)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
function update_variant_images(vid, text) {
|
2
|
+
jQuery("#variant-thumbnails").empty();
|
3
|
+
if (text) jQuery("#variant-images span").html(text);
|
4
|
+
|
5
|
+
if (images && images[vid] && images[vid].length > 0) {
|
6
|
+
$.each(images[vid], function(i, link) {
|
7
|
+
jQuery("#variant-thumbnails").append('<li>' + link + '</li>');
|
8
|
+
});
|
9
|
+
|
10
|
+
jQuery("#variant-images").show();
|
11
|
+
} else {
|
12
|
+
jQuery("#variant-images").hide();
|
13
|
+
}
|
14
|
+
|
15
|
+
add_image_handlers();
|
16
|
+
|
17
|
+
var link = jQuery("#variant-thumbnails a")[0];
|
18
|
+
|
19
|
+
jQuery("#main-image img").attr({src: jQuery(link).attr('href')});
|
20
|
+
jQuery('ul.thumbnails li').removeClass('selected');
|
21
|
+
jQuery(link).parent('li').addClass('selected');
|
22
|
+
}
|
23
|
+
|
24
|
+
|
25
|
+
// This little gem finds if there is a possible combination
|
26
|
+
// that begining matches values. returns tru if there's at least one match.
|
27
|
+
//
|
28
|
+
// WARNING this method has equivalent on ruby side (possible_combinations? helper)
|
29
|
+
// If you plan to change it, make sure they both behave in the same way
|
30
|
+
function possible_combination(values){
|
31
|
+
var any_match = false;
|
32
|
+
jQuery.each(ov_combinations, function(i, combination){
|
33
|
+
var result = true
|
34
|
+
jQuery.each(values, function(i, v){
|
35
|
+
result = result && (combination[i] == v)
|
36
|
+
})
|
37
|
+
any_match = any_match || result;
|
38
|
+
})
|
39
|
+
return(any_match);
|
40
|
+
}
|
41
|
+
|
42
|
+
// Callback called each time variant is changed.
|
43
|
+
function variant_changed(variant_id) {
|
44
|
+
var va = variant_attributes[variant_id];
|
45
|
+
var new_price = va.price;
|
46
|
+
if($('.price.update')[0]) {
|
47
|
+
new_price = $('.price.update').text().replace(/[\d\s,.-]+/, parseFloat(new_price).toFixed(2));
|
48
|
+
$('.price.update').text(new_price);
|
49
|
+
}
|
50
|
+
if($('span.on-hand')[0]) {
|
51
|
+
$('span.on-hand').text(va.on_hand);
|
52
|
+
}
|
53
|
+
update_variant_images(variant_id, va.description);
|
54
|
+
}
|
55
|
+
|
56
|
+
$('#product-variants table.t2d input[type=radio]').bind("change", function(){
|
57
|
+
variant_changed(ov_to_variant[this.value]);
|
58
|
+
})
|
59
|
+
|
60
|
+
// This binds event watching function to every radio box
|
61
|
+
$("#product-variants input[type=radio].option-value").bind("change", function(){
|
62
|
+
// this callback is actually called twice, one for radio box that's selected
|
63
|
+
// second one for unselected, so we choose one and run with it.
|
64
|
+
if(!this.checked) return;
|
65
|
+
|
66
|
+
var selected_values = [];
|
67
|
+
// for each option group (represented by fieldset)
|
68
|
+
$("#product-variants fieldset").map(function(i, fieldset){
|
69
|
+
// for each option value
|
70
|
+
$(fieldset).find("input[type=radio]").each(function(i, radio){
|
71
|
+
var ov_value = radio.id.replace(/\D+/, '');
|
72
|
+
// check if there's at least one possible combination for this setting
|
73
|
+
var can_be_set = possible_combination(selected_values.concat([ov_value]));
|
74
|
+
$(radio).attr('disabled', !can_be_set)
|
75
|
+
if (!can_be_set) // uncheck if it can't be used'
|
76
|
+
$(radio).attr('checked', false);
|
77
|
+
})
|
78
|
+
|
79
|
+
// find radio that is checked, or can be checked
|
80
|
+
var checked_radio = $(fieldset).find("input:checked");
|
81
|
+
if (!checked_radio[0])
|
82
|
+
checked_radio = $(fieldset).find("input:enabled").attr('checked', true)
|
83
|
+
// this should be absolutelly always possible, but just to be sure
|
84
|
+
if (checked_radio[0])
|
85
|
+
selected_values.push(checked_radio.attr('id').replace(/\D+/, ''))
|
86
|
+
})
|
87
|
+
|
88
|
+
variant_changed(ov_to_variant[selected_values]);
|
89
|
+
});
|
90
|
+
|
91
|
+
$('#product-variants select.option-type').bind("change", function(){
|
92
|
+
var selected_values = [];
|
93
|
+
// for each option group (represented by select)
|
94
|
+
$("#product-variants select.option-type").map(function(i, select){
|
95
|
+
// for each option value
|
96
|
+
$(select).find("option").each(function(i, option){
|
97
|
+
var ov_value = option.value.replace(/\D+/, '');
|
98
|
+
// check if there's at least one possible combination for this setting
|
99
|
+
var can_be_set = possible_combination(selected_values.concat([ov_value]));
|
100
|
+
$(option).attr('disabled', !can_be_set)
|
101
|
+
if (!can_be_set) // uncheck if it can't be used'
|
102
|
+
$(option).attr('selected', false);
|
103
|
+
})
|
104
|
+
|
105
|
+
// find radio that is checked, or can be checked
|
106
|
+
var selected_option = $(select).find("option:selected");
|
107
|
+
if (!selected_option[0])
|
108
|
+
selected_option = $(select).find("option:selected").attr('selected', true)
|
109
|
+
// this should be absolutelly always possible, but just to be sure
|
110
|
+
if (selected_option[0])
|
111
|
+
selected_values.push(selected_option.attr('value').replace(/\D+/, ''))
|
112
|
+
})
|
113
|
+
|
114
|
+
variant_changed(ov_to_variant[selected_values]);
|
115
|
+
})
|
@@ -0,0 +1,46 @@
|
|
1
|
+
/*
|
2
|
+
* jQuery UI 1.7.2
|
3
|
+
*
|
4
|
+
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
|
5
|
+
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
6
|
+
* and GPL (GPL-LICENSE.txt) licenses.
|
7
|
+
*
|
8
|
+
* http://docs.jquery.com/UI
|
9
|
+
*/
|
10
|
+
jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.2",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m<n.length;m++){if(j.options[n[m][0]]){n[m][1].apply(j.element,k)}}}},contains:function(k,j){return document.compareDocumentPosition?k.compareDocumentPosition(j)&16:k!==j&&k.contains(j)},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/*
|
11
|
+
* jQuery UI Draggable 1.7.2
|
12
|
+
*
|
13
|
+
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
|
14
|
+
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
15
|
+
* and GPL (GPL-LICENSE.txt) licenses.
|
16
|
+
*
|
17
|
+
* http://docs.jquery.com/UI/Draggables
|
18
|
+
*
|
19
|
+
* Depends:
|
20
|
+
* ui.core.js
|
21
|
+
*/
|
22
|
+
(function(a){a.widget("ui.draggable",a.extend({},a.ui.mouse,{_init:function(){if(this.options.helper=="original"&&!(/^(?:r|a|f)/).test(this.element.css("position"))){this.element[0].style.position="relative"}(this.options.addClasses&&this.element.addClass("ui-draggable"));(this.options.disabled&&this.element.addClass("ui-draggable-disabled"));this._mouseInit()},destroy:function(){if(!this.element.data("draggable")){return}this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy()},_mouseCapture:function(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")){return false}this.handle=this._getHandle(b);if(!this.handle){return false}return true},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b);this._cacheHelperProportions();if(a.ui.ddmanager){a.ui.ddmanager.current=this}this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(b);this.originalPageX=b.pageX;this.originalPageY=b.pageY;if(c.cursorAt){this._adjustOffsetFromHelper(c.cursorAt)}if(c.containment){this._setContainment()}this._trigger("start",b);this._cacheHelperProportions();if(a.ui.ddmanager&&!c.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,b)}this.helper.addClass("ui-draggable-dragging");this._mouseDrag(b,true);return true},_mouseDrag:function(b,d){this.position=this._generatePosition(b);this.positionAbs=this._convertPositionTo("absolute");if(!d){var c=this._uiHash();this._trigger("drag",b,c);this.position=c.position}if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}if(a.ui.ddmanager){a.ui.ddmanager.drag(this,b)}return false},_mouseStop:function(c){var d=false;if(a.ui.ddmanager&&!this.options.dropBehaviour){d=a.ui.ddmanager.drop(this,c)}if(this.dropped){d=this.dropped;this.dropped=false}if((this.options.revert=="invalid"&&!d)||(this.options.revert=="valid"&&d)||this.options.revert===true||(a.isFunction(this.options.revert)&&this.options.revert.call(this.element,d))){var b=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){b._trigger("stop",c);b._clear()})}else{this._trigger("stop",c);this._clear()}return false},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?true:false;a(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==b.target){c=true}});return c},_createHelper:function(c){var d=this.options;var b=a.isFunction(d.helper)?a(d.helper.apply(this.element[0],[c])):(d.helper=="clone"?this.element.clone():this.element);if(!b.parents("body").length){b.appendTo((d.appendTo=="parent"?this.element[0].parentNode:d.appendTo))}if(b[0]!=this.element[0]&&!(/(fixed|absolute)/).test(b.css("position"))){b.css("position","absolute")}return b},_adjustOffsetFromHelper:function(b){if(b.left!=undefined){this.offset.click.left=b.left+this.margins.left}if(b.right!=undefined){this.offset.click.left=this.helperProportions.width-b.right+this.margins.left}if(b.top!=undefined){this.offset.click.top=b.top+this.margins.top}if(b.bottom!=undefined){this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){b.left+=this.scrollParent.scrollLeft();b.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)){b={top:0,left:0}}return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var b=this.element.position();return{top:b.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:b.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.element.css("marginLeft"),10)||0),top:(parseInt(this.element.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e=this.options;if(e.containment=="parent"){e.containment=this.helper[0].parentNode}if(e.containment=="document"||e.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(e.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(e.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(e.containment)&&e.containment.constructor!=Array){var c=a(e.containment)[0];if(!c){return}var d=a(e.containment).offset();var b=(a(c).css("overflow")!="hidden");this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(b?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(b?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}else{if(e.containment.constructor==Array){this.containment=e.containment}}},_convertPositionTo:function(f,h){if(!h){h=this.position}var c=f=="absolute"?1:-1;var e=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=(/(html|body)/i).test(b[0].tagName);return{top:(h.top+this.offset.relative.top*c+this.offset.parent.top*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(g?0:b.scrollTop()))*c)),left:(h.left+this.offset.relative.left*c+this.offset.parent.left*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:b.scrollLeft())*c))}},_generatePosition:function(e){var h=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(b[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0])){this.offset.relative=this._getRelativeOffset()}var d=e.pageX;var c=e.pageY;if(this.originalPosition){if(this.containment){if(e.pageX-this.offset.click.left<this.containment[0]){d=this.containment[0]+this.offset.click.left}if(e.pageY-this.offset.click.top<this.containment[1]){c=this.containment[1]+this.offset.click.top}if(e.pageX-this.offset.click.left>this.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:(!(g-this.offset.click.top<this.containment[1])?g-h.grid[1]:g+h.grid[1])):g;var f=this.originalPageX+Math.round((d-this.originalPageX)/h.grid[0])*h.grid[0];d=this.containment?(!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:(!(f-this.offset.click.left<this.containment[0])?f-h.grid[0]:f+h.grid[0])):f}}return{top:(c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(i?0:b.scrollTop())))),left:(d-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:b.scrollLeft())))}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");if(this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval){this.helper.remove()}this.helper=null;this.cancelHelperRemoval=false},_trigger:function(b,c,d){d=d||this._uiHash();a.ui.plugin.call(this,b,[c,d]);if(b=="drag"){this.positionAbs=this._convertPositionTo("absolute")}return a.widget.prototype._trigger.call(this,b,c,d)},plugins:{},_uiHash:function(b){return{helper:this.helper,position:this.position,absolutePosition:this.positionAbs,offset:this.positionAbs}}}));a.extend(a.ui.draggable,{version:"1.7.2",eventPrefix:"drag",defaults:{addClasses:true,appendTo:"parent",axis:false,cancel:":input,option",connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,delay:0,distance:1,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false}});a.ui.plugin.add("draggable","connectToSortable",{start:function(c,e){var d=a(this).data("draggable"),f=d.options,b=a.extend({},e,{item:d.element});d.sortables=[];a(f.connectToSortable).each(function(){var g=a.data(this,"sortable");if(g&&!g.options.disabled){d.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",c,b)}})},stop:function(c,e){var d=a(this).data("draggable"),b=a.extend({},e,{item:d.element});a.each(d.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;d.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert){this.instance.options.revert=true}this.instance._mouseStop(c);this.instance.options.helper=this.instance.options._helper;if(d.options.helper=="original"){this.instance.currentItem.css({top:"auto",left:"auto"})}}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",c,b)}})},drag:function(c,f){var e=a(this).data("draggable"),b=this;var d=function(i){var n=this.offset.click.top,m=this.offset.click.left;var g=this.positionAbs.top,k=this.positionAbs.left;var j=i.height,l=i.width;var p=i.top,h=i.left;return a.ui.isOver(g+n,k+m,p,h,j,l)};a.each(e.sortables,function(g){this.instance.positionAbs=e.positionAbs;this.instance.helperProportions=e.helperProportions;this.instance.offset.click=e.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=a(b).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return f.helper[0]};c.target=this.instance.currentItem[0];this.instance._mouseCapture(c,true);this.instance._mouseStart(c,true,true);this.instance.offset.click.top=e.offset.click.top;this.instance.offset.click.left=e.offset.click.left;this.instance.offset.parent.left-=e.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=e.offset.parent.top-this.instance.offset.parent.top;e._trigger("toSortable",c);e.dropped=this.instance.element;e.currentItem=e.element;this.instance.fromOutside=e}if(this.instance.currentItem){this.instance._mouseDrag(c)}}else{if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",c,this.instance._uiHash(this.instance));this.instance._mouseStop(c,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();if(this.instance.placeholder){this.instance.placeholder.remove()}e._trigger("fromSortable",c);e.dropped=false}}})}});a.ui.plugin.add("draggable","cursor",{start:function(c,d){var b=a("body"),e=a(this).data("draggable").options;if(b.css("cursor")){e._cursor=b.css("cursor")}b.css("cursor",e.cursor)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._cursor){a("body").css("cursor",d._cursor)}}});a.ui.plugin.add("draggable","iframeFix",{start:function(b,c){var d=a(this).data("draggable").options;a(d.iframeFix===true?"iframe":d.iframeFix).each(function(){a('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1000}).css(a(this).offset()).appendTo("body")})},stop:function(b,c){a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});a.ui.plugin.add("draggable","opacity",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("opacity")){e._opacity=b.css("opacity")}b.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._opacity){a(c.helper).css("opacity",d._opacity)}}});a.ui.plugin.add("draggable","scroll",{start:function(c,d){var b=a(this).data("draggable");if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){b.overflowOffset=b.scrollParent.offset()}},drag:function(d,e){var c=a(this).data("draggable"),f=c.options,b=false;if(c.scrollParent[0]!=document&&c.scrollParent[0].tagName!="HTML"){if(!f.axis||f.axis!="x"){if((c.overflowOffset.top+c.scrollParent[0].offsetHeight)-d.pageY<f.scrollSensitivity){c.scrollParent[0].scrollTop=b=c.scrollParent[0].scrollTop+f.scrollSpeed}else{if(d.pageY-c.overflowOffset.top<f.scrollSensitivity){c.scrollParent[0].scrollTop=b=c.scrollParent[0].scrollTop-f.scrollSpeed}}}if(!f.axis||f.axis!="y"){if((c.overflowOffset.left+c.scrollParent[0].offsetWidth)-d.pageX<f.scrollSensitivity){c.scrollParent[0].scrollLeft=b=c.scrollParent[0].scrollLeft+f.scrollSpeed}else{if(d.pageX-c.overflowOffset.left<f.scrollSensitivity){c.scrollParent[0].scrollLeft=b=c.scrollParent[0].scrollLeft-f.scrollSpeed}}}}else{if(!f.axis||f.axis!="x"){if(d.pageY-a(document).scrollTop()<f.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()-f.scrollSpeed)}else{if(a(window).height()-(d.pageY-a(document).scrollTop())<f.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()+f.scrollSpeed)}}}if(!f.axis||f.axis!="y"){if(d.pageX-a(document).scrollLeft()<f.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()-f.scrollSpeed)}else{if(a(window).width()-(d.pageX-a(document).scrollLeft())<f.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()+f.scrollSpeed)}}}}if(b!==false&&a.ui.ddmanager&&!f.dropBehaviour){a.ui.ddmanager.prepareOffsets(c,d)}}});a.ui.plugin.add("draggable","snap",{start:function(c,d){var b=a(this).data("draggable"),e=b.options;b.snapElements=[];a(e.snap.constructor!=String?(e.snap.items||":data(draggable)"):e.snap).each(function(){var g=a(this);var f=g.offset();if(this!=b.element[0]){b.snapElements.push({item:this,width:g.outerWidth(),height:g.outerHeight(),top:f.top,left:f.left})}})},drag:function(u,p){var g=a(this).data("draggable"),q=g.options;var y=q.snapTolerance;var x=p.offset.left,w=x+g.helperProportions.width,f=p.offset.top,e=f+g.helperProportions.height;for(var v=g.snapElements.length-1;v>=0;v--){var s=g.snapElements[v].left,n=s+g.snapElements[v].width,m=g.snapElements[v].top,A=m+g.snapElements[v].height;if(!((s-y<x&&x<n+y&&m-y<f&&f<A+y)||(s-y<x&&x<n+y&&m-y<e&&e<A+y)||(s-y<w&&w<n+y&&m-y<f&&f<A+y)||(s-y<w&&w<n+y&&m-y<e&&e<A+y))){if(g.snapElements[v].snapping){(g.options.snap.release&&g.options.snap.release.call(g.element,u,a.extend(g._uiHash(),{snapItem:g.snapElements[v].item})))}g.snapElements[v].snapping=false;continue}if(q.snapMode!="inner"){var c=Math.abs(m-e)<=y;var z=Math.abs(A-f)<=y;var j=Math.abs(s-w)<=y;var k=Math.abs(n-x)<=y;if(c){p.position.top=g._convertPositionTo("relative",{top:m-g.helperProportions.height,left:0}).top-g.margins.top}if(z){p.position.top=g._convertPositionTo("relative",{top:A,left:0}).top-g.margins.top}if(j){p.position.left=g._convertPositionTo("relative",{top:0,left:s-g.helperProportions.width}).left-g.margins.left}if(k){p.position.left=g._convertPositionTo("relative",{top:0,left:n}).left-g.margins.left}}var h=(c||z||j||k);if(q.snapMode!="outer"){var c=Math.abs(m-f)<=y;var z=Math.abs(A-e)<=y;var j=Math.abs(s-x)<=y;var k=Math.abs(n-w)<=y;if(c){p.position.top=g._convertPositionTo("relative",{top:m,left:0}).top-g.margins.top}if(z){p.position.top=g._convertPositionTo("relative",{top:A-g.helperProportions.height,left:0}).top-g.margins.top}if(j){p.position.left=g._convertPositionTo("relative",{top:0,left:s}).left-g.margins.left}if(k){p.position.left=g._convertPositionTo("relative",{top:0,left:n-g.helperProportions.width}).left-g.margins.left}}if(!g.snapElements[v].snapping&&(c||z||j||k||h)){(g.options.snap.snap&&g.options.snap.snap.call(g.element,u,a.extend(g._uiHash(),{snapItem:g.snapElements[v].item})))}g.snapElements[v].snapping=(c||z||j||k||h)}}});a.ui.plugin.add("draggable","stack",{start:function(b,c){var e=a(this).data("draggable").options;var d=a.makeArray(a(e.stack.group)).sort(function(g,f){return(parseInt(a(g).css("zIndex"),10)||e.stack.min)-(parseInt(a(f).css("zIndex"),10)||e.stack.min)});a(d).each(function(f){this.style.zIndex=e.stack.min+f});this[0].style.zIndex=e.stack.min+d.length}});a.ui.plugin.add("draggable","zIndex",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("zIndex")){e._zIndex=b.css("zIndex")}b.css("zIndex",e.zIndex)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._zIndex){a(c.helper).css("zIndex",d._zIndex)}}})})(jQuery);;/*
|
23
|
+
* jQuery UI Selectable 1.7.2
|
24
|
+
*
|
25
|
+
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
|
26
|
+
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
27
|
+
* and GPL (GPL-LICENSE.txt) licenses.
|
28
|
+
*
|
29
|
+
* http://docs.jquery.com/UI/Selectables
|
30
|
+
*
|
31
|
+
* Depends:
|
32
|
+
* ui.core.js
|
33
|
+
*/
|
34
|
+
(function(a){a.widget("ui.selectable",a.extend({},a.ui.mouse,{_init:function(){var b=this;this.element.addClass("ui-selectable");this.dragged=false;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]);c.each(function(){var d=a(this);var e=d.offset();a.data(this,"selectable-item",{element:this,$element:d,left:e.left,top:e.top,right:e.left+d.outerWidth(),bottom:e.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=c.addClass("ui-selectee");this._mouseInit();this.helper=a(document.createElement("div")).css({border:"1px dotted black"}).addClass("ui-selectable-helper")},destroy:function(){this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy()},_mouseStart:function(d){var b=this;this.opos=[d.pageX,d.pageY];if(this.options.disabled){return}var c=this.options;this.selectees=a(c.filter,this.element[0]);this._trigger("start",d);a(c.appendTo).append(this.helper);this.helper.css({"z-index":100,position:"absolute",left:d.clientX,top:d.clientY,width:0,height:0});if(c.autoRefresh){this.refresh()}this.selectees.filter(".ui-selected").each(function(){var e=a.data(this,"selectable-item");e.startselected=true;if(!d.metaKey){e.$element.removeClass("ui-selected");e.selected=false;e.$element.addClass("ui-unselecting");e.unselecting=true;b._trigger("unselecting",d,{unselecting:e.element})}});a(d.target).parents().andSelf().each(function(){var e=a.data(this,"selectable-item");if(e){e.$element.removeClass("ui-unselecting").addClass("ui-selecting");e.unselecting=false;e.selecting=true;e.selected=true;b._trigger("selecting",d,{selecting:e.element});return false}})},_mouseDrag:function(i){var c=this;this.dragged=true;if(this.options.disabled){return}var e=this.options;var d=this.opos[0],h=this.opos[1],b=i.pageX,g=i.pageY;if(d>b){var f=b;b=d;d=f}if(h>g){var f=g;g=h;h=f}this.helper.css({left:d,top:h,width:b-d,height:g-h});this.selectees.each(function(){var j=a.data(this,"selectable-item");if(!j||j.element==c.element[0]){return}var k=false;if(e.tolerance=="touch"){k=(!(j.left>b||j.right<d||j.top>g||j.bottom<h))}else{if(e.tolerance=="fit"){k=(j.left>d&&j.right<b&&j.top>h&&j.bottom<g)}}if(k){if(j.selected){j.$element.removeClass("ui-selected");j.selected=false}if(j.unselecting){j.$element.removeClass("ui-unselecting");j.unselecting=false}if(!j.selecting){j.$element.addClass("ui-selecting");j.selecting=true;c._trigger("selecting",i,{selecting:j.element})}}else{if(j.selecting){if(i.metaKey&&j.startselected){j.$element.removeClass("ui-selecting");j.selecting=false;j.$element.addClass("ui-selected");j.selected=true}else{j.$element.removeClass("ui-selecting");j.selecting=false;if(j.startselected){j.$element.addClass("ui-unselecting");j.unselecting=true}c._trigger("unselecting",i,{unselecting:j.element})}}if(j.selected){if(!i.metaKey&&!j.startselected){j.$element.removeClass("ui-selected");j.selected=false;j.$element.addClass("ui-unselecting");j.unselecting=true;c._trigger("unselecting",i,{unselecting:j.element})}}}});return false},_mouseStop:function(d){var b=this;this.dragged=false;var c=this.options;a(".ui-unselecting",this.element[0]).each(function(){var e=a.data(this,"selectable-item");e.$element.removeClass("ui-unselecting");e.unselecting=false;e.startselected=false;b._trigger("unselected",d,{unselected:e.element})});a(".ui-selecting",this.element[0]).each(function(){var e=a.data(this,"selectable-item");e.$element.removeClass("ui-selecting").addClass("ui-selected");e.selecting=false;e.selected=true;e.startselected=true;b._trigger("selected",d,{selected:e.element})});this._trigger("stop",d);this.helper.remove();return false}}));a.extend(a.ui.selectable,{version:"1.7.2",defaults:{appendTo:"body",autoRefresh:true,cancel:":input,option",delay:0,distance:0,filter:"*",tolerance:"touch"}})})(jQuery);;/*
|
35
|
+
* jQuery UI Sortable 1.7.2
|
36
|
+
*
|
37
|
+
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
|
38
|
+
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
39
|
+
* and GPL (GPL-LICENSE.txt) licenses.
|
40
|
+
*
|
41
|
+
* http://docs.jquery.com/UI/Sortables
|
42
|
+
*
|
43
|
+
* Depends:
|
44
|
+
* ui.core.js
|
45
|
+
*/
|
46
|
+
(function(a){a.widget("ui.sortable",a.extend({},a.ui.mouse,{_init:function(){var b=this.options;this.containerCache={};this.element.addClass("ui-sortable");this.refresh();this.floating=this.items.length?(/left|right/).test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--){this.items[b].item.removeData("sortable-item")}},_mouseCapture:function(e,f){if(this.reverting){return false}if(this.options.disabled||this.options.type=="static"){return false}this._refreshItems(e);var d=null,c=this,b=a(e.target).parents().each(function(){if(a.data(this,"sortable-item")==c){d=a(this);return false}});if(a.data(e.target,"sortable-item")==c){d=a(e.target)}if(!d){return false}if(this.options.handle&&!f){var g=false;a(this.options.handle,d).find("*").andSelf().each(function(){if(this==e.target){g=true}});if(!g){return false}}this.currentItem=d;this._removeCurrentsFromItems();return true},_mouseStart:function(e,f,b){var g=this.options,c=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(e);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");a.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(e);this.originalPageX=e.pageX;this.originalPageY=e.pageY;if(g.cursorAt){this._adjustOffsetFromHelper(g.cursorAt)}this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};if(this.helper[0]!=this.currentItem[0]){this.currentItem.hide()}this._createPlaceholder();if(g.containment){this._setContainment()}if(g.cursor){if(a("body").css("cursor")){this._storedCursor=a("body").css("cursor")}a("body").css("cursor",g.cursor)}if(g.opacity){if(this.helper.css("opacity")){this._storedOpacity=this.helper.css("opacity")}this.helper.css("opacity",g.opacity)}if(g.zIndex){if(this.helper.css("zIndex")){this._storedZIndex=this.helper.css("zIndex")}this.helper.css("zIndex",g.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){this.overflowOffset=this.scrollParent.offset()}this._trigger("start",e,this._uiHash());if(!this._preserveHelperProportions){this._cacheHelperProportions()}if(!b){for(var d=this.containers.length-1;d>=0;d--){this.containers[d]._trigger("activate",e,c._uiHash(this))}}if(a.ui.ddmanager){a.ui.ddmanager.current=this}if(a.ui.ddmanager&&!g.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,e)}this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(e);return true},_mouseDrag:function(f){this.position=this._generatePosition(f);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs){this.lastPositionAbs=this.positionAbs}if(this.options.scroll){var g=this.options,b=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if((this.overflowOffset.top+this.scrollParent[0].offsetHeight)-f.pageY<g.scrollSensitivity){this.scrollParent[0].scrollTop=b=this.scrollParent[0].scrollTop+g.scrollSpeed}else{if(f.pageY-this.overflowOffset.top<g.scrollSensitivity){this.scrollParent[0].scrollTop=b=this.scrollParent[0].scrollTop-g.scrollSpeed}}if((this.overflowOffset.left+this.scrollParent[0].offsetWidth)-f.pageX<g.scrollSensitivity){this.scrollParent[0].scrollLeft=b=this.scrollParent[0].scrollLeft+g.scrollSpeed}else{if(f.pageX-this.overflowOffset.left<g.scrollSensitivity){this.scrollParent[0].scrollLeft=b=this.scrollParent[0].scrollLeft-g.scrollSpeed}}}else{if(f.pageY-a(document).scrollTop()<g.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()-g.scrollSpeed)}else{if(a(window).height()-(f.pageY-a(document).scrollTop())<g.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()+g.scrollSpeed)}}if(f.pageX-a(document).scrollLeft()<g.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()-g.scrollSpeed)}else{if(a(window).width()-(f.pageX-a(document).scrollLeft())<g.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()+g.scrollSpeed)}}}if(b!==false&&a.ui.ddmanager&&!g.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,f)}}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}for(var d=this.items.length-1;d>=0;d--){var e=this.items[d],c=e.item[0],h=this._intersectsWithPointer(e);if(!h){continue}if(c!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=c&&!a.ui.contains(this.placeholder[0],c)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],c):true)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(e)){this._rearrange(f,e)}else{break}this._trigger("change",f,this._uiHash());break}}this._contactContainers(f);if(a.ui.ddmanager){a.ui.ddmanager.drag(this,f)}this._trigger("sort",f,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(c,d){if(!c){return}if(a.ui.ddmanager&&!this.options.dropBehaviour){a.ui.ddmanager.drop(this,c)}if(this.options.revert){var b=this;var e=b.placeholder.offset();b.reverting=true;a(this.helper).animate({left:e.left-this.offset.parent.left-b.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-b.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){b._clear(c)})}else{this._clear(c,d)}return false},cancel:function(){var b=this;if(this.dragging){this._mouseUp();if(this.options.helper=="original"){this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else{this.currentItem.show()}for(var c=this.containers.length-1;c>=0;c--){this.containers[c]._trigger("deactivate",null,b._uiHash(this));if(this.containers[c].containerCache.over){this.containers[c]._trigger("out",null,b._uiHash(this));this.containers[c].containerCache.over=0}}}if(this.placeholder[0].parentNode){this.placeholder[0].parentNode.removeChild(this.placeholder[0])}if(this.options.helper!="original"&&this.helper&&this.helper[0].parentNode){this.helper.remove()}a.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});if(this.domPosition.prev){a(this.domPosition.prev).after(this.currentItem)}else{a(this.domPosition.parent).prepend(this.currentItem)}return true},serialize:function(d){var b=this._getItemsAsjQuery(d&&d.connected);var c=[];d=d||{};a(b).each(function(){var e=(a(d.item||this).attr(d.attribute||"id")||"").match(d.expression||(/(.+)[-=_](.+)/));if(e){c.push((d.key||e[1]+"[]")+"="+(d.key&&d.expression?e[1]:e[2]))}});return c.join("&")},toArray:function(d){var b=this._getItemsAsjQuery(d&&d.connected);var c=[];d=d||{};b.each(function(){c.push(a(d.item||this).attr(d.attribute||"id")||"")});return c},_intersectsWith:function(m){var e=this.positionAbs.left,d=e+this.helperProportions.width,k=this.positionAbs.top,j=k+this.helperProportions.height;var f=m.left,c=f+m.width,n=m.top,i=n+m.height;var o=this.offset.click.top,h=this.offset.click.left;var g=(k+o)>n&&(k+o)<i&&(e+h)>f&&(e+h)<c;if(this.options.tolerance=="pointer"||this.options.forcePointerForContainers||(this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>m[this.floating?"width":"height"])){return g}else{return(f<e+(this.helperProportions.width/2)&&d-(this.helperProportions.width/2)<c&&n<k+(this.helperProportions.height/2)&&j-(this.helperProportions.height/2)<i)}},_intersectsWithPointer:function(d){var e=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,d.top,d.height),c=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,d.left,d.width),g=e&&c,b=this._getDragVerticalDirection(),f=this._getDragHorizontalDirection();if(!g){return false}return this.floating?(((f&&f=="right")||b=="down")?2:1):(b&&(b=="down"?2:1))},_intersectsWithSides:function(e){var c=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+(e.height/2),e.height),d=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+(e.width/2),e.width),b=this._getDragVerticalDirection(),f=this._getDragHorizontalDirection();if(this.floating&&f){return((f=="right"&&d)||(f=="left"&&!d))}else{return b&&((b=="down"&&c)||(b=="up"&&!c))}},_getDragVerticalDirection:function(){var b=this.positionAbs.top-this.lastPositionAbs.top;return b!=0&&(b>0?"down":"up")},_getDragHorizontalDirection:function(){var b=this.positionAbs.left-this.lastPositionAbs.left;return b!=0&&(b>0?"right":"left")},refresh:function(b){this._refreshItems(b);this.refreshPositions()},_connectWith:function(){var b=this.options;return b.connectWith.constructor==String?[b.connectWith]:b.connectWith},_getItemsAsjQuery:function(b){var l=this;var g=[];var e=[];var h=this._connectWith();if(h&&b){for(var d=h.length-1;d>=0;d--){var k=a(h[d]);for(var c=k.length-1;c>=0;c--){var f=a.data(k[c],"sortable");if(f&&f!=this&&!f.options.disabled){e.push([a.isFunction(f.options.items)?f.options.items.call(f.element):a(f.options.items,f.element).not(".ui-sortable-helper"),f])}}}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper"),this]);for(var d=e.length-1;d>=0;d--){e[d][0].each(function(){g.push(this)})}return a(g)},_removeCurrentsFromItems:function(){var d=this.currentItem.find(":data(sortable-item)");for(var c=0;c<this.items.length;c++){for(var b=0;b<d.length;b++){if(d[b]==this.items[c].item[0]){this.items.splice(c,1)}}}},_refreshItems:function(b){this.items=[];this.containers=[this];var h=this.items;var p=this;var f=[[a.isFunction(this.options.items)?this.options.items.call(this.element[0],b,{item:this.currentItem}):a(this.options.items,this.element),this]];var l=this._connectWith();if(l){for(var e=l.length-1;e>=0;e--){var m=a(l[e]);for(var d=m.length-1;d>=0;d--){var g=a.data(m[d],"sortable");if(g&&g!=this&&!g.options.disabled){f.push([a.isFunction(g.options.items)?g.options.items.call(g.element[0],b,{item:this.currentItem}):a(g.options.items,g.element),g]);this.containers.push(g)}}}}for(var e=f.length-1;e>=0;e--){var k=f[e][1];var c=f[e][0];for(var d=0,n=c.length;d<n;d++){var o=a(c[d]);o.data("sortable-item",k);h.push({item:o,instance:k,width:0,height:0,left:0,top:0})}}},refreshPositions:function(b){if(this.offsetParent&&this.helper){this.offset.parent=this._getParentOffset()}for(var d=this.items.length-1;d>=0;d--){var e=this.items[d];if(e.instance!=this.currentContainer&&this.currentContainer&&e.item[0]!=this.currentItem[0]){continue}var c=this.options.toleranceElement?a(this.options.toleranceElement,e.item):e.item;if(!b){e.width=c.outerWidth();e.height=c.outerHeight()}var f=c.offset();e.left=f.left;e.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers){this.options.custom.refreshContainers.call(this)}else{for(var d=this.containers.length-1;d>=0;d--){var f=this.containers[d].element.offset();this.containers[d].containerCache.left=f.left;this.containers[d].containerCache.top=f.top;this.containers[d].containerCache.width=this.containers[d].element.outerWidth();this.containers[d].containerCache.height=this.containers[d].element.outerHeight()}}},_createPlaceholder:function(d){var b=d||this,e=b.options;if(!e.placeholder||e.placeholder.constructor==String){var c=e.placeholder;e.placeholder={element:function(){var f=a(document.createElement(b.currentItem[0].nodeName)).addClass(c||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!c){f.style.visibility="hidden"}return f},update:function(f,g){if(c&&!e.forcePlaceholderSize){return}if(!g.height()){g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10))}if(!g.width()){g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=a(e.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);e.placeholder.update(b,b.placeholder)},_contactContainers:function(d){for(var c=this.containers.length-1;c>=0;c--){if(this._intersectsWith(this.containers[c].containerCache)){if(!this.containers[c].containerCache.over){if(this.currentContainer!=this.containers[c]){var h=10000;var g=null;var e=this.positionAbs[this.containers[c].floating?"left":"top"];for(var b=this.items.length-1;b>=0;b--){if(!a.ui.contains(this.containers[c].element[0],this.items[b].item[0])){continue}var f=this.items[b][this.containers[c].floating?"left":"top"];if(Math.abs(f-e)<h){h=Math.abs(f-e);g=this.items[b]}}if(!g&&!this.options.dropOnEmpty){continue}this.currentContainer=this.containers[c];g?this._rearrange(d,g,null,true):this._rearrange(d,null,this.containers[c].element,true);this._trigger("change",d,this._uiHash());this.containers[c]._trigger("change",d,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder)}this.containers[c]._trigger("over",d,this._uiHash(this));this.containers[c].containerCache.over=1}}else{if(this.containers[c].containerCache.over){this.containers[c]._trigger("out",d,this._uiHash(this));this.containers[c].containerCache.over=0}}}},_createHelper:function(c){var d=this.options;var b=a.isFunction(d.helper)?a(d.helper.apply(this.element[0],[c,this.currentItem])):(d.helper=="clone"?this.currentItem.clone():this.currentItem);if(!b.parents("body").length){a(d.appendTo!="parent"?d.appendTo:this.currentItem[0].parentNode)[0].appendChild(b[0])}if(b[0]==this.currentItem[0]){this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}}if(b[0].style.width==""||d.forceHelperSize){b.width(this.currentItem.width())}if(b[0].style.height==""||d.forceHelperSize){b.height(this.currentItem.height())}return b},_adjustOffsetFromHelper:function(b){if(b.left!=undefined){this.offset.click.left=b.left+this.margins.left}if(b.right!=undefined){this.offset.click.left=this.helperProportions.width-b.right+this.margins.left}if(b.top!=undefined){this.offset.click.top=b.top+this.margins.top}if(b.bottom!=undefined){this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){b.left+=this.scrollParent.scrollLeft();b.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)){b={top:0,left:0}}return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var b=this.currentItem.position();return{top:b.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:b.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.currentItem.css("marginLeft"),10)||0),top:(parseInt(this.currentItem.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e=this.options;if(e.containment=="parent"){e.containment=this.helper[0].parentNode}if(e.containment=="document"||e.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(e.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(e.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(e.containment)){var c=a(e.containment)[0];var d=a(e.containment).offset();var b=(a(c).css("overflow")!="hidden");this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(b?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(b?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(f,h){if(!h){h=this.position}var c=f=="absolute"?1:-1;var e=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=(/(html|body)/i).test(b[0].tagName);return{top:(h.top+this.offset.relative.top*c+this.offset.parent.top*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(g?0:b.scrollTop()))*c)),left:(h.left+this.offset.relative.left*c+this.offset.parent.left*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:b.scrollLeft())*c))}},_generatePosition:function(e){var h=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(b[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0])){this.offset.relative=this._getRelativeOffset()}var d=e.pageX;var c=e.pageY;if(this.originalPosition){if(this.containment){if(e.pageX-this.offset.click.left<this.containment[0]){d=this.containment[0]+this.offset.click.left}if(e.pageY-this.offset.click.top<this.containment[1]){c=this.containment[1]+this.offset.click.top}if(e.pageX-this.offset.click.left>this.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:(!(g-this.offset.click.top<this.containment[1])?g-h.grid[1]:g+h.grid[1])):g;var f=this.originalPageX+Math.round((d-this.originalPageX)/h.grid[0])*h.grid[0];d=this.containment?(!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:(!(f-this.offset.click.left<this.containment[0])?f-h.grid[0]:f+h.grid[0])):f}}return{top:(c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(i?0:b.scrollTop())))),left:(d-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:b.scrollLeft())))}},_rearrange:function(g,f,c,e){c?c[0].appendChild(this.placeholder[0]):f.item[0].parentNode.insertBefore(this.placeholder[0],(this.direction=="down"?f.item[0]:f.item[0].nextSibling));this.counter=this.counter?++this.counter:1;var d=this,b=this.counter;window.setTimeout(function(){if(b==d.counter){d.refreshPositions(!e)}},0)},_clear:function(d,e){this.reverting=false;var f=[],b=this;if(!this._noFinalSort&&this.currentItem[0].parentNode){this.placeholder.before(this.currentItem)}this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var c in this._storedCSS){if(this._storedCSS[c]=="auto"||this._storedCSS[c]=="static"){this._storedCSS[c]=""}}this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else{this.currentItem.show()}if(this.fromOutside&&!e){f.push(function(g){this._trigger("receive",g,this._uiHash(this.fromOutside))})}if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!e){f.push(function(g){this._trigger("update",g,this._uiHash())})}if(!a.ui.contains(this.element[0],this.currentItem[0])){if(!e){f.push(function(g){this._trigger("remove",g,this._uiHash())})}for(var c=this.containers.length-1;c>=0;c--){if(a.ui.contains(this.containers[c].element[0],this.currentItem[0])&&!e){f.push((function(g){return function(h){g._trigger("receive",h,this._uiHash(this))}}).call(this,this.containers[c]));f.push((function(g){return function(h){g._trigger("update",h,this._uiHash(this))}}).call(this,this.containers[c]))}}}for(var c=this.containers.length-1;c>=0;c--){if(!e){f.push((function(g){return function(h){g._trigger("deactivate",h,this._uiHash(this))}}).call(this,this.containers[c]))}if(this.containers[c].containerCache.over){f.push((function(g){return function(h){g._trigger("out",h,this._uiHash(this))}}).call(this,this.containers[c]));this.containers[c].containerCache.over=0}}if(this._storedCursor){a("body").css("cursor",this._storedCursor)}if(this._storedOpacity){this.helper.css("opacity",this._storedOpacity)}if(this._storedZIndex){this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex)}this.dragging=false;if(this.cancelHelperRemoval){if(!e){this._trigger("beforeStop",d,this._uiHash());for(var c=0;c<f.length;c++){f[c].call(this,d)}this._trigger("stop",d,this._uiHash())}return false}if(!e){this._trigger("beforeStop",d,this._uiHash())}this.placeholder[0].parentNode.removeChild(this.placeholder[0]);if(this.helper[0]!=this.currentItem[0]){this.helper.remove()}this.helper=null;if(!e){for(var c=0;c<f.length;c++){f[c].call(this,d)}this._trigger("stop",d,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){if(a.widget.prototype._trigger.apply(this,arguments)===false){this.cancel()}},_uiHash:function(c){var b=c||this;return{helper:b.helper,placeholder:b.placeholder||a([]),position:b.position,absolutePosition:b.positionAbs,offset:b.positionAbs,item:b.currentItem,sender:c?c.element:null}}}));a.extend(a.ui.sortable,{getter:"serialize toArray",version:"1.7.2",eventPrefix:"sort",defaults:{appendTo:"parent",axis:false,cancel:":input,option",connectWith:false,containment:false,cursor:"auto",cursorAt:false,delay:0,distance:1,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1000}})})(jQuery);;
|
@@ -0,0 +1,519 @@
|
|
1
|
+
/*
|
2
|
+
* jQuery UI 1.7.2
|
3
|
+
*
|
4
|
+
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
|
5
|
+
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
6
|
+
* and GPL (GPL-LICENSE.txt) licenses.
|
7
|
+
*
|
8
|
+
* http://docs.jquery.com/UI
|
9
|
+
*/
|
10
|
+
;jQuery.ui || (function($) {
|
11
|
+
|
12
|
+
var _remove = $.fn.remove,
|
13
|
+
isFF2 = $.browser.mozilla && (parseFloat($.browser.version) < 1.9);
|
14
|
+
|
15
|
+
//Helper functions and ui object
|
16
|
+
$.ui = {
|
17
|
+
version: "1.7.2",
|
18
|
+
|
19
|
+
// $.ui.plugin is deprecated. Use the proxy pattern instead.
|
20
|
+
plugin: {
|
21
|
+
add: function(module, option, set) {
|
22
|
+
var proto = $.ui[module].prototype;
|
23
|
+
for(var i in set) {
|
24
|
+
proto.plugins[i] = proto.plugins[i] || [];
|
25
|
+
proto.plugins[i].push([option, set[i]]);
|
26
|
+
}
|
27
|
+
},
|
28
|
+
call: function(instance, name, args) {
|
29
|
+
var set = instance.plugins[name];
|
30
|
+
if(!set || !instance.element[0].parentNode) { return; }
|
31
|
+
|
32
|
+
for (var i = 0; i < set.length; i++) {
|
33
|
+
if (instance.options[set[i][0]]) {
|
34
|
+
set[i][1].apply(instance.element, args);
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
},
|
39
|
+
|
40
|
+
contains: function(a, b) {
|
41
|
+
return document.compareDocumentPosition
|
42
|
+
? a.compareDocumentPosition(b) & 16
|
43
|
+
: a !== b && a.contains(b);
|
44
|
+
},
|
45
|
+
|
46
|
+
hasScroll: function(el, a) {
|
47
|
+
|
48
|
+
//If overflow is hidden, the element might have extra content, but the user wants to hide it
|
49
|
+
if ($(el).css('overflow') == 'hidden') { return false; }
|
50
|
+
|
51
|
+
var scroll = (a && a == 'left') ? 'scrollLeft' : 'scrollTop',
|
52
|
+
has = false;
|
53
|
+
|
54
|
+
if (el[scroll] > 0) { return true; }
|
55
|
+
|
56
|
+
// TODO: determine which cases actually cause this to happen
|
57
|
+
// if the element doesn't have the scroll set, see if it's possible to
|
58
|
+
// set the scroll
|
59
|
+
el[scroll] = 1;
|
60
|
+
has = (el[scroll] > 0);
|
61
|
+
el[scroll] = 0;
|
62
|
+
return has;
|
63
|
+
},
|
64
|
+
|
65
|
+
isOverAxis: function(x, reference, size) {
|
66
|
+
//Determines when x coordinate is over "b" element axis
|
67
|
+
return (x > reference) && (x < (reference + size));
|
68
|
+
},
|
69
|
+
|
70
|
+
isOver: function(y, x, top, left, height, width) {
|
71
|
+
//Determines when x, y coordinates is over "b" element
|
72
|
+
return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width);
|
73
|
+
},
|
74
|
+
|
75
|
+
keyCode: {
|
76
|
+
BACKSPACE: 8,
|
77
|
+
CAPS_LOCK: 20,
|
78
|
+
COMMA: 188,
|
79
|
+
CONTROL: 17,
|
80
|
+
DELETE: 46,
|
81
|
+
DOWN: 40,
|
82
|
+
END: 35,
|
83
|
+
ENTER: 13,
|
84
|
+
ESCAPE: 27,
|
85
|
+
HOME: 36,
|
86
|
+
INSERT: 45,
|
87
|
+
LEFT: 37,
|
88
|
+
NUMPAD_ADD: 107,
|
89
|
+
NUMPAD_DECIMAL: 110,
|
90
|
+
NUMPAD_DIVIDE: 111,
|
91
|
+
NUMPAD_ENTER: 108,
|
92
|
+
NUMPAD_MULTIPLY: 106,
|
93
|
+
NUMPAD_SUBTRACT: 109,
|
94
|
+
PAGE_DOWN: 34,
|
95
|
+
PAGE_UP: 33,
|
96
|
+
PERIOD: 190,
|
97
|
+
RIGHT: 39,
|
98
|
+
SHIFT: 16,
|
99
|
+
SPACE: 32,
|
100
|
+
TAB: 9,
|
101
|
+
UP: 38
|
102
|
+
}
|
103
|
+
};
|
104
|
+
|
105
|
+
// WAI-ARIA normalization
|
106
|
+
if (isFF2) {
|
107
|
+
var attr = $.attr,
|
108
|
+
removeAttr = $.fn.removeAttr,
|
109
|
+
ariaNS = "http://www.w3.org/2005/07/aaa",
|
110
|
+
ariaState = /^aria-/,
|
111
|
+
ariaRole = /^wairole:/;
|
112
|
+
|
113
|
+
$.attr = function(elem, name, value) {
|
114
|
+
var set = value !== undefined;
|
115
|
+
|
116
|
+
return (name == 'role'
|
117
|
+
? (set
|
118
|
+
? attr.call(this, elem, name, "wairole:" + value)
|
119
|
+
: (attr.apply(this, arguments) || "").replace(ariaRole, ""))
|
120
|
+
: (ariaState.test(name)
|
121
|
+
? (set
|
122
|
+
? elem.setAttributeNS(ariaNS,
|
123
|
+
name.replace(ariaState, "aaa:"), value)
|
124
|
+
: attr.call(this, elem, name.replace(ariaState, "aaa:")))
|
125
|
+
: attr.apply(this, arguments)));
|
126
|
+
};
|
127
|
+
|
128
|
+
$.fn.removeAttr = function(name) {
|
129
|
+
return (ariaState.test(name)
|
130
|
+
? this.each(function() {
|
131
|
+
this.removeAttributeNS(ariaNS, name.replace(ariaState, ""));
|
132
|
+
}) : removeAttr.call(this, name));
|
133
|
+
};
|
134
|
+
}
|
135
|
+
|
136
|
+
//jQuery plugins
|
137
|
+
$.fn.extend({
|
138
|
+
remove: function() {
|
139
|
+
// Safari has a native remove event which actually removes DOM elements,
|
140
|
+
// so we have to use triggerHandler instead of trigger (#3037).
|
141
|
+
$("*", this).add(this).each(function() {
|
142
|
+
$(this).triggerHandler("remove");
|
143
|
+
});
|
144
|
+
return _remove.apply(this, arguments );
|
145
|
+
},
|
146
|
+
|
147
|
+
enableSelection: function() {
|
148
|
+
return this
|
149
|
+
.attr('unselectable', 'off')
|
150
|
+
.css('MozUserSelect', '')
|
151
|
+
.unbind('selectstart.ui');
|
152
|
+
},
|
153
|
+
|
154
|
+
disableSelection: function() {
|
155
|
+
return this
|
156
|
+
.attr('unselectable', 'on')
|
157
|
+
.css('MozUserSelect', 'none')
|
158
|
+
.bind('selectstart.ui', function() { return false; });
|
159
|
+
},
|
160
|
+
|
161
|
+
scrollParent: function() {
|
162
|
+
var scrollParent;
|
163
|
+
if(($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
|
164
|
+
scrollParent = this.parents().filter(function() {
|
165
|
+
return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
|
166
|
+
}).eq(0);
|
167
|
+
} else {
|
168
|
+
scrollParent = this.parents().filter(function() {
|
169
|
+
return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
|
170
|
+
}).eq(0);
|
171
|
+
}
|
172
|
+
|
173
|
+
return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
|
174
|
+
}
|
175
|
+
});
|
176
|
+
|
177
|
+
|
178
|
+
//Additional selectors
|
179
|
+
$.extend($.expr[':'], {
|
180
|
+
data: function(elem, i, match) {
|
181
|
+
return !!$.data(elem, match[3]);
|
182
|
+
},
|
183
|
+
|
184
|
+
focusable: function(element) {
|
185
|
+
var nodeName = element.nodeName.toLowerCase(),
|
186
|
+
tabIndex = $.attr(element, 'tabindex');
|
187
|
+
return (/input|select|textarea|button|object/.test(nodeName)
|
188
|
+
? !element.disabled
|
189
|
+
: 'a' == nodeName || 'area' == nodeName
|
190
|
+
? element.href || !isNaN(tabIndex)
|
191
|
+
: !isNaN(tabIndex))
|
192
|
+
// the element and all of its ancestors must be visible
|
193
|
+
// the browser may report that the area is hidden
|
194
|
+
&& !$(element)['area' == nodeName ? 'parents' : 'closest'](':hidden').length;
|
195
|
+
},
|
196
|
+
|
197
|
+
tabbable: function(element) {
|
198
|
+
var tabIndex = $.attr(element, 'tabindex');
|
199
|
+
return (isNaN(tabIndex) || tabIndex >= 0) && $(element).is(':focusable');
|
200
|
+
}
|
201
|
+
});
|
202
|
+
|
203
|
+
|
204
|
+
// $.widget is a factory to create jQuery plugins
|
205
|
+
// taking some boilerplate code out of the plugin code
|
206
|
+
function getter(namespace, plugin, method, args) {
|
207
|
+
function getMethods(type) {
|
208
|
+
var methods = $[namespace][plugin][type] || [];
|
209
|
+
return (typeof methods == 'string' ? methods.split(/,?\s+/) : methods);
|
210
|
+
}
|
211
|
+
|
212
|
+
var methods = getMethods('getter');
|
213
|
+
if (args.length == 1 && typeof args[0] == 'string') {
|
214
|
+
methods = methods.concat(getMethods('getterSetter'));
|
215
|
+
}
|
216
|
+
return ($.inArray(method, methods) != -1);
|
217
|
+
}
|
218
|
+
|
219
|
+
$.widget = function(name, prototype) {
|
220
|
+
var namespace = name.split(".")[0];
|
221
|
+
name = name.split(".")[1];
|
222
|
+
|
223
|
+
// create plugin method
|
224
|
+
$.fn[name] = function(options) {
|
225
|
+
var isMethodCall = (typeof options == 'string'),
|
226
|
+
args = Array.prototype.slice.call(arguments, 1);
|
227
|
+
|
228
|
+
// prevent calls to internal methods
|
229
|
+
if (isMethodCall && options.substring(0, 1) == '_') {
|
230
|
+
return this;
|
231
|
+
}
|
232
|
+
|
233
|
+
// handle getter methods
|
234
|
+
if (isMethodCall && getter(namespace, name, options, args)) {
|
235
|
+
var instance = $.data(this[0], name);
|
236
|
+
return (instance ? instance[options].apply(instance, args)
|
237
|
+
: undefined);
|
238
|
+
}
|
239
|
+
|
240
|
+
// handle initialization and non-getter methods
|
241
|
+
return this.each(function() {
|
242
|
+
var instance = $.data(this, name);
|
243
|
+
|
244
|
+
// constructor
|
245
|
+
(!instance && !isMethodCall &&
|
246
|
+
$.data(this, name, new $[namespace][name](this, options))._init());
|
247
|
+
|
248
|
+
// method call
|
249
|
+
(instance && isMethodCall && $.isFunction(instance[options]) &&
|
250
|
+
instance[options].apply(instance, args));
|
251
|
+
});
|
252
|
+
};
|
253
|
+
|
254
|
+
// create widget constructor
|
255
|
+
$[namespace] = $[namespace] || {};
|
256
|
+
$[namespace][name] = function(element, options) {
|
257
|
+
var self = this;
|
258
|
+
|
259
|
+
this.namespace = namespace;
|
260
|
+
this.widgetName = name;
|
261
|
+
this.widgetEventPrefix = $[namespace][name].eventPrefix || name;
|
262
|
+
this.widgetBaseClass = namespace + '-' + name;
|
263
|
+
|
264
|
+
this.options = $.extend({},
|
265
|
+
$.widget.defaults,
|
266
|
+
$[namespace][name].defaults,
|
267
|
+
$.metadata && $.metadata.get(element)[name],
|
268
|
+
options);
|
269
|
+
|
270
|
+
this.element = $(element)
|
271
|
+
.bind('setData.' + name, function(event, key, value) {
|
272
|
+
if (event.target == element) {
|
273
|
+
return self._setData(key, value);
|
274
|
+
}
|
275
|
+
})
|
276
|
+
.bind('getData.' + name, function(event, key) {
|
277
|
+
if (event.target == element) {
|
278
|
+
return self._getData(key);
|
279
|
+
}
|
280
|
+
})
|
281
|
+
.bind('remove', function() {
|
282
|
+
return self.destroy();
|
283
|
+
});
|
284
|
+
};
|
285
|
+
|
286
|
+
// add widget prototype
|
287
|
+
$[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype);
|
288
|
+
|
289
|
+
// TODO: merge getter and getterSetter properties from widget prototype
|
290
|
+
// and plugin prototype
|
291
|
+
$[namespace][name].getterSetter = 'option';
|
292
|
+
};
|
293
|
+
|
294
|
+
$.widget.prototype = {
|
295
|
+
_init: function() {},
|
296
|
+
destroy: function() {
|
297
|
+
this.element.removeData(this.widgetName)
|
298
|
+
.removeClass(this.widgetBaseClass + '-disabled' + ' ' + this.namespace + '-state-disabled')
|
299
|
+
.removeAttr('aria-disabled');
|
300
|
+
},
|
301
|
+
|
302
|
+
option: function(key, value) {
|
303
|
+
var options = key,
|
304
|
+
self = this;
|
305
|
+
|
306
|
+
if (typeof key == "string") {
|
307
|
+
if (value === undefined) {
|
308
|
+
return this._getData(key);
|
309
|
+
}
|
310
|
+
options = {};
|
311
|
+
options[key] = value;
|
312
|
+
}
|
313
|
+
|
314
|
+
$.each(options, function(key, value) {
|
315
|
+
self._setData(key, value);
|
316
|
+
});
|
317
|
+
},
|
318
|
+
_getData: function(key) {
|
319
|
+
return this.options[key];
|
320
|
+
},
|
321
|
+
_setData: function(key, value) {
|
322
|
+
this.options[key] = value;
|
323
|
+
|
324
|
+
if (key == 'disabled') {
|
325
|
+
this.element
|
326
|
+
[value ? 'addClass' : 'removeClass'](
|
327
|
+
this.widgetBaseClass + '-disabled' + ' ' +
|
328
|
+
this.namespace + '-state-disabled')
|
329
|
+
.attr("aria-disabled", value);
|
330
|
+
}
|
331
|
+
},
|
332
|
+
|
333
|
+
enable: function() {
|
334
|
+
this._setData('disabled', false);
|
335
|
+
},
|
336
|
+
disable: function() {
|
337
|
+
this._setData('disabled', true);
|
338
|
+
},
|
339
|
+
|
340
|
+
_trigger: function(type, event, data) {
|
341
|
+
var callback = this.options[type],
|
342
|
+
eventName = (type == this.widgetEventPrefix
|
343
|
+
? type : this.widgetEventPrefix + type);
|
344
|
+
|
345
|
+
event = $.Event(event);
|
346
|
+
event.type = eventName;
|
347
|
+
|
348
|
+
// copy original event properties over to the new event
|
349
|
+
// this would happen if we could call $.event.fix instead of $.Event
|
350
|
+
// but we don't have a way to force an event to be fixed multiple times
|
351
|
+
if (event.originalEvent) {
|
352
|
+
for (var i = $.event.props.length, prop; i;) {
|
353
|
+
prop = $.event.props[--i];
|
354
|
+
event[prop] = event.originalEvent[prop];
|
355
|
+
}
|
356
|
+
}
|
357
|
+
|
358
|
+
this.element.trigger(event, data);
|
359
|
+
|
360
|
+
return !($.isFunction(callback) && callback.call(this.element[0], event, data) === false
|
361
|
+
|| event.isDefaultPrevented());
|
362
|
+
}
|
363
|
+
};
|
364
|
+
|
365
|
+
$.widget.defaults = {
|
366
|
+
disabled: false
|
367
|
+
};
|
368
|
+
|
369
|
+
|
370
|
+
/** Mouse Interaction Plugin **/
|
371
|
+
|
372
|
+
$.ui.mouse = {
|
373
|
+
_mouseInit: function() {
|
374
|
+
var self = this;
|
375
|
+
|
376
|
+
this.element
|
377
|
+
.bind('mousedown.'+this.widgetName, function(event) {
|
378
|
+
return self._mouseDown(event);
|
379
|
+
})
|
380
|
+
.bind('click.'+this.widgetName, function(event) {
|
381
|
+
if(self._preventClickEvent) {
|
382
|
+
self._preventClickEvent = false;
|
383
|
+
event.stopImmediatePropagation();
|
384
|
+
return false;
|
385
|
+
}
|
386
|
+
});
|
387
|
+
|
388
|
+
// Prevent text selection in IE
|
389
|
+
if ($.browser.msie) {
|
390
|
+
this._mouseUnselectable = this.element.attr('unselectable');
|
391
|
+
this.element.attr('unselectable', 'on');
|
392
|
+
}
|
393
|
+
|
394
|
+
this.started = false;
|
395
|
+
},
|
396
|
+
|
397
|
+
// TODO: make sure destroying one instance of mouse doesn't mess with
|
398
|
+
// other instances of mouse
|
399
|
+
_mouseDestroy: function() {
|
400
|
+
this.element.unbind('.'+this.widgetName);
|
401
|
+
|
402
|
+
// Restore text selection in IE
|
403
|
+
($.browser.msie
|
404
|
+
&& this.element.attr('unselectable', this._mouseUnselectable));
|
405
|
+
},
|
406
|
+
|
407
|
+
_mouseDown: function(event) {
|
408
|
+
// don't let more than one widget handle mouseStart
|
409
|
+
// TODO: figure out why we have to use originalEvent
|
410
|
+
event.originalEvent = event.originalEvent || {};
|
411
|
+
if (event.originalEvent.mouseHandled) { return; }
|
412
|
+
|
413
|
+
// we may have missed mouseup (out of window)
|
414
|
+
(this._mouseStarted && this._mouseUp(event));
|
415
|
+
|
416
|
+
this._mouseDownEvent = event;
|
417
|
+
|
418
|
+
var self = this,
|
419
|
+
btnIsLeft = (event.which == 1),
|
420
|
+
elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
|
421
|
+
if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
|
422
|
+
return true;
|
423
|
+
}
|
424
|
+
|
425
|
+
this.mouseDelayMet = !this.options.delay;
|
426
|
+
if (!this.mouseDelayMet) {
|
427
|
+
this._mouseDelayTimer = setTimeout(function() {
|
428
|
+
self.mouseDelayMet = true;
|
429
|
+
}, this.options.delay);
|
430
|
+
}
|
431
|
+
|
432
|
+
if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
|
433
|
+
this._mouseStarted = (this._mouseStart(event) !== false);
|
434
|
+
if (!this._mouseStarted) {
|
435
|
+
event.preventDefault();
|
436
|
+
return true;
|
437
|
+
}
|
438
|
+
}
|
439
|
+
|
440
|
+
// these delegates are required to keep context
|
441
|
+
this._mouseMoveDelegate = function(event) {
|
442
|
+
return self._mouseMove(event);
|
443
|
+
};
|
444
|
+
this._mouseUpDelegate = function(event) {
|
445
|
+
return self._mouseUp(event);
|
446
|
+
};
|
447
|
+
$(document)
|
448
|
+
.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
|
449
|
+
.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
|
450
|
+
|
451
|
+
// preventDefault() is used to prevent the selection of text here -
|
452
|
+
// however, in Safari, this causes select boxes not to be selectable
|
453
|
+
// anymore, so this fix is needed
|
454
|
+
($.browser.safari || event.preventDefault());
|
455
|
+
|
456
|
+
event.originalEvent.mouseHandled = true;
|
457
|
+
return true;
|
458
|
+
},
|
459
|
+
|
460
|
+
_mouseMove: function(event) {
|
461
|
+
// IE mouseup check - mouseup happened when mouse was out of window
|
462
|
+
if ($.browser.msie && !event.button) {
|
463
|
+
return this._mouseUp(event);
|
464
|
+
}
|
465
|
+
|
466
|
+
if (this._mouseStarted) {
|
467
|
+
this._mouseDrag(event);
|
468
|
+
return event.preventDefault();
|
469
|
+
}
|
470
|
+
|
471
|
+
if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
|
472
|
+
this._mouseStarted =
|
473
|
+
(this._mouseStart(this._mouseDownEvent, event) !== false);
|
474
|
+
(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
|
475
|
+
}
|
476
|
+
|
477
|
+
return !this._mouseStarted;
|
478
|
+
},
|
479
|
+
|
480
|
+
_mouseUp: function(event) {
|
481
|
+
$(document)
|
482
|
+
.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
|
483
|
+
.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
|
484
|
+
|
485
|
+
if (this._mouseStarted) {
|
486
|
+
this._mouseStarted = false;
|
487
|
+
this._preventClickEvent = (event.target == this._mouseDownEvent.target);
|
488
|
+
this._mouseStop(event);
|
489
|
+
}
|
490
|
+
|
491
|
+
return false;
|
492
|
+
},
|
493
|
+
|
494
|
+
_mouseDistanceMet: function(event) {
|
495
|
+
return (Math.max(
|
496
|
+
Math.abs(this._mouseDownEvent.pageX - event.pageX),
|
497
|
+
Math.abs(this._mouseDownEvent.pageY - event.pageY)
|
498
|
+
) >= this.options.distance
|
499
|
+
);
|
500
|
+
},
|
501
|
+
|
502
|
+
_mouseDelayMet: function(event) {
|
503
|
+
return this.mouseDelayMet;
|
504
|
+
},
|
505
|
+
|
506
|
+
// These are placeholder methods, to be overriden by extending plugin
|
507
|
+
_mouseStart: function(event) {},
|
508
|
+
_mouseDrag: function(event) {},
|
509
|
+
_mouseStop: function(event) {},
|
510
|
+
_mouseCapture: function(event) { return true; }
|
511
|
+
};
|
512
|
+
|
513
|
+
$.ui.mouse.defaults = {
|
514
|
+
cancel: null,
|
515
|
+
distance: 1,
|
516
|
+
delay: 0
|
517
|
+
};
|
518
|
+
|
519
|
+
})(jQuery);
|