/*
HeapBox 0.9.4
(c) 2013 Filip Bartos
*/
;(function ( $, window, document, undefined ) {
var pluginName = "heapbox",
defaults = {
effect: {
"type": "slide",
"speed": "slow"
},
insert: "before",
heapsize: undefined,
emptyMessage: 'Empty',
tabindex: 'undefined',
title: undefined,
showFirst: true,
inheritVisibility: true,
openStart: function(){},
openComplete: function(){},
closeStart: function(){},
closeComplete: function(){},
onChange: function(){}
};
function Plugin( element, options ) {
/* Settings */
this.element = element;
this.options = $.extend( {}, defaults, options );
this._defaults = defaults;
this._name = pluginName;
this.instance;
this.callbackManager = new Array();
this.elem_isVisible = '';
this.init();
}
Plugin.prototype = {
/*
* Heapbox init
*/
init: function() {
this._hideSourceElement();
this._isSourceSelectbox();
this.instance = this.createInstance();
this._createElements();
this._setDefaultValues();
},
/*
* Generate new ID for selectbox
*/
createInstance: function() {
return {
heapId: $(this.element).attr('id') || Math.round(Math.random() * 99999999),
state: false
};
},
/*
* Set events
*/
_setEvents: function() {
var self = this;
this._setControlsEvents();
$(document).on("click", "html", function(e){ e.stopPropagation();self._closeheap(true,function(){},function(){});});
},
_setSliderEvents: function() {
var self = this;
this.scrollingStatus = false;
heap = $("#heapbox_"+this.instance.heapId+" .heap");
// Slider Down
heap.find(".sliderDown").click(function(e){e.preventDefault();e.stopPropagation();self._setHeapboxFocus();});
heap.find(".sliderDown").mousedown(function(e){
self.scrollingStatus = true;
self._keyArrowHandler($("#heapbox_"+self.instance.heapId),"down");
self.interval = setInterval(function(){self._keyArrowHandler($("#heapbox_"+self.instance.heapId),"down");},300);
}).mouseup(function(e){
clearInterval(self.interval);
self.scrollingStatus = false;
}).mouseout(function(e){
clearInterval(self.interval);
self.scrollingStatus = false;
});
// Slider Up
heap.find(".sliderUp").click(function(e){e.preventDefault();e.stopPropagation();self._setHeapboxFocus();});
heap.find(".sliderUp").mousedown(function(e){
self.scrollingStatus = true;
self._keyArrowHandler($("#heapbox_"+self.instance.heapId),"up");
self.interval = setInterval(function(){self._keyArrowHandler($("#heapbox_"+self.instance.heapId),"up");},300);
}).mouseup(function(e){
clearInterval(self.interval);
self.scrollingStatus = false;
}).mouseout(function(e){
clearInterval(self.interval);
self.scrollingStatus = false;
});
},
_setViewPosition: function(heapbox) {
heap = $("div#heapbox_"+this.instance.heapId+" .heap");
heap.show();
var self = this;
selected = heapbox.find(".heapOptions li a.selected");
firstTop = heapbox.find(".heapOptions li a").first().offset().top;
actTop = $(selected).offset().top;
newTop = firstTop - actTop + this.sliderUpHeight;
heapHeight = $("div#heapbox_"+this.instance.heapId+" .heapOptions").height();
maxPosition = heapHeight-parseInt(this.options.heapsize,10)+this.sliderDownHeight;
minPosition = 0+this.sliderUpHeight;
if((-1*newTop) > maxPosition) newTop = -1*(maxPosition);
heapbox.find(".heapOptions").css("top",newTop);
if(!this.instance.state) heap.hide();
},
_setKeyboardEvents: function() {
var self = this;
heapbox = $("#heapbox_"+this.instance.heapId);
heapbox.keydown(function(e) {
switch(e.which)
{
case 13: self._handlerClicked();
return false;
break;
case 27: self._closeheap();
break;
case 37: self._keyArrowHandler($("#heapbox_"+self.instance.heapId),"up");
e.preventDefault();
break;
case 39: self._keyArrowHandler($("#heapbox_"+self.instance.heapId),"down");
e.preventDefault();
break;
case 38: self._keyArrowHandler($("#heapbox_"+self.instance.heapId),"up");
e.preventDefault();
break;
case 40: self._keyArrowHandler($("#heapbox_"+self.instance.heapId),"down");
e.preventDefault();
break;
}
});
},
/*
* Adds mouse wheel events
* @require jquery-mousewheel
* @see https://github.com/brandonaaron/jquery-mousewheel
*/
_setMouseWheelEvents:function() {
var self = this,
heapBoxEl = $("div#heapbox_"+this.instance.heapId+" .handler"),
heap = heapBoxEl.find('div.heap');
heapBoxEl.on('mousewheel',function(event,delta){
event.preventDefault();
if ( delta == -1 ) {
heap.find(".sliderDown")
.mousedown()
.mouseup();
} else {
heap.find(".sliderUp")
.mousedown()
.mouseup();
}
});
},
_keyArrowHandler:function(heapboxEl,direction){
var self = this;
var selected = false;
heapboxEl.find("div.heap ul li").each(function(){
if(($(this).find("a").hasClass("selected")))
{
selected = true;
selectItem = direction == "down" ? self._findNext($(this)):self._findPrev($(this));
if(selectItem) {
self._heapChanged(self,selectItem,true);
return false;
}
}
});
if(selected == false) {
selectItem = $("div#heapbox_"+self.instance.heapId+" .heapOptions .heapOption").first().find("a").addClass("selected");
self._heapChanged(self,selectItem,true);
}
self._setViewPosition($("#heapbox_"+self.instance.heapId));
},
/*
* Adds mouse wheel events
* @require jquery-mousewheel
* @see https://github.com/brandonaaron/jquery-mousewheel
*/
_setMouseWheelEvents: function() {
var self = this,
heapBoxEl = $("div#heapbox_"+this.instance.heapId),
heap = heapBoxEl.find('div.heap');
heapBoxEl.on('mousewheel',function(event,delta){
event.preventDefault();
if ( delta == -1 ) {
heap.find(".sliderDown")
.mousedown()
.mouseup();
} else {
heap.find(".sliderUp")
.mousedown()
.mouseup();
}
});
},
/*
* Find prev selectable heapbox option (ignore disabled)
*/
_findPrev:function(startItem){
if(startItem.prev().length > 0){
if(!startItem.prev().find("a").hasClass("disabled")) {
return startItem.prev().find("a");
}else{
return this._findPrev(startItem.prev());
}
}
},
/*
* Find next selectable heapbox option (ignore disabled)
*/
_findNext:function(startItem){
if(startItem.next().length > 0){
if(!startItem.next().find("a").hasClass("disabled")) {
return startItem.next().find("a");
}else{
return this._findNext(startItem.next());
}
}
},
/*
* Create heapbox html structure
*/
_createElements: function() {
var self = this;
heapBoxEl = $('
', {
id: 'heapbox_'+this.instance.heapId,
'class': 'heapBox',
data: {'sourceElement':this.element}
});
// Set visibility according to original