cantango_editor 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. data/.rspec +2 -0
  2. data/Gemfile +26 -0
  3. data/Gemfile.lock +177 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +80 -0
  6. data/Rakefile +54 -0
  7. data/VERSION +1 -0
  8. data/app/assets/images/cantango_editor/+.png +0 -0
  9. data/app/assets/images/cantango_editor/-.png +0 -0
  10. data/app/assets/images/cantango_editor/.gitkeep +0 -0
  11. data/app/assets/images/cantango_editor/bg-1.gif +0 -0
  12. data/app/assets/images/cantango_editor/bg-2.gif +0 -0
  13. data/app/assets/images/cantango_editor/bg-model.png +0 -0
  14. data/app/assets/images/cantango_editor/bg.gif +0 -0
  15. data/app/assets/images/cantango_editor/bg_action.gif +0 -0
  16. data/app/assets/images/cantango_editor/bg_action.png +0 -0
  17. data/app/assets/images/cantango_editor/bg_can.gif +0 -0
  18. data/app/assets/images/cantango_editor/bg_can.png +0 -0
  19. data/app/assets/images/cantango_editor/bg_cannot.gif +0 -0
  20. data/app/assets/images/cantango_editor/bg_cannot.png +0 -0
  21. data/app/assets/images/cantango_editor/button-top-r.png +0 -0
  22. data/app/assets/images/cantango_editor/button-top.png +0 -0
  23. data/app/assets/images/cantango_editor/cantangologo.png +0 -0
  24. data/app/assets/images/cantango_editor/cantangologo_big.png +0 -0
  25. data/app/assets/images/cantango_editor/cantangologo_big2.png +0 -0
  26. data/app/assets/images/cantango_editor/cantangologo_big3.png +0 -0
  27. data/app/assets/images/cantango_editor/ico-uc.png +0 -0
  28. data/app/assets/images/cantango_editor/images/ui-bg_diagonal-maze_20_6e4f1c_10x10.png +0 -0
  29. data/app/assets/images/cantango_editor/images/ui-bg_diagonal-maze_40_000000_10x10.png +0 -0
  30. data/app/assets/images/cantango_editor/images/ui-bg_fine-grain_10_eceadf_60x60.png +0 -0
  31. data/app/assets/images/cantango_editor/images/ui-bg_fine-grain_10_f8f7f6_60x60.png +0 -0
  32. data/app/assets/images/cantango_editor/images/ui-bg_fine-grain_15_eceadf_60x60.png +0 -0
  33. data/app/assets/images/cantango_editor/images/ui-bg_fine-grain_15_f7f3de_60x60.png +0 -0
  34. data/app/assets/images/cantango_editor/images/ui-bg_fine-grain_15_ffffff_60x60.png +0 -0
  35. data/app/assets/images/cantango_editor/images/ui-bg_fine-grain_65_654b24_60x60.png +0 -0
  36. data/app/assets/images/cantango_editor/images/ui-bg_fine-grain_68_b83400_60x60.png +0 -0
  37. data/app/assets/images/cantango_editor/images/ui-icons_222222_256x240.png +0 -0
  38. data/app/assets/images/cantango_editor/images/ui-icons_3572ac_256x240.png +0 -0
  39. data/app/assets/images/cantango_editor/images/ui-icons_8c291d_256x240.png +0 -0
  40. data/app/assets/images/cantango_editor/images/ui-icons_b83400_256x240.png +0 -0
  41. data/app/assets/images/cantango_editor/images/ui-icons_fbdb93_256x240.png +0 -0
  42. data/app/assets/images/cantango_editor/images/ui-icons_ffffff_256x240.png +0 -0
  43. data/app/assets/images/cantango_editor/line2.png +0 -0
  44. data/app/assets/images/cantango_editor/line3.png +0 -0
  45. data/app/assets/images/cantango_editor/panel-l.gif +0 -0
  46. data/app/assets/images/cantango_editor/panel-l.png +0 -0
  47. data/app/assets/images/cantango_editor/panel-r.gif +0 -0
  48. data/app/assets/images/cantango_editor/panel-r.png +0 -0
  49. data/app/assets/images/cantango_editor/panel.gif +0 -0
  50. data/app/assets/images/cantango_editor/panel.png +0 -0
  51. data/app/assets/images/cantango_editor/remember.png +0 -0
  52. data/app/assets/images/cantango_editor/sexy.png +0 -0
  53. data/app/assets/images/cantango_editor/x.png +0 -0
  54. data/app/assets/images/cantango_editor/xx.png +0 -0
  55. data/app/assets/javascripts/cantango_editor/application.js +59 -0
  56. data/app/assets/javascripts/cantango_editor/jquery.collapse.js +149 -0
  57. data/app/assets/javascripts/cantango_editor/jquery.cookie.js +96 -0
  58. data/app/assets/javascripts/cantango_editor/jquery.ui/jquery-ui-1.8.16.custom.js +996 -0
  59. data/app/assets/javascripts/cantango_editor/jquery.ui/jquery.ui.selectmenu.js +802 -0
  60. data/app/assets/stylesheets/cantango_editor/.main.css +157 -0
  61. data/app/assets/stylesheets/cantango_editor/application.css +7 -0
  62. data/app/assets/stylesheets/cantango_editor/areset.css +53 -0
  63. data/app/assets/stylesheets/cantango_editor/clearing.css +52 -0
  64. data/app/assets/stylesheets/cantango_editor/jquery-ui-1.8.16.custom.css +290 -0
  65. data/app/assets/stylesheets/cantango_editor/jquery.ui.selectmenu.css +30 -0
  66. data/app/assets/stylesheets/cantango_editor/main.css +294 -0
  67. data/app/assets/stylesheets/cantango_editor/text.css +97 -0
  68. data/app/controllers/cantango_editor/application_controller.rb +12 -0
  69. data/app/controllers/cantango_editor/permissions_controller.rb +47 -0
  70. data/app/helpers/cantango_editor/application_helper.rb +49 -0
  71. data/app/models/cantango_editor/categories.rb +52 -0
  72. data/app/models/cantango_editor/category.rb +21 -0
  73. data/app/models/cantango_editor/permissions.rb +119 -0
  74. data/app/views/cantango_editor/permissions/_footer.html.erb +4 -0
  75. data/app/views/cantango_editor/permissions/_header.html.erb +7 -0
  76. data/app/views/cantango_editor/permissions/_menu.html.erb +7 -0
  77. data/app/views/cantango_editor/permissions/_new_categories_select.html.erb +5 -0
  78. data/app/views/cantango_editor/permissions/_new_custom_targets.html.erb +5 -0
  79. data/app/views/cantango_editor/permissions/_new_targets_select.html.erb +5 -0
  80. data/app/views/cantango_editor/permissions/_permissions_form.html.erb +63 -0
  81. data/app/views/cantango_editor/permissions/index.html.erb +5 -0
  82. data/app/views/cantango_editor/permissions/index.js.erb +2 -0
  83. data/app/views/cantango_editor/permissions/new_category.js.erb +3 -0
  84. data/app/views/cantango_editor/permissions/new_custom_target.js.erb +2 -0
  85. data/app/views/cantango_editor/permissions/new_target.js.erb +4 -0
  86. data/app/views/cantango_editor/permissions/notes.html.erb +19 -0
  87. data/app/views/cantango_editor/permissions/preview_raw.html.erb +3 -0
  88. data/app/views/cantango_editor/permissions/temp _permissions_form.html.erb +55 -0
  89. data/app/views/layouts/cantango_editor/application.html.erb +14 -0
  90. data/cantango_editor.gemspec +258 -0
  91. data/config/routes.rb +15 -0
  92. data/lib/array.rb +11 -0
  93. data/lib/cantango_editor.rb +25 -0
  94. data/lib/cantango_editor/configuration.rb +34 -0
  95. data/lib/cantango_editor/engine.rb +11 -0
  96. data/lib/cantango_editor/version.rb +3 -0
  97. data/lib/permissions_hash.rb +80 -0
  98. data/lib/tasks/cantango-editor_tasks.rake +4 -0
  99. data/lib/time_precise.rb +7 -0
  100. data/script/rails +6 -0
  101. data/spec/cantango_editor/configuration/configuration_spec.rb +33 -0
  102. data/spec/cantango_editor/models/permissions_spec.rb +9 -0
  103. data/spec/cantango_editor_spec.rb +17 -0
  104. data/spec/dummy/Rakefile +7 -0
  105. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  106. data/spec/dummy/app/assets/javascripts/main.js +2 -0
  107. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  108. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  109. data/spec/dummy/app/controllers/main_controller.rb +5 -0
  110. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  111. data/spec/dummy/app/helpers/main_helper.rb +2 -0
  112. data/spec/dummy/app/mailers/.gitkeep +0 -0
  113. data/spec/dummy/app/models/.gitkeep +0 -0
  114. data/spec/dummy/app/models/admin.rb +5 -0
  115. data/spec/dummy/app/models/article.rb +2 -0
  116. data/spec/dummy/app/models/comment.rb +2 -0
  117. data/spec/dummy/app/models/concerto.rb +2 -0
  118. data/spec/dummy/app/models/guest.rb +14 -0
  119. data/spec/dummy/app/models/improvisation.rb +2 -0
  120. data/spec/dummy/app/models/post.rb +2 -0
  121. data/spec/dummy/app/models/song.rb +2 -0
  122. data/spec/dummy/app/models/tune.rb +2 -0
  123. data/spec/dummy/app/models/user.rb +11 -0
  124. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  125. data/spec/dummy/app/views/main/index.html.erb +3 -0
  126. data/spec/dummy/config.ru +4 -0
  127. data/spec/dummy/config/application.rb +53 -0
  128. data/spec/dummy/config/boot.rb +10 -0
  129. data/spec/dummy/config/categories.yml +10 -0
  130. data/spec/dummy/config/database.yml +25 -0
  131. data/spec/dummy/config/environment.rb +5 -0
  132. data/spec/dummy/config/environments/development.rb +30 -0
  133. data/spec/dummy/config/environments/production.rb +60 -0
  134. data/spec/dummy/config/environments/test.rb +39 -0
  135. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  136. data/spec/dummy/config/initializers/cantango.rb +4 -0
  137. data/spec/dummy/config/initializers/cantango_editor.rb +4 -0
  138. data/spec/dummy/config/initializers/devise.rb +210 -0
  139. data/spec/dummy/config/initializers/inflections.rb +10 -0
  140. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  141. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  142. data/spec/dummy/config/initializers/session_store.rb +8 -0
  143. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  144. data/spec/dummy/config/locales/devise.en.yml +58 -0
  145. data/spec/dummy/config/locales/en.yml +5 -0
  146. data/spec/dummy/config/permissions.yml.save +59 -0
  147. data/spec/dummy/config/routes.rb +15 -0
  148. data/spec/dummy/db/development.sqlite3 +0 -0
  149. data/spec/dummy/db/migrate/20111018203622_create_posts.rb +9 -0
  150. data/spec/dummy/db/migrate/20111018203648_create_articles.rb +9 -0
  151. data/spec/dummy/db/migrate/20111018203800_create_comments.rb +9 -0
  152. data/spec/dummy/db/migrate/20111018203817_create_songs.rb +9 -0
  153. data/spec/dummy/db/migrate/20111018203827_create_tunes.rb +9 -0
  154. data/spec/dummy/db/migrate/20111018203859_create_concertos.rb +9 -0
  155. data/spec/dummy/db/migrate/20111018203917_create_improvisations.rb +9 -0
  156. data/spec/dummy/db/migrate/20111019122217_devise_create_users.rb +28 -0
  157. data/spec/dummy/db/schema.rb +58 -0
  158. data/spec/dummy/db/test.sqlite3 +0 -0
  159. data/spec/dummy/lib/assets/.gitkeep +0 -0
  160. data/spec/dummy/log/.gitkeep +0 -0
  161. data/spec/dummy/public/404.html +26 -0
  162. data/spec/dummy/public/422.html +26 -0
  163. data/spec/dummy/public/500.html +26 -0
  164. data/spec/dummy/public/favicon.ico +0 -0
  165. data/spec/dummy/script/rails +6 -0
  166. data/spec/integration/navigation_spec.rb +18 -0
  167. data/spec/permissions_hash_spec.rb +63 -0
  168. data/spec/requests/requests_spec.rb +9 -0
  169. data/spec/spec_helper.rb +16 -0
  170. metadata +416 -0
@@ -0,0 +1,59 @@
1
+ // This is a manifest file that'll be compiled into including all the files listed below.
2
+ // Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
3
+ // be included in the compiled file accessible from http://example.com/assets/application.js
4
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5
+ // the compiled file.
6
+ //
7
+ //= require jquery
8
+ //= require jquery_ujs
9
+ //= require_tree .
10
+
11
+ $(document).ready(function() {
12
+
13
+ // Fetch Models select dialog
14
+ $('.new_target_link:not([disabled=disabled])').live('click', function(event){
15
+ // event.preventDefault();
16
+ $(this).addClass("link_processing");
17
+ $('.models_select_close_link').trigger('click');
18
+ return false;
19
+ });
20
+
21
+ // Delete one Model
22
+ $('.delete_target_link').live('click', function(event){
23
+ $(this).prev().removeAttr('disabled');
24
+ $('form').submit();
25
+ return false;
26
+ });
27
+
28
+ // Hovers events for table cells
29
+ $('.models_cell').live('mouseenter', function(){
30
+ timeou = setTimeout(function(target){
31
+ $(target).children('.sexy_buttons').css('opacity', '1');
32
+ //$(this).children('.sexy_buttons').css('visibility', 'visible')
33
+ }, 150, this);
34
+ }).live('mouseleave', function(){
35
+ clearTimeout(timeou);
36
+ $(this).children('.sexy_buttons').css('opacity', '0.3');
37
+ //$('.sexy_buttons').css('visibility', 'hidden');
38
+ });
39
+
40
+ // Enable selectmenu() on <select>
41
+ $('.models_select').live('ajaxLoad', function(){
42
+ $(this).selectmenu({style:'popup', width: 220, maxHeight:200, change: function(e, object){$('form').submit();}});
43
+ });
44
+
45
+ // Closes Models select dialog
46
+ $('.models_select_close_link').live('click', function(){
47
+ $('.new_target_link').removeAttr('disabled');
48
+ $('.models_select_block').remove();
49
+ return false;
50
+ });
51
+
52
+ $('.permission_group_section').collapse();
53
+
54
+ $('.models_line').live('mouseenter', function(){
55
+ $(this).children('.delete_target_section').show();
56
+ }).live('mouseleave',function(){
57
+ $(this).children('.delete_target_section').hide();
58
+ });
59
+ });
@@ -0,0 +1,149 @@
1
+ /*
2
+ * Collapse plugin for jQuery
3
+ * http://github.com/danielstocks/jQuery-Collapse/
4
+ *
5
+ * @author Daniel Stocks (http://webcloud.se)
6
+ * Copyright 2010, Daniel Stocks
7
+ * Released under the MIT, BSD, and GPL Licenses.
8
+ */
9
+
10
+ (function($) {
11
+
12
+ // Use a cookie counter to allow multiple instances of the plugin
13
+ var cookieCounter = 0;
14
+
15
+ $.fn.extend({
16
+ collapse: function(options) {
17
+
18
+ var defaults = {
19
+ head : "h3",
20
+ group : "div, ul",
21
+ cookieName : "collapse",
22
+ // Default function for showing content
23
+ show: function() {
24
+ this.show();
25
+ },
26
+ // Default function for hiding content
27
+ hide: function() {
28
+ this.hide();
29
+ }
30
+ };
31
+ var op = $.extend(defaults, options);
32
+
33
+ // Default CSS classes
34
+ var active = "active",
35
+ inactive = "inactive";
36
+
37
+ return this.each(function() {
38
+
39
+ // Increment coookie counter to ensure cookie name integrity
40
+ cookieCounter++;
41
+ var obj = $(this),
42
+ // Find all headers and wrap them in <a> for accessibility.
43
+ sections = obj.find(op.head).wrapInner('<a href="#"></a>'),
44
+ l = sections.length,
45
+ cookie = op.cookieName + "_" + cookieCounter;
46
+ // Locate all panels directly following a header
47
+ var panel = obj.find(op.head).map(function() {
48
+ var head = $(this)
49
+ if(!head.hasClass(active)) {
50
+ return head.next(op.group).hide()[0];
51
+ }
52
+ return head.next(op.group)[0];
53
+ });
54
+
55
+ // Bind event for showing content
56
+ obj.bind("show", function(e, bypass) {
57
+ var obj = $(e.target);
58
+ // ARIA attribute
59
+ obj.attr('aria-hidden', false)
60
+ .prev()
61
+ .removeClass(inactive)
62
+ .addClass(active);
63
+ // Bypass method for instant display
64
+ if(bypass) {
65
+ obj.show();
66
+ } else {
67
+ op.show.call(obj);
68
+ }
69
+ });
70
+
71
+ // Bind event for hiding content
72
+ obj.bind("hide", function(e, bypass) {
73
+ var obj = $(e.target);
74
+ obj.attr('aria-hidden', true)
75
+ .prev()
76
+ .removeClass(active)
77
+ .addClass(inactive);
78
+ if(bypass) {
79
+ obj.hide();
80
+ } else {
81
+ op.hide.call(obj);
82
+ }
83
+ });
84
+
85
+ // Look for existing cookies
86
+ if(cookieSupport) {
87
+ for (var c=0;c<=l;c++) {
88
+ var val = $.cookie(cookie + c);
89
+ // Show content if associating cookie is found
90
+ if ( val == c + "open" ) {
91
+ panel.eq(c).trigger('show', [true]);
92
+ // Hide content
93
+ } else if ( val == c + "closed") {
94
+ panel.eq(c).trigger('hide', [true]);
95
+ }
96
+ }
97
+ }
98
+
99
+ // Delegate click event to show/hide content.
100
+ obj.bind("click", function(e) {
101
+ var t = $(e.target);
102
+ // Check if header was clicked
103
+ if(!t.is(op.head)) {
104
+ // What about link inside header.
105
+ if ( t.parent().is(op.head) ) {
106
+ t = t.parent();
107
+ } else {
108
+ return;
109
+ }
110
+ e.preventDefault();
111
+ }
112
+ // Figure out what position the clicked header has.
113
+ var num = sections.index(t),
114
+ cookieName = cookie + num,
115
+ cookieVal = num,
116
+ content = t.next(op.group);
117
+ // If content is already active, hide it.
118
+ if(t.hasClass(active)) {
119
+ content.trigger('hide');
120
+ cookieVal += 'closed';
121
+ if(cookieSupport) {
122
+ $.cookie(cookieName, cookieVal, { path: '/', expires: 10 });
123
+ }
124
+ return;
125
+ }
126
+ // Otherwise show it.
127
+ content.trigger('show');
128
+ cookieVal += 'open';
129
+ if(cookieSupport) {
130
+ $.cookie(cookieName, cookieVal, { path: '/', expires: 10 });
131
+ }
132
+ });
133
+ });
134
+ }
135
+ });
136
+
137
+ // Make sure can we eat cookies without getting into trouble.
138
+ var cookie = true;
139
+ $(function() {
140
+ try {
141
+ $.cookie('x', 'x', { path: '/', expires: 10 });
142
+ }
143
+ catch(e) {
144
+ cookie = false;
145
+ $.cookie('x', null);
146
+ }
147
+ });
148
+ var cookieSupport = $.fn.collapse.cookieSupport = cookie;
149
+ })(jQuery);
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Cookie plugin
3
+ *
4
+ * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
5
+ * Dual licensed under the MIT and GPL licenses:
6
+ * http://www.opensource.org/licenses/mit-license.php
7
+ * http://www.gnu.org/licenses/gpl.html
8
+ *
9
+ */
10
+
11
+ /**
12
+ * Create a cookie with the given name and value and other optional parameters.
13
+ *
14
+ * @example $.cookie('the_cookie', 'the_value');
15
+ * @desc Set the value of a cookie.
16
+ * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
17
+ * @desc Create a cookie with all available options.
18
+ * @example $.cookie('the_cookie', 'the_value');
19
+ * @desc Create a session cookie.
20
+ * @example $.cookie('the_cookie', null);
21
+ * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
22
+ * used when the cookie was set.
23
+ *
24
+ * @param String name The name of the cookie.
25
+ * @param String value The value of the cookie.
26
+ * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
27
+ * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
28
+ * If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
29
+ * If set to null or omitted, the cookie will be a session cookie and will not be retained
30
+ * when the the browser exits.
31
+ * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
32
+ * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
33
+ * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
34
+ * require a secure protocol (like HTTPS).
35
+ * @type undefined
36
+ *
37
+ * @name $.cookie
38
+ * @cat Plugins/Cookie
39
+ * @author Klaus Hartl/klaus.hartl@stilbuero.de
40
+ */
41
+
42
+ /**
43
+ * Get the value of a cookie with the given name.
44
+ *
45
+ * @example $.cookie('the_cookie');
46
+ * @desc Get the value of a cookie.
47
+ *
48
+ * @param String name The name of the cookie.
49
+ * @return The value of the cookie.
50
+ * @type String
51
+ *
52
+ * @name $.cookie
53
+ * @cat Plugins/Cookie
54
+ * @author Klaus Hartl/klaus.hartl@stilbuero.de
55
+ */
56
+ jQuery.cookie = function(name, value, options) {
57
+ if (typeof value != 'undefined') { // name and value given, set cookie
58
+ options = options || {};
59
+ if (value === null) {
60
+ value = '';
61
+ options.expires = -1;
62
+ }
63
+ var expires = '';
64
+ if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
65
+ var date;
66
+ if (typeof options.expires == 'number') {
67
+ date = new Date();
68
+ date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
69
+ } else {
70
+ date = options.expires;
71
+ }
72
+ expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
73
+ }
74
+ // CAUTION: Needed to parenthesize options.path and options.domain
75
+ // in the following expressions, otherwise they evaluate to undefined
76
+ // in the packed version for some reason...
77
+ var path = options.path ? '; path=' + (options.path) : '';
78
+ var domain = options.domain ? '; domain=' + (options.domain) : '';
79
+ var secure = options.secure ? '; secure' : '';
80
+ document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
81
+ } else { // only name given, get cookie
82
+ var cookieValue = null;
83
+ if (document.cookie && document.cookie != '') {
84
+ var cookies = document.cookie.split(';');
85
+ for (var i = 0; i < cookies.length; i++) {
86
+ var cookie = jQuery.trim(cookies[i]);
87
+ // Does this cookie string begin with the name we want?
88
+ if (cookie.substring(0, name.length + 1) == (name + '=')) {
89
+ cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
90
+ break;
91
+ }
92
+ }
93
+ }
94
+ return cookieValue;
95
+ }
96
+ };
@@ -0,0 +1,996 @@
1
+ /*!
2
+ * jQuery UI 1.8.16
3
+ *
4
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
5
+ * Dual licensed under the MIT or GPL Version 2 licenses.
6
+ * http://jquery.org/license
7
+ *
8
+ * http://docs.jquery.com/UI
9
+ */
10
+ (function( $, undefined ) {
11
+
12
+ // prevent duplicate loading
13
+ // this is only a problem because we proxy existing functions
14
+ // and we don't want to double proxy them
15
+ $.ui = $.ui || {};
16
+ if ( $.ui.version ) {
17
+ return;
18
+ }
19
+
20
+ $.extend( $.ui, {
21
+ version: "1.8.16",
22
+
23
+ keyCode: {
24
+ ALT: 18,
25
+ BACKSPACE: 8,
26
+ CAPS_LOCK: 20,
27
+ COMMA: 188,
28
+ COMMAND: 91,
29
+ COMMAND_LEFT: 91, // COMMAND
30
+ COMMAND_RIGHT: 93,
31
+ CONTROL: 17,
32
+ DELETE: 46,
33
+ DOWN: 40,
34
+ END: 35,
35
+ ENTER: 13,
36
+ ESCAPE: 27,
37
+ HOME: 36,
38
+ INSERT: 45,
39
+ LEFT: 37,
40
+ MENU: 93, // COMMAND_RIGHT
41
+ NUMPAD_ADD: 107,
42
+ NUMPAD_DECIMAL: 110,
43
+ NUMPAD_DIVIDE: 111,
44
+ NUMPAD_ENTER: 108,
45
+ NUMPAD_MULTIPLY: 106,
46
+ NUMPAD_SUBTRACT: 109,
47
+ PAGE_DOWN: 34,
48
+ PAGE_UP: 33,
49
+ PERIOD: 190,
50
+ RIGHT: 39,
51
+ SHIFT: 16,
52
+ SPACE: 32,
53
+ TAB: 9,
54
+ UP: 38,
55
+ WINDOWS: 91 // COMMAND
56
+ }
57
+ });
58
+
59
+ // plugins
60
+ $.fn.extend({
61
+ propAttr: $.fn.prop || $.fn.attr,
62
+
63
+ _focus: $.fn.focus,
64
+ focus: function( delay, fn ) {
65
+ return typeof delay === "number" ?
66
+ this.each(function() {
67
+ var elem = this;
68
+ setTimeout(function() {
69
+ $( elem ).focus();
70
+ if ( fn ) {
71
+ fn.call( elem );
72
+ }
73
+ }, delay );
74
+ }) :
75
+ this._focus.apply( this, arguments );
76
+ },
77
+
78
+ scrollParent: function() {
79
+ var scrollParent;
80
+ if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
81
+ scrollParent = this.parents().filter(function() {
82
+ 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));
83
+ }).eq(0);
84
+ } else {
85
+ scrollParent = this.parents().filter(function() {
86
+ return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
87
+ }).eq(0);
88
+ }
89
+
90
+ return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
91
+ },
92
+
93
+ zIndex: function( zIndex ) {
94
+ if ( zIndex !== undefined ) {
95
+ return this.css( "zIndex", zIndex );
96
+ }
97
+
98
+ if ( this.length ) {
99
+ var elem = $( this[ 0 ] ), position, value;
100
+ while ( elem.length && elem[ 0 ] !== document ) {
101
+ // Ignore z-index if position is set to a value where z-index is ignored by the browser
102
+ // This makes behavior of this function consistent across browsers
103
+ // WebKit always returns auto if the element is positioned
104
+ position = elem.css( "position" );
105
+ if ( position === "absolute" || position === "relative" || position === "fixed" ) {
106
+ // IE returns 0 when zIndex is not specified
107
+ // other browsers return a string
108
+ // we ignore the case of nested elements with an explicit value of 0
109
+ // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
110
+ value = parseInt( elem.css( "zIndex" ), 10 );
111
+ if ( !isNaN( value ) && value !== 0 ) {
112
+ return value;
113
+ }
114
+ }
115
+ elem = elem.parent();
116
+ }
117
+ }
118
+
119
+ return 0;
120
+ },
121
+
122
+ disableSelection: function() {
123
+ return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
124
+ ".ui-disableSelection", function( event ) {
125
+ event.preventDefault();
126
+ });
127
+ },
128
+
129
+ enableSelection: function() {
130
+ return this.unbind( ".ui-disableSelection" );
131
+ }
132
+ });
133
+
134
+ $.each( [ "Width", "Height" ], function( i, name ) {
135
+ var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
136
+ type = name.toLowerCase(),
137
+ orig = {
138
+ innerWidth: $.fn.innerWidth,
139
+ innerHeight: $.fn.innerHeight,
140
+ outerWidth: $.fn.outerWidth,
141
+ outerHeight: $.fn.outerHeight
142
+ };
143
+
144
+ function reduce( elem, size, border, margin ) {
145
+ $.each( side, function() {
146
+ size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
147
+ if ( border ) {
148
+ size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
149
+ }
150
+ if ( margin ) {
151
+ size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
152
+ }
153
+ });
154
+ return size;
155
+ }
156
+
157
+ $.fn[ "inner" + name ] = function( size ) {
158
+ if ( size === undefined ) {
159
+ return orig[ "inner" + name ].call( this );
160
+ }
161
+
162
+ return this.each(function() {
163
+ $( this ).css( type, reduce( this, size ) + "px" );
164
+ });
165
+ };
166
+
167
+ $.fn[ "outer" + name] = function( size, margin ) {
168
+ if ( typeof size !== "number" ) {
169
+ return orig[ "outer" + name ].call( this, size );
170
+ }
171
+
172
+ return this.each(function() {
173
+ $( this).css( type, reduce( this, size, true, margin ) + "px" );
174
+ });
175
+ };
176
+ });
177
+
178
+ // selectors
179
+ function focusable( element, isTabIndexNotNaN ) {
180
+ var nodeName = element.nodeName.toLowerCase();
181
+ if ( "area" === nodeName ) {
182
+ var map = element.parentNode,
183
+ mapName = map.name,
184
+ img;
185
+ if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
186
+ return false;
187
+ }
188
+ img = $( "img[usemap=#" + mapName + "]" )[0];
189
+ return !!img && visible( img );
190
+ }
191
+ return ( /input|select|textarea|button|object/.test( nodeName )
192
+ ? !element.disabled
193
+ : "a" == nodeName
194
+ ? element.href || isTabIndexNotNaN
195
+ : isTabIndexNotNaN)
196
+ // the element and all of its ancestors must be visible
197
+ && visible( element );
198
+ }
199
+
200
+ function visible( element ) {
201
+ return !$( element ).parents().andSelf().filter(function() {
202
+ return $.curCSS( this, "visibility" ) === "hidden" ||
203
+ $.expr.filters.hidden( this );
204
+ }).length;
205
+ }
206
+
207
+ $.extend( $.expr[ ":" ], {
208
+ data: function( elem, i, match ) {
209
+ return !!$.data( elem, match[ 3 ] );
210
+ },
211
+
212
+ focusable: function( element ) {
213
+ return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
214
+ },
215
+
216
+ tabbable: function( element ) {
217
+ var tabIndex = $.attr( element, "tabindex" ),
218
+ isTabIndexNaN = isNaN( tabIndex );
219
+ return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
220
+ }
221
+ });
222
+
223
+ // support
224
+ $(function() {
225
+ var body = document.body,
226
+ div = body.appendChild( div = document.createElement( "div" ) );
227
+
228
+ $.extend( div.style, {
229
+ minHeight: "100px",
230
+ height: "auto",
231
+ padding: 0,
232
+ borderWidth: 0
233
+ });
234
+
235
+ $.support.minHeight = div.offsetHeight === 100;
236
+ $.support.selectstart = "onselectstart" in div;
237
+
238
+ // set display to none to avoid a layout bug in IE
239
+ // http://dev.jquery.com/ticket/4014
240
+ body.removeChild( div ).style.display = "none";
241
+ });
242
+
243
+
244
+
245
+
246
+
247
+ // deprecated
248
+ $.extend( $.ui, {
249
+ // $.ui.plugin is deprecated. Use the proxy pattern instead.
250
+ plugin: {
251
+ add: function( module, option, set ) {
252
+ var proto = $.ui[ module ].prototype;
253
+ for ( var i in set ) {
254
+ proto.plugins[ i ] = proto.plugins[ i ] || [];
255
+ proto.plugins[ i ].push( [ option, set[ i ] ] );
256
+ }
257
+ },
258
+ call: function( instance, name, args ) {
259
+ var set = instance.plugins[ name ];
260
+ if ( !set || !instance.element[ 0 ].parentNode ) {
261
+ return;
262
+ }
263
+
264
+ for ( var i = 0; i < set.length; i++ ) {
265
+ if ( instance.options[ set[ i ][ 0 ] ] ) {
266
+ set[ i ][ 1 ].apply( instance.element, args );
267
+ }
268
+ }
269
+ }
270
+ },
271
+
272
+ // will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
273
+ contains: function( a, b ) {
274
+ return document.compareDocumentPosition ?
275
+ a.compareDocumentPosition( b ) & 16 :
276
+ a !== b && a.contains( b );
277
+ },
278
+
279
+ // only used by resizable
280
+ hasScroll: function( el, a ) {
281
+
282
+ //If overflow is hidden, the element might have extra content, but the user wants to hide it
283
+ if ( $( el ).css( "overflow" ) === "hidden") {
284
+ return false;
285
+ }
286
+
287
+ var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
288
+ has = false;
289
+
290
+ if ( el[ scroll ] > 0 ) {
291
+ return true;
292
+ }
293
+
294
+ // TODO: determine which cases actually cause this to happen
295
+ // if the element doesn't have the scroll set, see if it's possible to
296
+ // set the scroll
297
+ el[ scroll ] = 1;
298
+ has = ( el[ scroll ] > 0 );
299
+ el[ scroll ] = 0;
300
+ return has;
301
+ },
302
+
303
+ // these are odd functions, fix the API or move into individual plugins
304
+ isOverAxis: function( x, reference, size ) {
305
+ //Determines when x coordinate is over "b" element axis
306
+ return ( x > reference ) && ( x < ( reference + size ) );
307
+ },
308
+ isOver: function( y, x, top, left, height, width ) {
309
+ //Determines when x, y coordinates is over "b" element
310
+ return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
311
+ }
312
+ });
313
+
314
+ })( jQuery );
315
+ /*!
316
+ * jQuery UI Widget 1.8.16
317
+ *
318
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
319
+ * Dual licensed under the MIT or GPL Version 2 licenses.
320
+ * http://jquery.org/license
321
+ *
322
+ * http://docs.jquery.com/UI/Widget
323
+ */
324
+ (function( $, undefined ) {
325
+
326
+ // jQuery 1.4+
327
+ if ( $.cleanData ) {
328
+ var _cleanData = $.cleanData;
329
+ $.cleanData = function( elems ) {
330
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
331
+ try {
332
+ $( elem ).triggerHandler( "remove" );
333
+ // http://bugs.jquery.com/ticket/8235
334
+ } catch( e ) {}
335
+ }
336
+ _cleanData( elems );
337
+ };
338
+ } else {
339
+ var _remove = $.fn.remove;
340
+ $.fn.remove = function( selector, keepData ) {
341
+ return this.each(function() {
342
+ if ( !keepData ) {
343
+ if ( !selector || $.filter( selector, [ this ] ).length ) {
344
+ $( "*", this ).add( [ this ] ).each(function() {
345
+ try {
346
+ $( this ).triggerHandler( "remove" );
347
+ // http://bugs.jquery.com/ticket/8235
348
+ } catch( e ) {}
349
+ });
350
+ }
351
+ }
352
+ return _remove.call( $(this), selector, keepData );
353
+ });
354
+ };
355
+ }
356
+
357
+ $.widget = function( name, base, prototype ) {
358
+ var namespace = name.split( "." )[ 0 ],
359
+ fullName;
360
+ name = name.split( "." )[ 1 ];
361
+ fullName = namespace + "-" + name;
362
+
363
+ if ( !prototype ) {
364
+ prototype = base;
365
+ base = $.Widget;
366
+ }
367
+
368
+ // create selector for plugin
369
+ $.expr[ ":" ][ fullName ] = function( elem ) {
370
+ return !!$.data( elem, name );
371
+ };
372
+
373
+ $[ namespace ] = $[ namespace ] || {};
374
+ $[ namespace ][ name ] = function( options, element ) {
375
+ // allow instantiation without initializing for simple inheritance
376
+ if ( arguments.length ) {
377
+ this._createWidget( options, element );
378
+ }
379
+ };
380
+
381
+ var basePrototype = new base();
382
+ // we need to make the options hash a property directly on the new instance
383
+ // otherwise we'll modify the options hash on the prototype that we're
384
+ // inheriting from
385
+ // $.each( basePrototype, function( key, val ) {
386
+ // if ( $.isPlainObject(val) ) {
387
+ // basePrototype[ key ] = $.extend( {}, val );
388
+ // }
389
+ // });
390
+ basePrototype.options = $.extend( true, {}, basePrototype.options );
391
+ $[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
392
+ namespace: namespace,
393
+ widgetName: name,
394
+ widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
395
+ widgetBaseClass: fullName
396
+ }, prototype );
397
+
398
+ $.widget.bridge( name, $[ namespace ][ name ] );
399
+ };
400
+
401
+ $.widget.bridge = function( name, object ) {
402
+ $.fn[ name ] = function( options ) {
403
+ var isMethodCall = typeof options === "string",
404
+ args = Array.prototype.slice.call( arguments, 1 ),
405
+ returnValue = this;
406
+
407
+ // allow multiple hashes to be passed on init
408
+ options = !isMethodCall && args.length ?
409
+ $.extend.apply( null, [ true, options ].concat(args) ) :
410
+ options;
411
+
412
+ // prevent calls to internal methods
413
+ if ( isMethodCall && options.charAt( 0 ) === "_" ) {
414
+ return returnValue;
415
+ }
416
+
417
+ if ( isMethodCall ) {
418
+ this.each(function() {
419
+ var instance = $.data( this, name ),
420
+ methodValue = instance && $.isFunction( instance[options] ) ?
421
+ instance[ options ].apply( instance, args ) :
422
+ instance;
423
+ // TODO: add this back in 1.9 and use $.error() (see #5972)
424
+ // if ( !instance ) {
425
+ // throw "cannot call methods on " + name + " prior to initialization; " +
426
+ // "attempted to call method '" + options + "'";
427
+ // }
428
+ // if ( !$.isFunction( instance[options] ) ) {
429
+ // throw "no such method '" + options + "' for " + name + " widget instance";
430
+ // }
431
+ // var methodValue = instance[ options ].apply( instance, args );
432
+ if ( methodValue !== instance && methodValue !== undefined ) {
433
+ returnValue = methodValue;
434
+ return false;
435
+ }
436
+ });
437
+ } else {
438
+ this.each(function() {
439
+ var instance = $.data( this, name );
440
+ if ( instance ) {
441
+ instance.option( options || {} )._init();
442
+ } else {
443
+ $.data( this, name, new object( options, this ) );
444
+ }
445
+ });
446
+ }
447
+
448
+ return returnValue;
449
+ };
450
+ };
451
+
452
+ $.Widget = function( options, element ) {
453
+ // allow instantiation without initializing for simple inheritance
454
+ if ( arguments.length ) {
455
+ this._createWidget( options, element );
456
+ }
457
+ };
458
+
459
+ $.Widget.prototype = {
460
+ widgetName: "widget",
461
+ widgetEventPrefix: "",
462
+ options: {
463
+ disabled: false
464
+ },
465
+ _createWidget: function( options, element ) {
466
+ // $.widget.bridge stores the plugin instance, but we do it anyway
467
+ // so that it's stored even before the _create function runs
468
+ $.data( element, this.widgetName, this );
469
+ this.element = $( element );
470
+ this.options = $.extend( true, {},
471
+ this.options,
472
+ this._getCreateOptions(),
473
+ options );
474
+
475
+ var self = this;
476
+ this.element.bind( "remove." + this.widgetName, function() {
477
+ self.destroy();
478
+ });
479
+
480
+ this._create();
481
+ this._trigger( "create" );
482
+ this._init();
483
+ },
484
+ _getCreateOptions: function() {
485
+ return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
486
+ },
487
+ _create: function() {},
488
+ _init: function() {},
489
+
490
+ destroy: function() {
491
+ this.element
492
+ .unbind( "." + this.widgetName )
493
+ .removeData( this.widgetName );
494
+ this.widget()
495
+ .unbind( "." + this.widgetName )
496
+ .removeAttr( "aria-disabled" )
497
+ .removeClass(
498
+ this.widgetBaseClass + "-disabled " +
499
+ "ui-state-disabled" );
500
+ },
501
+
502
+ widget: function() {
503
+ return this.element;
504
+ },
505
+
506
+ option: function( key, value ) {
507
+ var options = key;
508
+
509
+ if ( arguments.length === 0 ) {
510
+ // don't return a reference to the internal hash
511
+ return $.extend( {}, this.options );
512
+ }
513
+
514
+ if (typeof key === "string" ) {
515
+ if ( value === undefined ) {
516
+ return this.options[ key ];
517
+ }
518
+ options = {};
519
+ options[ key ] = value;
520
+ }
521
+
522
+ this._setOptions( options );
523
+
524
+ return this;
525
+ },
526
+ _setOptions: function( options ) {
527
+ var self = this;
528
+ $.each( options, function( key, value ) {
529
+ self._setOption( key, value );
530
+ });
531
+
532
+ return this;
533
+ },
534
+ _setOption: function( key, value ) {
535
+ this.options[ key ] = value;
536
+
537
+ if ( key === "disabled" ) {
538
+ this.widget()
539
+ [ value ? "addClass" : "removeClass"](
540
+ this.widgetBaseClass + "-disabled" + " " +
541
+ "ui-state-disabled" )
542
+ .attr( "aria-disabled", value );
543
+ }
544
+
545
+ return this;
546
+ },
547
+
548
+ enable: function() {
549
+ return this._setOption( "disabled", false );
550
+ },
551
+ disable: function() {
552
+ return this._setOption( "disabled", true );
553
+ },
554
+
555
+ _trigger: function( type, event, data ) {
556
+ var callback = this.options[ type ];
557
+
558
+ event = $.Event( event );
559
+ event.type = ( type === this.widgetEventPrefix ?
560
+ type :
561
+ this.widgetEventPrefix + type ).toLowerCase();
562
+ data = data || {};
563
+
564
+ // copy original event properties over to the new event
565
+ // this would happen if we could call $.event.fix instead of $.Event
566
+ // but we don't have a way to force an event to be fixed multiple times
567
+ if ( event.originalEvent ) {
568
+ for ( var i = $.event.props.length, prop; i; ) {
569
+ prop = $.event.props[ --i ];
570
+ event[ prop ] = event.originalEvent[ prop ];
571
+ }
572
+ }
573
+
574
+ this.element.trigger( event, data );
575
+
576
+ return !( $.isFunction(callback) &&
577
+ callback.call( this.element[0], event, data ) === false ||
578
+ event.isDefaultPrevented() );
579
+ }
580
+ };
581
+
582
+ })( jQuery );
583
+ /*!
584
+ * jQuery UI Mouse 1.8.16
585
+ *
586
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
587
+ * Dual licensed under the MIT or GPL Version 2 licenses.
588
+ * http://jquery.org/license
589
+ *
590
+ * http://docs.jquery.com/UI/Mouse
591
+ *
592
+ * Depends:
593
+ * jquery.ui.widget.js
594
+ */
595
+ (function( $, undefined ) {
596
+
597
+ var mouseHandled = false;
598
+ $( document ).mouseup( function( e ) {
599
+ mouseHandled = false;
600
+ });
601
+
602
+ $.widget("ui.mouse", {
603
+ options: {
604
+ cancel: ':input,option',
605
+ distance: 1,
606
+ delay: 0
607
+ },
608
+ _mouseInit: function() {
609
+ var self = this;
610
+
611
+ this.element
612
+ .bind('mousedown.'+this.widgetName, function(event) {
613
+ return self._mouseDown(event);
614
+ })
615
+ .bind('click.'+this.widgetName, function(event) {
616
+ if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
617
+ $.removeData(event.target, self.widgetName + '.preventClickEvent');
618
+ event.stopImmediatePropagation();
619
+ return false;
620
+ }
621
+ });
622
+
623
+ this.started = false;
624
+ },
625
+
626
+ // TODO: make sure destroying one instance of mouse doesn't mess with
627
+ // other instances of mouse
628
+ _mouseDestroy: function() {
629
+ this.element.unbind('.'+this.widgetName);
630
+ },
631
+
632
+ _mouseDown: function(event) {
633
+ // don't let more than one widget handle mouseStart
634
+ if( mouseHandled ) { return };
635
+
636
+ // we may have missed mouseup (out of window)
637
+ (this._mouseStarted && this._mouseUp(event));
638
+
639
+ this._mouseDownEvent = event;
640
+
641
+ var self = this,
642
+ btnIsLeft = (event.which == 1),
643
+ // event.target.nodeName works around a bug in IE 8 with
644
+ // disabled inputs (#7620)
645
+ elIsCancel = (typeof this.options.cancel == "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
646
+ if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
647
+ return true;
648
+ }
649
+
650
+ this.mouseDelayMet = !this.options.delay;
651
+ if (!this.mouseDelayMet) {
652
+ this._mouseDelayTimer = setTimeout(function() {
653
+ self.mouseDelayMet = true;
654
+ }, this.options.delay);
655
+ }
656
+
657
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
658
+ this._mouseStarted = (this._mouseStart(event) !== false);
659
+ if (!this._mouseStarted) {
660
+ event.preventDefault();
661
+ return true;
662
+ }
663
+ }
664
+
665
+ // Click event may never have fired (Gecko & Opera)
666
+ if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
667
+ $.removeData(event.target, this.widgetName + '.preventClickEvent');
668
+ }
669
+
670
+ // these delegates are required to keep context
671
+ this._mouseMoveDelegate = function(event) {
672
+ return self._mouseMove(event);
673
+ };
674
+ this._mouseUpDelegate = function(event) {
675
+ return self._mouseUp(event);
676
+ };
677
+ $(document)
678
+ .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
679
+ .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
680
+
681
+ event.preventDefault();
682
+
683
+ mouseHandled = true;
684
+ return true;
685
+ },
686
+
687
+ _mouseMove: function(event) {
688
+ // IE mouseup check - mouseup happened when mouse was out of window
689
+ if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
690
+ return this._mouseUp(event);
691
+ }
692
+
693
+ if (this._mouseStarted) {
694
+ this._mouseDrag(event);
695
+ return event.preventDefault();
696
+ }
697
+
698
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
699
+ this._mouseStarted =
700
+ (this._mouseStart(this._mouseDownEvent, event) !== false);
701
+ (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
702
+ }
703
+
704
+ return !this._mouseStarted;
705
+ },
706
+
707
+ _mouseUp: function(event) {
708
+ $(document)
709
+ .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
710
+ .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
711
+
712
+ if (this._mouseStarted) {
713
+ this._mouseStarted = false;
714
+
715
+ if (event.target == this._mouseDownEvent.target) {
716
+ $.data(event.target, this.widgetName + '.preventClickEvent', true);
717
+ }
718
+
719
+ this._mouseStop(event);
720
+ }
721
+
722
+ return false;
723
+ },
724
+
725
+ _mouseDistanceMet: function(event) {
726
+ return (Math.max(
727
+ Math.abs(this._mouseDownEvent.pageX - event.pageX),
728
+ Math.abs(this._mouseDownEvent.pageY - event.pageY)
729
+ ) >= this.options.distance
730
+ );
731
+ },
732
+
733
+ _mouseDelayMet: function(event) {
734
+ return this.mouseDelayMet;
735
+ },
736
+
737
+ // These are placeholder methods, to be overriden by extending plugin
738
+ _mouseStart: function(event) {},
739
+ _mouseDrag: function(event) {},
740
+ _mouseStop: function(event) {},
741
+ _mouseCapture: function(event) { return true; }
742
+ });
743
+
744
+ })(jQuery);
745
+ /*
746
+ * jQuery UI Position 1.8.16
747
+ *
748
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
749
+ * Dual licensed under the MIT or GPL Version 2 licenses.
750
+ * http://jquery.org/license
751
+ *
752
+ * http://docs.jquery.com/UI/Position
753
+ */
754
+ (function( $, undefined ) {
755
+
756
+ $.ui = $.ui || {};
757
+
758
+ var horizontalPositions = /left|center|right/,
759
+ verticalPositions = /top|center|bottom/,
760
+ center = "center",
761
+ _position = $.fn.position,
762
+ _offset = $.fn.offset;
763
+
764
+ $.fn.position = function( options ) {
765
+ if ( !options || !options.of ) {
766
+ return _position.apply( this, arguments );
767
+ }
768
+
769
+ // make a copy, we don't want to modify arguments
770
+ options = $.extend( {}, options );
771
+
772
+ var target = $( options.of ),
773
+ targetElem = target[0],
774
+ collision = ( options.collision || "flip" ).split( " " ),
775
+ offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
776
+ targetWidth,
777
+ targetHeight,
778
+ basePosition;
779
+
780
+ if ( targetElem.nodeType === 9 ) {
781
+ targetWidth = target.width();
782
+ targetHeight = target.height();
783
+ basePosition = { top: 0, left: 0 };
784
+ // TODO: use $.isWindow() in 1.9
785
+ } else if ( targetElem.setTimeout ) {
786
+ targetWidth = target.width();
787
+ targetHeight = target.height();
788
+ basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
789
+ } else if ( targetElem.preventDefault ) {
790
+ // force left top to allow flipping
791
+ options.at = "left top";
792
+ targetWidth = targetHeight = 0;
793
+ basePosition = { top: options.of.pageY, left: options.of.pageX };
794
+ } else {
795
+ targetWidth = target.outerWidth();
796
+ targetHeight = target.outerHeight();
797
+ basePosition = target.offset();
798
+ }
799
+
800
+ // force my and at to have valid horizontal and veritcal positions
801
+ // if a value is missing or invalid, it will be converted to center
802
+ $.each( [ "my", "at" ], function() {
803
+ var pos = ( options[this] || "" ).split( " " );
804
+ if ( pos.length === 1) {
805
+ pos = horizontalPositions.test( pos[0] ) ?
806
+ pos.concat( [center] ) :
807
+ verticalPositions.test( pos[0] ) ?
808
+ [ center ].concat( pos ) :
809
+ [ center, center ];
810
+ }
811
+ pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;
812
+ pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;
813
+ options[ this ] = pos;
814
+ });
815
+
816
+ // normalize collision option
817
+ if ( collision.length === 1 ) {
818
+ collision[ 1 ] = collision[ 0 ];
819
+ }
820
+
821
+ // normalize offset option
822
+ offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
823
+ if ( offset.length === 1 ) {
824
+ offset[ 1 ] = offset[ 0 ];
825
+ }
826
+ offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
827
+
828
+ if ( options.at[0] === "right" ) {
829
+ basePosition.left += targetWidth;
830
+ } else if ( options.at[0] === center ) {
831
+ basePosition.left += targetWidth / 2;
832
+ }
833
+
834
+ if ( options.at[1] === "bottom" ) {
835
+ basePosition.top += targetHeight;
836
+ } else if ( options.at[1] === center ) {
837
+ basePosition.top += targetHeight / 2;
838
+ }
839
+
840
+ basePosition.left += offset[ 0 ];
841
+ basePosition.top += offset[ 1 ];
842
+
843
+ return this.each(function() {
844
+ var elem = $( this ),
845
+ elemWidth = elem.outerWidth(),
846
+ elemHeight = elem.outerHeight(),
847
+ marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,
848
+ marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,
849
+ collisionWidth = elemWidth + marginLeft +
850
+ ( parseInt( $.curCSS( this, "marginRight", true ) ) || 0 ),
851
+ collisionHeight = elemHeight + marginTop +
852
+ ( parseInt( $.curCSS( this, "marginBottom", true ) ) || 0 ),
853
+ position = $.extend( {}, basePosition ),
854
+ collisionPosition;
855
+
856
+ if ( options.my[0] === "right" ) {
857
+ position.left -= elemWidth;
858
+ } else if ( options.my[0] === center ) {
859
+ position.left -= elemWidth / 2;
860
+ }
861
+
862
+ if ( options.my[1] === "bottom" ) {
863
+ position.top -= elemHeight;
864
+ } else if ( options.my[1] === center ) {
865
+ position.top -= elemHeight / 2;
866
+ }
867
+
868
+ // prevent fractions (see #5280)
869
+ position.left = Math.round( position.left );
870
+ position.top = Math.round( position.top );
871
+
872
+ collisionPosition = {
873
+ left: position.left - marginLeft,
874
+ top: position.top - marginTop
875
+ };
876
+
877
+ $.each( [ "left", "top" ], function( i, dir ) {
878
+ if ( $.ui.position[ collision[i] ] ) {
879
+ $.ui.position[ collision[i] ][ dir ]( position, {
880
+ targetWidth: targetWidth,
881
+ targetHeight: targetHeight,
882
+ elemWidth: elemWidth,
883
+ elemHeight: elemHeight,
884
+ collisionPosition: collisionPosition,
885
+ collisionWidth: collisionWidth,
886
+ collisionHeight: collisionHeight,
887
+ offset: offset,
888
+ my: options.my,
889
+ at: options.at
890
+ });
891
+ }
892
+ });
893
+
894
+ if ( $.fn.bgiframe ) {
895
+ elem.bgiframe();
896
+ }
897
+ elem.offset( $.extend( position, { using: options.using } ) );
898
+ });
899
+ };
900
+
901
+ $.ui.position = {
902
+ fit: {
903
+ left: function( position, data ) {
904
+ var win = $( window ),
905
+ over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
906
+ position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );
907
+ },
908
+ top: function( position, data ) {
909
+ var win = $( window ),
910
+ over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
911
+ position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );
912
+ }
913
+ },
914
+
915
+ flip: {
916
+ left: function( position, data ) {
917
+ if ( data.at[0] === center ) {
918
+ return;
919
+ }
920
+ var win = $( window ),
921
+ over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),
922
+ myOffset = data.my[ 0 ] === "left" ?
923
+ -data.elemWidth :
924
+ data.my[ 0 ] === "right" ?
925
+ data.elemWidth :
926
+ 0,
927
+ atOffset = data.at[ 0 ] === "left" ?
928
+ data.targetWidth :
929
+ -data.targetWidth,
930
+ offset = -2 * data.offset[ 0 ];
931
+ position.left += data.collisionPosition.left < 0 ?
932
+ myOffset + atOffset + offset :
933
+ over > 0 ?
934
+ myOffset + atOffset + offset :
935
+ 0;
936
+ },
937
+ top: function( position, data ) {
938
+ if ( data.at[1] === center ) {
939
+ return;
940
+ }
941
+ var win = $( window ),
942
+ over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),
943
+ myOffset = data.my[ 1 ] === "top" ?
944
+ -data.elemHeight :
945
+ data.my[ 1 ] === "bottom" ?
946
+ data.elemHeight :
947
+ 0,
948
+ atOffset = data.at[ 1 ] === "top" ?
949
+ data.targetHeight :
950
+ -data.targetHeight,
951
+ offset = -2 * data.offset[ 1 ];
952
+ position.top += data.collisionPosition.top < 0 ?
953
+ myOffset + atOffset + offset :
954
+ over > 0 ?
955
+ myOffset + atOffset + offset :
956
+ 0;
957
+ }
958
+ }
959
+ };
960
+
961
+ // offset setter from jQuery 1.4
962
+ if ( !$.offset.setOffset ) {
963
+ $.offset.setOffset = function( elem, options ) {
964
+ // set position first, in-case top/left are set even on static elem
965
+ if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
966
+ elem.style.position = "relative";
967
+ }
968
+ var curElem = $( elem ),
969
+ curOffset = curElem.offset(),
970
+ curTop = parseInt( $.curCSS( elem, "top", true ), 10 ) || 0,
971
+ curLeft = parseInt( $.curCSS( elem, "left", true ), 10) || 0,
972
+ props = {
973
+ top: (options.top - curOffset.top) + curTop,
974
+ left: (options.left - curOffset.left) + curLeft
975
+ };
976
+
977
+ if ( 'using' in options ) {
978
+ options.using.call( elem, props );
979
+ } else {
980
+ curElem.css( props );
981
+ }
982
+ };
983
+
984
+ $.fn.offset = function( options ) {
985
+ var elem = this[ 0 ];
986
+ if ( !elem || !elem.ownerDocument ) { return null; }
987
+ if ( options ) {
988
+ return this.each(function() {
989
+ $.offset.setOffset( this, options );
990
+ });
991
+ }
992
+ return _offset.call( this );
993
+ };
994
+ }
995
+
996
+ }( jQuery ));