/**
* Interface Elements for jQuery
* Selectables
*
* http://interface.eyecon.ro
*
* Copyright (c) 2006 Stefan Petre
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
*
*/
jQuery.selectHelper = null;
jQuery.selectKeyHelper = false;
jQuery.selectdrug = null;
jQuery.selectCurrent = []; // For current selection
jQuery.selectKeyDown = function(e) {
var pressedKey = e.charCode || e.keyCode || -1;
if (pressedKey == 17 || pressedKey == 16) {
jQuery.selectKeyHelper = true;
}
};
jQuery.selectKeyUp = function(e) {
jQuery.selectKeyHelper = false;
};
jQuery.selectstart = function(e) {
this.f.pointer = jQuery.iUtil.getPointer(e);
this.f.pos = jQuery.extend(
jQuery.iUtil.getPosition(this),
jQuery.iUtil.getSize(this)
);
this.f.scr = jQuery.iUtil.getScroll(this);
this.f.pointer.x -= this.f.pos.x;
this.f.pointer.y -= this.f.pos.y;
jQuery(this).append(jQuery.selectHelper.get(0));
if (this.f.hc)
jQuery.selectHelper.addClass(this.f.hc).css('display','block');
jQuery.selectHelper.css(
{
display: 'block',
width: '0px',
height: '0px'
}
);
if (this.f.o) {
jQuery.selectHelper.css('opacity', this.f.o);
}
jQuery.selectdrug = this;
jQuery.selectedone = false;
jQuery.selectCurrent = []; // For current selection state
this.f.el.each(
function ()
{
this.pos = {
x: this.offsetLeft + (this.currentStyle && !jQuery.browser.opera ?parseInt(this.currentStyle.borderLeftWidth)||0:0) + (jQuery.selectdrug.scrollLeft||0),
y: this.offsetTop + (this.currentStyle && !jQuery.browser.opera ?parseInt(this.currentStyle.borderTopWidth)||0:0) + (jQuery.selectdrug.scrollTop||0),
wb: this.offsetWidth,
hb: this.offsetHeight
};
if (this.s == true) {
if (jQuery.selectKeyHelper == false) {
this.s = false;
jQuery(this).removeClass(jQuery.selectdrug.f.sc);
} else {
jQuery.selectedone = true;
// Save current state
jQuery.selectCurrent[jQuery.selectCurrent.length] = jQuery.attr(this,'id');
}
}
}
);
jQuery.selectcheck.apply(this, [e]);
jQuery(document)
.bind('mousemove', jQuery.selectcheck)
.bind('mouseup', jQuery.selectstop);
return false;
};
jQuery.selectcheck = function(e)
{
if(!jQuery.selectdrug)
return;
jQuery.selectcheckApply.apply(jQuery.selectdrug, [e]);
};
jQuery.selectcheckApply = function(e)
{
if(!jQuery.selectdrug)
return;
var pointer = jQuery.iUtil.getPointer(e);
var scr = jQuery.iUtil.getScroll(jQuery.selectdrug);
pointer.x += scr.l - this.f.scr.l - this.f.pos.x;
pointer.y += scr.t - this.f.scr.t - this.f.pos.y;
var sx = Math.min(pointer.x, this.f.pointer.x);
var sw = Math.min(Math.abs(pointer.x - this.f.pointer.x), Math.abs(this.f.scr.w - sx));
var sy = Math.min(pointer.y, this.f.pointer.y);
var sh = Math.min(Math.abs(pointer.y - this.f.pointer.y), Math.abs(this.f.scr.h - sy));
if (this.scrollTop > 0 && pointer.y - 20 < this.scrollTop) {
var diff = Math.min(scr.t, 10);
sy -= diff;
sh += diff;
this.scrollTop -= diff;
} else if (this.scrollTop+ this.f.pos.h < this.f.scr.h && pointer.y + 20 > this.scrollTop + this.f.pos.h) {
var diff = Math.min(this.f.scr.h - this.scrollTop, 10);
this.scrollTop += diff;
if (this.scrollTop != scr.t)
sh += diff;
}
if (this.scrollLeft > 0 && pointer.x - 20 < this.scrollLeft) {
var diff = Math.min(scr.l, 10);
sx -= diff;
sw += diff;
this.scrollLeft -= diff;
} else if (this.scrollLeft+ this.f.pos.w < this.f.scr.w && pointer.x + 20 > this.scrollLeft + this.f.pos.w) {
var diff = Math.min(this.f.scr.w - this.scrollLeft, 10);
this.scrollLeft += diff;
if (this.scrollLeft != scr.l)
sw += diff;
}
jQuery.selectHelper.css(
{
left: sx + 'px',
top: sy + 'px',
width: sw + 'px',
height: sh + 'px'
}
);
jQuery.selectHelper.l = sx + this.f.scr.l;
jQuery.selectHelper.t = sy + this.f.scr.t;
jQuery.selectHelper.r = jQuery.selectHelper.l + sw;
jQuery.selectHelper.b = jQuery.selectHelper.t + sh;
jQuery.selectedone = false;
this.f.el.each(
function () {
// Locate the current element in the current selection
iIndex = jQuery.selectCurrent.indexOf(jQuery.attr(this, 'id'));
// In case we are currently OVER an item
if (
! ( this.pos.x > jQuery.selectHelper.r
|| (this.pos.x + this.pos.wb) < jQuery.selectHelper.l
|| this.pos.y > jQuery.selectHelper.b
|| (this.pos.y + this.pos.hb) < jQuery.selectHelper.t
)
)
{
jQuery.selectedone = true;
if (this.s != true) {
this.s = true;
jQuery(this).addClass(jQuery.selectdrug.f.sc);
}
// Check to see if this item was previously selected, if so, unselect it
if (iIndex != -1) {
this.s = false;
jQuery(this).removeClass(jQuery.selectdrug.f.sc);
}
} else if (
(this.s == true) &&
(iIndex == -1)
) {
// If the item was marked as selected, but it was not selected when you started dragging unselect it.
this.s = false;
jQuery(this).removeClass(jQuery.selectdrug.f.sc);
} else if (
(!this.s) &&
(jQuery.selectKeyHelper == true) &&
(iIndex != -1)
) {
// Reselect the item if:
// - we ARE multiselecting,
// - dragged over an allready selected object (so it got unselected)
// - But then dragged the selection out of it again.
this.s = true;
jQuery(this).addClass(jQuery.selectdrug.f.sc);
}
}
);
return false;
};
jQuery.selectstop = function(e)
{
if(!jQuery.selectdrug)
return;
jQuery.selectstopApply.apply(jQuery.selectdrug, [e]);
};
jQuery.selectstopApply = function(e)
{
jQuery(document)
.unbind('mousemove', jQuery.selectcheck)
.unbind('mouseup', jQuery.selectstop);
if(!jQuery.selectdrug)
return;
jQuery.selectHelper.css('display','none');
if (this.f.hc)
jQuery.selectHelper.removeClass(this.f.hc);
jQuery.selectdrug = false;
jQuery('body').append(jQuery.selectHelper.get(0));
//
// In case we have selected some new items..
if (jQuery.selectedone == true) {
if (this.f.onselect)
this.f.onselect(jQuery.Selectserialize(jQuery.attr(this,'id')));
} else {
if (this.f.onselectstop)
this.f.onselectstop(jQuery.Selectserialize(jQuery.attr(this,'id')));
}
// Reset current selection
jQuery.selectCurrent = [];
};
jQuery.Selectserialize = function(s)
{
var h = '';
var o = [];
if (a = jQuery('#' + s)) {
a.get(0).f.el.each(
function ()
{
if (this.s == true) {
if (h.length > 0) {
h += '&';
}
h += s + '[]=' + jQuery.attr(this,'id');
o[o.length] = jQuery.attr(this,'id');
}
}
);
}
return {hash:h, o:o};
};
jQuery.fn.Selectable = function(o)
{
if (!jQuery.selectHelper) {
jQuery('body',document).append('<div id="selectHelper"></div>').bind('keydown', jQuery.selectKeyDown).bind('keyup', jQuery.selectKeyUp);
jQuery.selectHelper = jQuery('#selectHelper');
jQuery.selectHelper.css(
{
position: 'absolute',
display: 'none'
}
);
if (window.event) {
jQuery('body',document).bind('keydown', jQuery.selectKeyDown).bind('keyup', jQuery.selectKeyUp);
} else {
jQuery(document).bind('keydown', jQuery.selectKeyDown).bind('keyup', jQuery.selectKeyUp);
}
}
if (!o) {
o = {};
}
return this.each(
function()
{
if (this.isSelectable)
return;
this.isSelectable = true;
this.f = {
a : o.accept,
o : o.opacity ? parseFloat(o.opacity) : false,
sc : o.selectedclass ? o.selectedclass : false,
hc : o.helperclass ? o.helperclass : false,
onselect : o.onselect ? o.onselect : false,
onselectstop : o.onselectstop ? o.onselectstop : false
};
this.f.el = jQuery('.' + o.accept);
jQuery(this).bind('mousedown', jQuery.selectstart).css('position', 'relative');
}
);
};