Posted at 2015-10-15 13:35:49 — Link
Without fail each time I go to crafting the page lags for a few moments, stops repsonding, then a popup opens giving me options to deal with a script. Different most the times but sometimes the same. Below are some I copy and pasted while switching between crafting tabs.
Script: http://beastkeeper.com/resources/script/jquery.js:7066
Script: http://beastkeeper.com/resources/script/jquery.dd.js?v=3.5.2:255
Script: http://beastkeeper.com/resources/script/jquery.js:3988
Script: http://beastkeeper.com/resources/script/jquery.js:473
Script: http://beastkeeper.com/resources/script/jquery.js:6947
Script: http://beastkeeper.com/resources/script/jquery-migrate.js:2
And on every page of crafting, like when switching from all tab to items.
This also happens on my phone, but since there are no options to deal with the script the page acts crazy until I go to the page of the actual scheme.
This has been happening for a long while now, atleast a week (maybe two) when I started using my schemes again. Each time I choose to stop the script, and that works until I refresh or change tabs/pages.
It happens in http://beastkeeper.com/crafting, http://beastkeeper.com/recipe-list-items, and http://beastkeeper.com/recipe-list-golems. It did not happen in the buildings, and I do not have any schemes/blueprints there. Maybe there is a connection.
Just a few moments ago it causes my screen to go black for a few moments. The lag and now this is keeping me from wanting to access my crafting.
When I click to debug the script, I get this... (SUPER long. The orange, yellow, and blue text did not get copy and pasted. I have no idea what all the text means, but maybe it will help.)
I used debug on the script Script: http://beastkeeper.com/resources/script/jquery.dd.js?v=3.5.2:732
// MSDropDown - jquery.dd.js
// author: Marghoob Suleman - http://www.marghoobsuleman.com/
// Date: 10 Nov, 2012
// Version: 3.5.2
// Revision: 27
// web: www.marghoobsuleman.com
/*
// msDropDown is free jQuery Plugin: you can redistribute it and/or modify
// it under the terms of the either the MIT License or the Gnu General Public License (GPL) Version 2
*/
var msBeautify = msBeautify || {};
(function ($) {
msBeautify = {
version: {msDropdown:'3.5.2'},
author: "Marghoob Suleman",
counter: 20,
debug: function (v) {
if (v !== false) {
$(".ddOutOfVision").css({height: 'auto', position: 'relative'});
} else {
$(".ddOutOfVision").css({height: '0px', position: 'absolute'});
}
},
oldDiv: '',
create: function (id, settings, type) {
type = type || "dropdown";
var data;
switch (type.toLowerCase()) {
case "dropdown":
case "select":
data = $(id).msDropdown(settings).data("dd");
break;
}
return data;
}
};
$.msDropDown = {}; //Legacy
$.msDropdown = {}; //camelCaps
$.extend(true, $.msDropDown, msBeautify);
$.extend(true, $.msDropdown, msBeautify);
// make compatibiliy with old and new jquery
if ($.fn.prop === undefined) {$.fn.prop = $.fn.attr;}
if ($.fn.on === undefined) {$.fn.on = $.fn.bind;$.fn.off = $.fn.unbind;}
if (typeof $.expr.createPseudo === 'function') {
//jQuery 1.8 or greater
$.expr[':'].Contains = $.expr.createPseudo(function (arg) {return function (elem) { return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; }; });
} else {
//lower version
$.expr[':'].Contains = function (a, i, m) {return $(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0; };
}
//dropdown class
function dd(element, settings) {
var settings = $.extend(true,
{byJson: {data: null, selectedIndex: 0, name: null, size: 0, multiple: false, width: 250},
mainCSS: 'dd',
height: 120, //not using currently
visibleRows: 7,
rowHeight: 0,
showIcon: true,
zIndex: 9999,
useSprite: false,
animStyle: 'slideDown',
event:'click',
openDirection: 'auto', //auto || alwaysUp || alwaysDown
jsonTitle: true,
style: '',
disabledOpacity: 0.7,
disabledOptionEvents: true,
childWidth:0,
enableCheckbox:false, //this needs to multiple or it will set element to multiple
checkboxNameSuffix:'_mscheck',
append:'',
prepend:'',
reverseMode:true, //it will update the msdropdown UI/value if you update the original dropdown - will be usefull if are using knockout.js or playing with original dropdown
roundedCorner:true,
enableAutoFilter:true,
on: {create: null,open: null,close: null,add: null,remove: null,change: null,blur: null,click: null,dblclick: null,mousemove: null,mouseover: null,mouseout: null,focus: null,mousedown: null,mouseup: null}
}, settings);
var $this = this; //this class
var holderId = {postElementHolder: '_msddHolder', postID: '_msdd', postTitleID: '_title',postTitleTextID: '_titleText', postChildID: '_child'};
var css = {dd:settings.mainCSS, ddTitle: 'ddTitle', arrow: 'ddArrow arrowoff', ddChild: 'ddChild', ddTitleText: 'ddTitleText',disabled: 'disabled', enabled: 'enabled', ddOutOfVision: 'ddOutOfVision', borderTop: 'borderTop', noBorderTop: 'noBorderTop', selected: 'selected', divider: 'divider', optgroup: "optgroup", optgroupTitle: "optgroupTitle", description: "description", label: "ddlabel",hover: 'hover',disabledAll: 'disabledAll'};
var css_i = {li: '_msddli_',borderRadiusTp: 'borderRadiusTp',ddChildMore: 'border shadow',fnone: "fnone"};
var isList = false, isMultiple=false,isDisabled=false, cacheElement = {}, element, orginial = {}, isOpen=false;
var DOWN_ARROW = 40, UP_ARROW = 38, LEFT_ARROW=37, RIGHT_ARROW=39, ESCAPE = 27, ENTER = 13, ALPHABETS_START = 47, SHIFT=16, CONTROL = 17, BACKSPACE=8, DELETE=46;
var shiftHolded=false, controlHolded=false,lastTarget=null,forcedTrigger=false, oldSelected, isCreated = false;
var doc = document, ua = window.navigator.userAgent, isIE = ua.match(/msie/i);
settings.reverseMode = settings.reverseMode.toString();
settings.roundedCorner = settings.roundedCorner.toString();
var isArray = function(obj) {
return (Object.prototype.toString.call(obj)=="[object Array]") ? true : false;
};
var msieversion = function()
{
var msie = ua.indexOf("MSIE");
if ( msie > 0 ) { // If Internet Explorer, return version number
return parseInt (ua.substring (msie+5, ua.indexOf (".", msie)));
} else { // If another browser, return 0
return 0;
};
};
var checkDataSetting = function() {
settings.mainCSS = $("#"+element).data("maincss") || settings.mainCSS;
settings.visibleRows = $("#"+element).data("visiblerows") || settings.visibleRows;
if($("#"+element).data("showicon")==false) {settings.showIcon = $("#"+element).data("showicon");};
settings.useSprite = $("#"+element).data("usesprite") || settings.useSprite;
settings.animStyle = $("#"+element).data("animstyle") || settings.animStyle;
settings.event = $("#"+element).data("event") || settings.event;
settings.openDirection = $("#"+element).data("opendirection") || settings.openDirection;
settings.jsonTitle = $("#"+element).data("jsontitle") || settings.jsonTitle;
settings.disabledOpacity = $("#"+element).data("disabledopacity") || settings.disabledOpacity;
settings.childWidth = $("#"+element).data("childwidth") || settings.childWidth;
settings.enableCheckbox = $("#"+element).data("enablecheckbox") || settings.enableCheckbox;
settings.checkboxNameSuffix = $("#"+element).data("checkboxnamesuffix") || settings.checkboxNameSuffix;
settings.append = $("#"+element).data("append") || settings.append;
settings.prepend = $("#"+element).data("prepend") || settings.prepend;
settings.reverseMode = $("#"+element).data("reversemode") || settings.reverseMode;
settings.roundedCorner = $("#"+element).data("roundedcorner") || settings.roundedCorner;
settings.enableAutoFilter = $("#"+element).data("enableautofilter") || settings.enableAutoFilter;
//make string
settings.reverseMode = settings.reverseMode.toString();
settings.roundedCorner = settings.roundedCorner.toString();
settings.enableAutoFilter = settings.enableAutoFilter.toString();
};
var getElement = function(ele) {
if (cacheElement[ele] === undefined) {
cacheElement[ele] = doc.getElementById(ele);
}
return cacheElement[ele];
};
var getIndex = function(opt) {
var childid = getPostID("postChildID");
return $("#"+childid + " li."+css_i.li).index(opt);
};
var createByJson = function() {
if (settings.byJson.data) {
var validData = ["description","image","title"];
try {
if (!element.id) {
element.id = "dropdown"+msBeautify.counter;
};
settings.byJson.data = eval(settings.byJson.data);
//change element
var id = "msdropdown"+(msBeautify.counter++);
var obj = {};
obj.id = id;
obj.name = settings.byJson.name || element.id; //its name
if (settings.byJson.size>0) {
obj.size = settings.byJson.size;
};
obj.multiple = settings.byJson.multiple;
var oSelect = createElement("select", obj);
for(var i=0;i<settings.byJson.data.length;i++) {
var current = settings.byJson.data[i];
var opt = new Option(current.text, current.value);
for(var p in current) {
if (p.toLowerCase() != 'text') {
var key = ($.inArray(p.toLowerCase(), validData)!=-1) ? "data-" : "";
opt.setAttribute(key+p, current[p]);
};
};
oSelect.options[i] = opt;
};
getElement(element.id).appendChild(oSelect);
oSelect.selectedIndex = settings.byJson.selectedIndex;
$(oSelect).css({width: settings.byJson.width+'px'});
//now change element for access other things
element = oSelect;
} catch(e) {
throw "There is an error in json data.";
};
};
};
var init = function() {
//set properties
createByJson();
if (!element.id) {
element.id = "msdrpdd"+(msBeautify.counter++);
};
element = element.id;
$this.element = element;
checkDataSetting();
isDisabled = getElement(element).disabled;
var useCheckbox = settings.enableCheckbox;
if(useCheckbox.toString()==="true") {
getElement(element).multiple = true;
settings.enableCheckbox = true;
};
isList = (getElement(element).size>1 || getElement(element).multiple==true) ? true : false;
//trace("isList "+isList);
if (isList) {isMultiple = getElement(element).multiple;};
mergeAllProp();
//create layout
createLayout();
//set ui prop
updateProp("uiData", getDataAndUI());
updateProp("selectedOptions", $("#"+element +" option:selected"));
var childid = getPostID("postChildID");
oldSelected = $("#" + childid + " li." + css.selected);
if(settings.reverseMode==="true") {
$("#"+element).on("change", function() {
setValue(this.selectedIndex);
});
};
//add refresh method
getElement(element).refresh = function(e) {
$("#"+element).msDropdown().data("dd").refresh();
};
};
/********************************************************************************************/
var getPostID = function (id) {
return element+holderId[id];
};
var getInternalStyle = function(ele) {
var s = (ele.style === undefined) ? "" : ele.style.cssText;
return s;
};
var parseOption = function(opt) {
var imagePath = '', title ='', description='', value=-1, text='', className='', imagecss = '', index;
if (opt !== undefined) {
var attrTitle = opt.title || "";
//data-title
if (attrTitle!="") {
var reg = /^\{.*\}$/;
var isJson = reg.test(attrTitle);
if (isJson && settings.jsonTitle) {
var obj = eval("["+attrTitle+"]");
};
title = (isJson && settings.jsonTitle) ? obj[0].title : title;
description = (isJson && settings.jsonTitle) ? obj[0].description : description;
imagePath = (isJson && settings.jsonTitle) ? obj[0].image : attrTitle;
imagecss = (isJson && settings.jsonTitle) ? obj[0].imagecss : imagecss;
index = opt.index;
};
text = opt.text || '';
value = opt.value || '';
className = opt.className || "";
//ignore title attribute if playing with data tags
title = $(opt).prop("data-title") || $(opt).data("title") || (title || "");
description = $(opt).prop("data-description") || $(opt).data("description") || (description || "");
imagePath = $(opt).prop("data-image") || $(opt).data("image") || (imagePath || "");
imagecss = $(opt).prop("data-imagecss") || $(opt).data("imagecss") || (imagecss || "");
index = $(opt).index();
};
var o = {image: imagePath, title: title, description: description, value: value, text: text, className: className, imagecss:imagecss, index:index};
return o;
};
var createElement = function(nm, attr, html) {
var tag = doc.createElement(nm);
if (attr) {
for(var i in attr) {
switch(i) {
case "style":
tag.style.cssText = attr[i];
break;
default:
tag[i] = attr[i];
break;
};
};
};
if (html) {
tag.innerHTML = html;
};
return tag;
};
/********************************************************************************************/
/*********************** <layout> *************************************/
var hideOriginal = function() {
var hidid = getPostID("postElementHolder");
if ($("#"+hidid).length==0) {
var obj = {style: 'height: 0px;overflow: hidden;position: absolute;',className: css.ddOutOfVision};
obj.id = hidid;
var oDiv = createElement("div", obj);
$("#"+element).after(oDiv);
$("#"+element).appendTo($("#"+hidid));
} else {
$("#"+hidid).css({height: 0,overflow: 'hidden',position: 'absolute'});
};
getElement(element).tabIndex = -1;
};
var createWrapper = function () {
var brdRds = (settings.roundedCorner == "true") ? " borderRadius" : "";
var obj = {
className: css.dd + " ddcommon"+brdRds
};
var intcss = getInternalStyle(getElement(element));
var w = $("#" + element).outerWidth();
obj.style = "width: " + w + "px;";
if (intcss.length > 0) {
obj.style = obj.style + "" + intcss;
};
obj.id = getPostID("postID");
obj.tabIndex = getElement(element).tabIndex;
var oDiv = createElement("div", obj);
return oDiv;
};
var createTitle = function () {
var selectedOption;
if(getElement(element).selectedIndex>=0) {
selectedOption = getElement(element).options[getElement(element).selectedIndex];
} else {
selectedOption = {value:'', text:''};
}
var spriteClass = "", selectedClass = "";
//check sprite
var useSprite = $("#"+element).data("usesprite");
if(useSprite) { settings.useSprite = useSprite; };
if (settings.useSprite != false) {
spriteClass = " " + settings.useSprite;
selectedClass = " " + selectedOption.className;
};
var brdRdsTp = (settings.roundedCorner == "true") ? " "+css_i.borderRadiusTp : "" ;
var oTitle = createElement("div", {className: css.ddTitle + spriteClass + brdRdsTp});
//divider
var oDivider = createElement("span", {className: css.divider});
//arrow
var oArrow = createElement("span", {className: css.arrow});
//title Text
var titleid = getPostID("postTitleID");
var oTitleText = createElement("span", {className: css.ddTitleText + selectedClass, id: titleid});
var parsed = parseOption(selectedOption);
var arrowPath = parsed.image;
var sText = parsed.text || "";
if (arrowPath != "" && settings.showIcon) {
var oIcon = createElement("img");
oIcon.src = arrowPath;
if(parsed.imagecss!="") {
oIcon.className = parsed.imagecss+" ";
};
};
var oTitleText_in = createElement("span", {className: css.label}, sText);
oTitle.appendChild(oDivider);
oTitle.appendChild(oArrow);
if (oIcon) {
oTitleText.appendChild(oIcon);
};
oTitleText.appendChild(oTitleText_in);
oTitle.appendChild(oTitleText);
var oDescription = createElement("span", {className: css.description}, parsed.description);
oTitleText.appendChild(oDescription);
return oTitle;
};
var createFilterBox = function () {
var tid = getPostID("postTitleTextID");
var brdRds = (settings.roundedCorner == "true") ? "borderRadius" : "";
var sText = createElement("input", {id: tid, type: 'text', value: '', autocomplete: 'off', className: 'text shadow '+brdRds, style: 'display: none'});
return sText;
};
var createChild = function (opt) {
var obj = {};
var intcss = getInternalStyle(opt);
if (intcss.length > 0) {obj.style = intcss; };
var css2 = (opt.disabled) ? css.disabled : css.enabled;
css2 = (opt.selected) ? (css2 + " " + css.selected) : css2;
css2 = css2 + " " + css_i.li;
obj.className = css2;
if (settings.useSprite != false) {
obj.className = css2 + " " + opt.className;
};
var li = createElement("li", obj);
var parsed = parseOption(opt);
if (parsed.title != "") {
li.title = parsed.title;
};
var arrowPath = parsed.image;
if (arrowPath != "" && settings.showIcon) {
var oIcon = createElement("img");
oIcon.src = arrowPath;
if(parsed.imagecss!="") {
oIcon.className = parsed.imagecss+" ";
};
};
if (parsed.description != "") {
var oDescription = createElement("span", {
className: css.description
}, parsed.description);
};
var sText = opt.text || "";
var oTitleText = createElement("span", {
className: css.label
}, sText);
//checkbox
if(settings.enableCheckbox===true) {
var chkbox = createElement("input", {
type: 'checkbox', name:element+settings.checkboxNameSuffix+'[]', value:opt.value||"", className:"checkbox"}); //this can be used for future
li.appendChild(chkbox);
if(settings.enableCheckbox===true) {
chkbox.checked = (opt.selected) ? true : false;
};
};
if (oIcon) {
li.appendChild(oIcon);
};
li.appendChild(oTitleText);
if (oDescription) {
li.appendChild(oDescription);
} else {
if (oIcon) {
oIcon.className = oIcon.className+css_i.fnone;
};
};
var oClear = createElement("div", {className: 'clear'});
li.appendChild(oClear);
return li;
};
var createChildren = function () {
var childid = getPostID("postChildID");
var obj = {className: css.ddChild + " ddchild_ " + css_i.ddChildMore, id: childid};
if (isList == false) {
obj.style = "z-index: " + settings.zIndex;
} else {
obj.style = "z-index:1";
};
var childWidth = $("#"+element).data("childwidth") || settings.childWidth;
if(childWidth) {
obj.style = (obj.style || "") + ";width:"+childWidth;
};
var oDiv = createElement("div", obj);
var ul = createElement("ul");
if (settings.useSprite != false) {
ul.className = settings.useSprite;
};
var allOptions = getElement(element).children;
for (var i = 0; i < allOptions.length; i++) {
var current = allOptions[i];
var li;
if (current.nodeName.toLowerCase() == "optgroup") {
//create ul
li = createElement("li", {className: css.optgroup});
var span = createElement("span", {className: css.optgroupTitle}, current.label);
li.appendChild(span);
var optChildren = current.children;
var optul = createElement("ul");
for (var j = 0; j < optChildren.length; j++) {
var opt_li = createChild(optChildren[j]);
optul.appendChild(opt_li);
};
li.appendChild(optul);
} else {
li = createChild(current);
};
ul.appendChild(li);
};
oDiv.appendChild(ul);
return oDiv;
};
var childHeight = function (val) {
var childid = getPostID("postChildID");
if (val) {
if (val == -1) { //auto
$("#"+childid).css({height: "auto", overflow: "auto"});
} else {
$("#"+childid).css("height", val+"px");
};
return false;
};
//else return height
var iHeight;
var totalOptions = getElement(element).options.length;
if (totalOptions > settings.visibleRows || settings.visibleRows) {
var firstLI = $("#" + childid + " li:first");
var margin = parseInt(firstLI.css("padding-bottom")) + parseInt(firstLI.css("padding-top"));
if(settings.rowHeight===0) {
$("#" + childid).css({visibility:'hidden',display:'block'}); //hack for first child
settings.rowHeight = Math.ceil(firstLI.height());
$("#" + childid).css({visibility:'visible'});
if(!isList || settings.enableCheckbox===true) {
$("#" + childid).css({display:'none'});
};
};
iHeight = ((settings.rowHeight + margin) * Math.min(settings.visibleRows,totalOptions)) + 3;
} else if (isList) {
iHeight = $("#" + element).height(); //get height from original element
};
return iHeight;
};
var applyChildEvents = function () {
var childid = getPostID("postChildID");
$("#" + childid).on("click", function (e) {
if (isDisabled === true) return false;
//prevent body click
e.preventDefault();
e.stopPropagation();
if (isList) {
bind_on_events();
};
});
$("#" + childid + " li." + css.enabled).on("click", function (e) {
if(e.target.nodeName.toLowerCase() !== "input") {
close(this);
};
});
$("#" + childid + " li." + css.enabled).on("mousedown", function (e) {
if (isDisabled === true) return false;
oldSelected = $("#" + childid + " li." + css.selected);
lastTarget = this;
e.preventDefault();
e.stopPropagation();
//select current input
if(settings.enableCheckbox===true) {
if(e.target.nodeName.toLowerCase() === "input") {
controlHolded = true;
};
};
if (isList === true) {
if (isMultiple) {
if (shiftHolded === true) {
$(this).addClass(css.selected);
var selected = $("#" + childid + " li." + css.selected);
var lastIndex = getIndex(this);
if (selected.length > 1) {
var items = $("#" + childid + " li." + css_i.li);
var ind1 = getIndex(selected[0]);
var ind2 = getIndex(selected[1]);
if (lastIndex > ind2) {
ind1 = (lastIndex);
ind2 = ind2 + 1;
};
for (var i = Math.min(ind1, ind2); i <= Math.max(ind1, ind2); i++) {
var current = items[i];
if ($(current).hasClass(css.enabled)) {
$(current).addClass(css.selected);
};
};
};
} else if (controlHolded === true) {
$(this).toggleClass(css.selected); //toggle
if(settings.enableCheckbox===true) {
var checkbox = this.childNodes[0];
checkbox.checked = !checkbox.checked; //toggle
};
} else {
$("#" + childid + " li." + css.selected).removeClass(css.selected);
$("#" + childid + " input:checkbox").prop("checked", false);
$(this).addClass(css.selected);
if(settings.enableCheckbox===true) {
this.childNodes[0].checked = true;
};
};
} else {
$("#" + childid + " li." + css.selected).removeClass(css.selected);
$(this).addClass(css.selected);
};
//fire event on mouseup
} else {
$("#" + childid + " li." + css.selected).removeClass(css.selected);
$(this).addClass(css.selected);
};
});
$("#" + childid + " li." + css.enabled).on("mouseenter", function (e) {
if (isDisabled === true) return false;
e.preventDefault();
e.stopPropagation();
if (lastTarget != null) {
if (isMultiple) {
$(this).addClass(css.selected);
if(settings.enableCheckbox===true) {
this.childNodes[0].checked = true;
};
};
};
});
$("#" + childid + " li." + css.enabled).on("mouseover", function (e) {
if (isDisabled === true) return false;
$(this).addClass(css.hover);
});
$("#" + childid + " li." + css.enabled).on("mouseout", function (e) {
if (isDisabled === true) return false;
$("#" + childid + " li." + css.hover).removeClass(css.hover);
});
$("#" + childid + " li." + css.enabled).on("mouseup", function (e) {
if (isDisabled === true) return false;
e.preventDefault();
e.stopPropagation();
if(settings.enableCheckbox===true) {
controlHolded = false;
};
var selected = $("#" + childid + " li." + css.selected).length;
forcedTrigger = (oldSelected.length != selected || selected == 0) ? true : false;
fireAfterItemClicked();
unbind_on_events(); //remove old one
bind_on_events();
lastTarget = null;
});
/* options events */
if (settings.disabledOptionEvents == false) {
$("#" + childid + " li." + css_i.li).on("click", function (e) {
if (isDisabled === true) return false;
fireOptionEventIfExist(this, "click");
});
$("#" + childid + " li." + css_i.li).on("mouseenter", function (e) {
if (isDisabled === true) return false;
fireOptionEventIfExist(this, "mouseenter");
});
$("#" + childid + " li." + css_i.li).on("mouseover", function (e) {
if (isDisabled === true) return false;
fireOptionEventIfExist(this, "mouseover");
});
$("#" + childid + " li." + css_i.li).on("mouseout", function (e) {
if (isDisabled === true) return false;
fireOptionEventIfExist(this, "mouseout");
});
$("#" + childid + " li." + css_i.li).on("mousedown", function (e) {
if (isDisabled === true) return false;
fireOptionEventIfExist(this, "mousedown");
});
$("#" + childid + " li." + css_i.li).on("mouseup", function (e) {
if (isDisabled === true) return false;
fireOptionEventIfExist(this, "mouseup");
});
};
};
var removeChildEvents = function () {
var childid = getPostID("postChildID");
$("#" + childid).off("click");
$("#" + childid + " li." + css.enabled).off("mouseenter");
$("#" + childid + " li." + css.enabled).off("click");
$("#" + childid + " li." + css.enabled).off("mouseover");
$("#" + childid + " li." + css.enabled).off("mouseout");
$("#" + childid + " li." + css.enabled).off("mousedown");
$("#" + childid + " li." + css.enabled).off("mouseup");
};
var triggerBypassingHandler = function (id, evt_n, handler) {
$("#" + id).off(evt_n, handler);
$("#" + id).trigger(evt_n);
$("#" + id).on(evt_n, handler);
};
var applyEvents = function () {
var id = getPostID("postID");
var tid = getPostID("postTitleTextID");
var childid = getPostID("postChildID");
$("#" + id).on(settings.event, function (e) {
if (isDisabled === true) return false;
fireEventIfExist(settings.event);
//prevent body click
e.preventDefault();
e.stopPropagation();
open(e);
});
$("#" + id).on("keydown", function (e) {
var k = e.which;
if (!isOpen && (k == ENTER || k == UP_ARROW || k == DOWN_ARROW ||
k == LEFT_ARROW || k == RIGHT_ARROW ||
(k >= ALPHABETS_START && !isList))) {
open(e);
if (k >= ALPHABETS_START) {
showFilterBox();
} else {
e.preventDefault();
e.stopImmediatePropagation();
};
};
});
$("#" + id).on("focus", wrapperFocusHandler);
$("#" + id).on("blur", wrapperBlurHandler);
$("#" + tid).on("blur", function (e) {
//return focus to the wrapper without triggering the handler
triggerBypassingHandler(id, "focus", wrapperFocusHandler);
});
applyChildEvents();
$("#" + id).on("dblclick", on_dblclick);
$("#" + id).on("mousemove", on_mousemove);
$("#" + id).on("mouseenter", on_mouseover);
$("#" + id).on("mouseleave", on_mouseout);
$("#" + id).on("mousedown", on_mousedown);
$("#" + id).on("mouseup", on_mouseup);
};
var wrapperFocusHandler = function (e) {
fireEventIfExist("focus");
};
var wrapperBlurHandler = function (e) {
fireEventIfExist("blur");
};
//after create
var fixedForList = function () {
var id = getPostID("postID");
var childid = getPostID("postChildID");
if (isList === true && settings.enableCheckbox===false) {
$("#" + id + " ." + css.ddTitle).hide();
$("#" + childid).css({display: 'block', position: 'relative'});
//open();
} else {
if(settings.enableCheckbox===false) {
isMultiple = false; //set multiple off if this is not a list
};
$("#" + id + " ." + css.ddTitle).show();
$("#" + childid).css({display: 'none', position: 'absolute'});
//set value
var first = $("#" + childid + " li." + css.selected)[0];
$("#" + childid + " li." + css.selected).removeClass(css.selected);
var index = getIndex($(first).addClass(css.selected));
setValue(index);
};
childHeight(childHeight()); //get and set height
};
var fixedForDisabled = function () {
var id = getPostID("postID");
var opc = (isDisabled == true) ? settings.disabledOpacity : 1;
if (isDisabled === true) {
$("#" + id).addClass(css.disabledAll);
} else {
$("#" + id).removeClass(css.disabledAll);
};
};
var fixedSomeUI = function () {
//auto filter
var tid = getPostID("postTitleTextID");
if(settings.enableAutoFilter=="true") {
$("#" + tid).on("keyup", applyFilters);
};
//if is list
fixedForList();
fixedForDisabled();
};
var createLayout = function () {
var oDiv = createWrapper();
var oTitle = createTitle();
oDiv.appendChild(oTitle);
//auto filter box
var oFilterBox = createFilterBox();
oDiv.appendChild(oFilterBox);
var oChildren = createChildren();
oDiv.appendChild(oChildren);
$("#" + element).after(oDiv);
hideOriginal(); //hideOriginal
fixedSomeUI();
applyEvents();
var childid = getPostID("postChildID");
//append
if(settings.append!='') {
$("#" + childid).append(settings.append);
};
//prepend
if(settings.prepend!='') {
$("#" + childid).prepend(settings.prepend);
};
if (typeof settings.on.create == "function") {
settings.on.create.apply($this, arguments);
};
};
var selectUI_LI = function(indexes) {
var childid = getPostID("postChildID");
$("#" + childid + " li." + css_i.li).removeClass(css.selected);
if(settings.enableCheckbox===true) {
$("#" + childid + " li." + css_i.li + " input.checkbox").prop("checked", false);
};
if(isArray(indexes)===true) {
for(var i=0;i<indexes.length;i++) {
updateNow(indexes[i]);
};
} else {
updateNow(indexes);
};
function updateNow(index) {
$($("#" + childid + " li." + css_i.li)[index]).addClass(css.selected);
if(settings.enableCheckbox===true) {
$($("#" + childid + " li." + css_i.li)[index]).find("input.checkbox").prop("checked", "checked");
};
};
};
var selectMutipleOptions = function (bySelected, useIndexes) {
var childid = getPostID("postChildID");
var selected = bySelected || $("#" + childid + " li." + css.selected); //bySelected or by argument
for (var i = 0; i < selected.length; i++) {
var ind = (useIndexes===true) ? selected[i] : getIndex(selected[i]);
getElement(element).options[ind].selected = "selected";
};
setValue(selected);
};
var fireAfterItemClicked = function () {
//console.log("fireAfterItemClicked")
var childid = getPostID("postChildID");
var selected = $("#" + childid + " li." + css.selected);
if (isMultiple && (shiftHolded || controlHolded) || forcedTrigger) {
getElement(element).selectedIndex = -1; //reset old
};
var index;
if (selected.length == 0) {
index = -1;
} else if (selected.length > 1) {
//selected multiple
selectMutipleOptions(selected);
} else {
//if one selected
index = getIndex($("#" + childid + " li." + css.selected));
};
if ((getElement(element).selectedIndex != index || forcedTrigger) && selected.length<=1) {
forcedTrigger = false;
var evt = has_handler("change");
getElement(element).selectedIndex = index;
setValue(index);
//local
if (typeof settings.on.change == "function") {
var d = getDataAndUI();
settings.on.change(d.data, d.ui);
};
$("#" + element).trigger("change");
};
};
var setValue = function (index, byvalue) {
if (index !== undefined) {
var selectedIndex, value, selectedText;
if (index == -1) {
selectedIndex = -1;
value = "";
selectedText = "";
updateTitleUI(-1);
} else {
//by index or byvalue
if (typeof index != "object") {
var opt = getElement(element).options[index];
getElement(element).selectedIndex = index;
selectedIndex = index;
value = parseOption(opt);
selectedText = (index >= 0) ? getElement(element).options[index].text : "";
updateTitleUI(undefined, value);
value = value.value; //for bottom
} else {
//this is multiple or by option
selectedIndex = (byvalue && byvalue.index) || getElement(element).selectedIndex;
value = (byvalue && byvalue.value) || getElement(element).value;
selectedText = (byvalue && byvalue.text) || getElement(element).options[getElement(element).selectedIndex].text || "";
updateTitleUI(selectedIndex);
//check if this is multiple checkbox
};
};
updateProp("selectedIndex", selectedIndex);
updateProp("value", value);
updateProp("selectedText", selectedText);
updateProp("children", getElement(element).children);
updateProp("uiData", getDataAndUI());
updateProp("selectedOptions", $("#" + element + " option:selected"));
};
};
var has_handler = function (name) {
//True if a handler has been added in the html.
var evt = {byElement: false, byJQuery: false, hasEvent: false};
var obj = $("#" + element);
//console.log(name)
try {
//console.log(obj.prop("on" + name) + " "+name);
if (obj.prop("on" + name) !== null) {
evt.hasEvent = true;
evt.byElement = true;
};
} catch(e) {
//console.log(e.message);
}
// True if a handler has been added using jQuery.
var evs;
if (typeof $._data == "function") { //1.8
evs = $._data(obj[0], "events");
} else {
evs = obj.data("events");
};
if (evs && evs[name]) {
evt.hasEvent = true;
evt.byJQuery = true;
};
return evt;
};
var bind_on_events = function () {
unbind_on_events();
$("body").on("click", close);
//bind more events
$(document).on("keydown", on_keydown);
$(document).on("keyup", on_keyup);
//focus will work on this
};
var unbind_on_events = function () {
$("body").off("click", close);
//bind more events
$(document).off("keydown", on_keydown);
$(document).off("keyup", on_keyup);
};
var applyFilters = function (e) {
if(e.keyCode < ALPHABETS_START && e.keyCode!=BACKSPACE && e.keyCode!=DELETE) {
return false;
};
var childid = getPostID("postChildID");
var tid = getPostID("postTitleTextID");
var sText = getElement(tid).value;
if (sText.length == 0) {
$("#" + childid + " li:hidden").show(); //show if hidden
childHeight(childHeight());
} else {
$("#" + childid + " li").hide();
var items = $("#" + childid + " li:Contains('" + sText + "')").show();
if ($("#" + childid + " li:visible").length <= settings.visibleRows) {
childHeight(-1); //set autoheight
};
if (items.length > 0 && !isList || !isMultiple) {
$("#" + childid + " ." + css.selected).removeClass(css.selected);
$(items[0]).addClass(css.selected);
};
};
if (!isList) {
adjustOpen();
};
};
var showFilterBox = function () {
if(settings.enableAutoFilter=="true") {
var id = getPostID("postID");
var tid = getPostID("postTitleTextID");
if ($("#" + tid + ":hidden").length > 0 && controlHolded == false) {
$("#" + tid + ":hidden").show().val("");
//blur the wrapper without triggering the handler
triggerBypassingHandler(id, "blur", wrapperBlurHandler);
getElement(tid).focus();
};
};
};
var hideFilterBox = function () {
var tid = getPostID("postTitleTextID");
if ($("#" + tid + ":visible").length > 0) {
$("#" + tid + ":visible").hide();
getElement(tid).blur();
};
};
var on_keydown = function (evt) {
var tid = getPostID("postTitleTextID");
var childid = getPostID("postChildID");
switch (evt.keyCode) {
case DOWN_ARROW:
case RIGHT_ARROW:
evt.preventDefault();
evt.stopPropagation();
//hideFilterBox();
next();
break;
case UP_ARROW:
case LEFT_ARROW:
evt.preventDefault();
evt.stopPropagation();
//hideFilterBox();
previous();
break;
case ESCAPE:
case ENTER:
evt.preventDefault();
evt.stopPropagation();
close();
var selected = $("#" + childid + " li." + css.selected).length;
forcedTrigger = (oldSelected.length != selected || selected == 0) ? true : false;
fireAfterItemClicked();
unbind_on_events(); //remove old one
lastTarget = null;
break;
case SHIFT:
shiftHolded = true;
break;
case CONTROL:
controlHolded = true;
break;
default:
if (evt.keyCode >= ALPHABETS_START && isList === false) {
showFilterBox();
};
break;
};
if (isDisabled === true) return false;
fireEventIfExist("keydown");
};
var on_keyup = function (evt) {
switch (evt.keyCode) {
case SHIFT:
shiftHolded = false;
break;
case CONTROL:
controlHolded = false;
break;
};
if (isDisabled === true) return false;
fireEventIfExist("keyup");
};
var on_dblclick = function (evt) {
if (isDisabled === true) return false;
fireEventIfExist("dblclick");
};
var on_mousemove = function (evt) {
if (isDisabled === true) return false;
fireEventIfExist("mousemove");
};
var on_mouseover = function (evt) {
if (isDisabled === true) return false;
evt.preventDefault();
fireEventIfExist("mouseover");
};
var on_mouseout = function (evt) {
if (isDisabled === true) return false;
evt.preventDefault();
fireEventIfExist("mouseout");
};
var on_mousedown = function (evt) {
if (isDisabled === true) return false;
fireEventIfExist("mousedown");
};
var on_mouseup = function (evt) {
if (isDisabled === true) return false;
fireEventIfExist("mouseup");
};
var option_has_handler = function (opt, name) {
//True if a handler has been added in the html.
var evt = {byElement: false, byJQuery: false, hasEvent: false};
if ($(opt).prop("on" + name) != undefined) {
evt.hasEvent = true;
evt.byElement = true;
};
// True if a handler has been added using jQuery.
var evs = $(opt).data("events");
if (evs && evs[name]) {
evt.hasEvent = true;
evt.byJQuery = true;
};
return evt;
};
var fireOptionEventIfExist = function (li, evt_n) {
if (settings.disabledOptionEvents == false) {
var opt = getElement(element).options[getIndex(li)];
//check if original has some
if (option_has_handler(opt, evt_n).hasEvent === true) {
if (option_has_handler(opt, evt_n).byElement === true) {
opt["on" + evt_n]();
};
if (option_has_handler(opt, evt_n).byJQuery === true) {
switch (evt_n) {
case "keydown":
case "keyup":
//key down/up will check later
break;
default:
$(opt).trigger(evt_n);
break;
};
};
return false;
};
};
};
var fireEventIfExist = function (evt_n) {
//local
if (typeof settings.on[evt_n] == "function") {
settings.on[evt_n].apply(this, arguments);
};
//check if original has some
if (has_handler(evt_n).hasEvent === true) {
if (has_handler(evt_n).byElement === true) {
getElement(element)["on" + evt_n]();
} else if (has_handler(evt_n).byJQuery === true) {
switch (evt_n) {
case "keydown":
case "keyup":
//key down/up will check later
break;
default:
$("#" + element).triggerHandler(evt_n);
break;
};
};
return false;
};
};
/******************************* navigation **********************************************/
var scrollToIfNeeded = function (opt) {
var childid = getPostID("postChildID");
//if scroll is needed
opt = (opt !== undefined) ? opt : $("#" + childid + " li." + css.selected);
if (opt.length > 0) {
var pos = parseInt(($(opt).position().top));
var ch = parseInt($("#" + childid).height());
if (pos > ch) {
var top = pos + $("#" + childid).scrollTop() - (ch/2);
$("#" + childid).animate({scrollTop:top}, 500);
};
};
};
var next = function () {
var childid = getPostID("postChildID");
var items = $("#" + childid + " li:visible." + css_i.li);
var selected = $("#" + childid + " li:visible." + css.selected);
selected = (selected.length==0) ? items[0] : selected;
var index = $("#" + childid + " li:visible." + css_i.li).index(selected);
if ((index < items.length - 1)) {
index = getNext(index);
if (index < items.length) { //check again - hack for last disabled
if (!shiftHolded || !isList || !isMultiple) {
$("#" + childid + " ." + css.selected).removeClass(css.selected);
};
$(items[index]).addClass(css.selected);
updateTitleUI(index);
if (isList == true) {
fireAfterItemClicked();
};
scrollToIfNeeded($(items[index]));
};
if (!isList) {