2 * Interface Elements for jQuery
\r
5 * http://interface.eyecon.ro
\r
7 * Copyright (c) 2006 Stefan Petre
\r
8 * Dual licensed under the MIT (MIT-LICENSE.txt)
\r
9 * and GPL (GPL-LICENSE.txt) licenses.
\r
14 jQuery.selectHelper = null;
\r
15 jQuery.selectKeyHelper = false;
\r
16 jQuery.selectdrug = null;
\r
17 jQuery.selectCurrent = []; // For current selection
\r
18 jQuery.selectKeyDown = function(e) {
\r
19 var pressedKey = e.charCode || e.keyCode || -1;
\r
20 if (pressedKey == 17 || pressedKey == 16) {
\r
21 jQuery.selectKeyHelper = true;
\r
24 jQuery.selectKeyUp = function(e) {
\r
25 jQuery.selectKeyHelper = false;
\r
27 jQuery.selectstart = function(e) {
\r
28 this.f.pointer = jQuery.iUtil.getPointer(e);
\r
29 this.f.pos = jQuery.extend(
\r
30 jQuery.iUtil.getPosition(this),
\r
31 jQuery.iUtil.getSize(this)
\r
34 this.f.scr = jQuery.iUtil.getScroll(this);
\r
35 this.f.pointer.x -= this.f.pos.x;
\r
36 this.f.pointer.y -= this.f.pos.y;
\r
37 jQuery(this).append(jQuery.selectHelper.get(0));
\r
39 jQuery.selectHelper.addClass(this.f.hc).css('display','block');
\r
40 jQuery.selectHelper.css(
\r
48 jQuery.selectHelper.css('opacity', this.f.o);
\r
51 jQuery.selectdrug = this;
\r
52 jQuery.selectedone = false;
\r
53 jQuery.selectCurrent = []; // For current selection state
\r
58 x: this.offsetLeft + (this.currentStyle && !jQuery.browser.opera ?parseInt(this.currentStyle.borderLeftWidth)||0:0) + (jQuery.selectdrug.scrollLeft||0),
\r
59 y: this.offsetTop + (this.currentStyle && !jQuery.browser.opera ?parseInt(this.currentStyle.borderTopWidth)||0:0) + (jQuery.selectdrug.scrollTop||0),
\r
60 wb: this.offsetWidth,
\r
61 hb: this.offsetHeight
\r
63 if (this.s == true) {
\r
64 if (jQuery.selectKeyHelper == false) {
\r
66 jQuery(this).removeClass(jQuery.selectdrug.f.sc);
\r
68 jQuery.selectedone = true;
\r
70 // Save current state
\r
71 jQuery.selectCurrent[jQuery.selectCurrent.length] = jQuery.attr(this,'id');
\r
76 jQuery.selectcheck.apply(this, [e]);
\r
78 .bind('mousemove', jQuery.selectcheck)
\r
79 .bind('mouseup', jQuery.selectstop);
\r
82 jQuery.selectcheck = function(e)
\r
84 if(!jQuery.selectdrug)
\r
86 jQuery.selectcheckApply.apply(jQuery.selectdrug, [e]);
\r
88 jQuery.selectcheckApply = function(e)
\r
90 if(!jQuery.selectdrug)
\r
92 var pointer = jQuery.iUtil.getPointer(e);
\r
94 var scr = jQuery.iUtil.getScroll(jQuery.selectdrug);
\r
95 pointer.x += scr.l - this.f.scr.l - this.f.pos.x;
\r
96 pointer.y += scr.t - this.f.scr.t - this.f.pos.y;
\r
98 var sx = Math.min(pointer.x, this.f.pointer.x);
\r
99 var sw = Math.min(Math.abs(pointer.x - this.f.pointer.x), Math.abs(this.f.scr.w - sx));
\r
100 var sy = Math.min(pointer.y, this.f.pointer.y);
\r
101 var sh = Math.min(Math.abs(pointer.y - this.f.pointer.y), Math.abs(this.f.scr.h - sy));
\r
102 if (this.scrollTop > 0 && pointer.y - 20 < this.scrollTop) {
\r
103 var diff = Math.min(scr.t, 10);
\r
106 this.scrollTop -= diff;
\r
107 } else if (this.scrollTop+ this.f.pos.h < this.f.scr.h && pointer.y + 20 > this.scrollTop + this.f.pos.h) {
\r
108 var diff = Math.min(this.f.scr.h - this.scrollTop, 10);
\r
109 this.scrollTop += diff;
\r
110 if (this.scrollTop != scr.t)
\r
113 if (this.scrollLeft > 0 && pointer.x - 20 < this.scrollLeft) {
\r
114 var diff = Math.min(scr.l, 10);
\r
117 this.scrollLeft -= diff;
\r
118 } else if (this.scrollLeft+ this.f.pos.w < this.f.scr.w && pointer.x + 20 > this.scrollLeft + this.f.pos.w) {
\r
119 var diff = Math.min(this.f.scr.w - this.scrollLeft, 10);
\r
120 this.scrollLeft += diff;
\r
121 if (this.scrollLeft != scr.l)
\r
124 jQuery.selectHelper.css(
\r
132 jQuery.selectHelper.l = sx + this.f.scr.l;
\r
133 jQuery.selectHelper.t = sy + this.f.scr.t;
\r
134 jQuery.selectHelper.r = jQuery.selectHelper.l + sw;
\r
135 jQuery.selectHelper.b = jQuery.selectHelper.t + sh;
\r
136 jQuery.selectedone = false;
\r
139 // Locate the current element in the current selection
\r
140 iIndex = jQuery.selectCurrent.indexOf(jQuery.attr(this, 'id'));
\r
141 // In case we are currently OVER an item
\r
143 ! ( this.pos.x > jQuery.selectHelper.r
\r
144 || (this.pos.x + this.pos.wb) < jQuery.selectHelper.l
\r
145 || this.pos.y > jQuery.selectHelper.b
\r
146 || (this.pos.y + this.pos.hb) < jQuery.selectHelper.t
\r
150 jQuery.selectedone = true;
\r
151 if (this.s != true) {
\r
153 jQuery(this).addClass(jQuery.selectdrug.f.sc);
\r
156 // Check to see if this item was previously selected, if so, unselect it
\r
157 if (iIndex != -1) {
\r
159 jQuery(this).removeClass(jQuery.selectdrug.f.sc);
\r
162 (this.s == true) &&
\r
165 // If the item was marked as selected, but it was not selected when you started dragging unselect it.
\r
167 jQuery(this).removeClass(jQuery.selectdrug.f.sc);
\r
170 (jQuery.selectKeyHelper == true) &&
\r
173 // Reselect the item if:
\r
174 // - we ARE multiselecting,
\r
175 // - dragged over an allready selected object (so it got unselected)
\r
176 // - But then dragged the selection out of it again.
\r
178 jQuery(this).addClass(jQuery.selectdrug.f.sc);
\r
184 jQuery.selectstop = function(e)
\r
186 if(!jQuery.selectdrug)
\r
188 jQuery.selectstopApply.apply(jQuery.selectdrug, [e]);
\r
190 jQuery.selectstopApply = function(e)
\r
193 .unbind('mousemove', jQuery.selectcheck)
\r
194 .unbind('mouseup', jQuery.selectstop);
\r
195 if(!jQuery.selectdrug)
\r
197 jQuery.selectHelper.css('display','none');
\r
199 jQuery.selectHelper.removeClass(this.f.hc);
\r
200 jQuery.selectdrug = false;
\r
201 jQuery('body').append(jQuery.selectHelper.get(0));
\r
203 // In case we have selected some new items..
\r
204 if (jQuery.selectedone == true) {
\r
205 if (this.f.onselect)
\r
206 this.f.onselect(jQuery.Selectserialize(jQuery.attr(this,'id')));
\r
208 if (this.f.onselectstop)
\r
209 this.f.onselectstop(jQuery.Selectserialize(jQuery.attr(this,'id')));
\r
211 // Reset current selection
\r
212 jQuery.selectCurrent = [];
\r
215 jQuery.Selectserialize = function(s)
\r
219 if (a = jQuery('#' + s)) {
\r
220 a.get(0).f.el.each(
\r
223 if (this.s == true) {
\r
224 if (h.length > 0) {
\r
227 h += s + '[]=' + jQuery.attr(this,'id');
\r
228 o[o.length] = jQuery.attr(this,'id');
\r
233 return {hash:h, o:o};
\r
235 jQuery.fn.Selectable = function(o)
\r
237 if (!jQuery.selectHelper) {
\r
238 jQuery('body',document).append('<div id="selectHelper"></div>').bind('keydown', jQuery.selectKeyDown).bind('keyup', jQuery.selectKeyUp);
\r
239 jQuery.selectHelper = jQuery('#selectHelper');
\r
240 jQuery.selectHelper.css(
\r
242 position: 'absolute',
\r
247 if (window.event) {
\r
248 jQuery('body',document).bind('keydown', jQuery.selectKeyDown).bind('keyup', jQuery.selectKeyUp);
\r
250 jQuery(document).bind('keydown', jQuery.selectKeyDown).bind('keyup', jQuery.selectKeyUp);
\r
260 if (this.isSelectable)
\r
262 this.isSelectable = true;
\r
265 o : o.opacity ? parseFloat(o.opacity) : false,
\r
266 sc : o.selectedclass ? o.selectedclass : false,
\r
267 hc : o.helperclass ? o.helperclass : false,
\r
268 onselect : o.onselect ? o.onselect : false,
\r
269 onselectstop : o.onselectstop ? o.onselectstop : false
\r
271 this.f.el = jQuery('.' + o.accept);
\r
272 jQuery(this).bind('mousedown', jQuery.selectstart).css('position', 'relative');
\r