// MSDropDown - jquery.dd.js
// author: Marghoob Suleman - Search me on google
// Date: 12th Aug, 2009, {18 Dec, 2010 (2.36)}, {date: 02 July, 2011}
// Version: 2.37.5
// Revision: 34
// web: www.giftlelo.com | www.marghoobsuleman.com
;(function($) {
var msOldDiv = "";
var dd = function(element, options, aDefaultTitleImgPath)
{
//CP specific function
var cpDefaultTitleImageSrc = aDefaultTitleImgPath;
var sElement = element;
var $this = this; //parent this
var options = $.extend({
height:120,
visibleRows:7,
rowHeight:23,
showIcon:true,
zIndex:9999,
mainCSS:'dd',
useSprite:false,
animStyle:'slideDown',
onInit:'',
style:''
}, options);
this.ddProp = new Object();//storing propeties;
var oldSelectedValue = "";
var actionSettings ={};
actionSettings.insideWindow = true;
actionSettings.keyboardAction = false;
actionSettings.currentKey = null;
var ddList = false;
var config = {postElementHolder:'_msddHolder', postID:'_msdd', postTitleID:'_title',postTitleTextID:'_titletext',postChildID:'_child',postAID:'_msa',postOPTAID:'_msopta',postInputID:'_msinput', postArrowID:'_arrow', postInputhidden:'_inp'};
var styles = {dd:options.mainCSS, ddTitle:'ddTitle', arrow:'arrow', ddChild:'ddChild', ddTitleText:'ddTitleText', disabled:1, ddOutOfVision:'ddOutOfVision', borderTop:'borderTop', noBorderTop:'noBorderTop', selected:'selected'};
var attributes = {actions:"focus,blur,change,click,dblclick,mousedown,mouseup,mouseover,mousemove,mouseout,keypress,keydown,keyup", prop:"size,multiple,disabled,tabindex"};
this.onActions = new Object();
var elementid = $(sElement).prop("id");
if(typeof(elementid)=="undefined" || elementid.length<=0) {
//assign and id;
elementid = "msdrpdd"+$.msDropDown.counter++;//I guess it makes unique for the page.
$(sElement).attr("id", elementid);
};
var inlineCSS = $(sElement).prop("style");
options.style += (inlineCSS==undefined) ? "" : inlineCSS;
var allOptions = $(sElement).children();
ddList = ($(sElement).prop("size")>1 || $(sElement).prop("multiple")==true) ? true : false;
if(ddList) {options.visibleRows = $(sElement).prop("size");};
var a_array = {};//stores id, html & value etc
var currentP = 0;
var isFilter = false;
var oldHeight;
var cacheElement = {};
var getElement = function(ele) {
if(typeof(cacheElement[ele])=="undefined") {
cacheElement[ele] = document.getElementById(ele);
}
return cacheElement[ele];
};
var getPostID = function (id) {
return elementid+config[id];
};
var getOptionsProperties = function (option) {
var currentOption = option;
var styles = $(currentOption).prop("style");
return styles;
};
var matchIndex = function (index) {
var selectedIndex = $("#"+elementid+" option:selected");
if(selectedIndex.length>1) {
for(var i=0;i ';
};
var sText = $(currentOptOption).text();
var sValue = $(currentOptOption).val();
var sEnabledClass = ($(currentOptOption).prop("disabled")==true) ? "disabled" : "enabled";
a_array[aid] = {html:arrow, value:sValue, text:sText, index:currentOptOption.index, id:aid};
var innerStyle = getOptionsProperties(currentOptOption);
if(matchIndex(currentOptOption.index)==true) {
aTag += '';
aTag += arrow;// + '' +sText+'';
return aTag;
};
var in_array = function(t) {
var sText = t.toLowerCase();
if(sText.length==0) return -1;
var a = "";
for(var i in a_array) {
var a_text = a_array[i].text.toLowerCase();
if(a_text.substr(0, sText.length) == sText) {
a += "#"+a_array[i].id+ ", ";
};
};
return (a=="") ? -1 : a;
};
var createATags = function () {
var childnodes = allOptions;
if(childnodes.length==0) return "";
var aTag = "";
var aidfix = getPostID("postAID");
var aidoptfix = getPostID("postOPTAID");
childnodes.each(function(current){
var currentOption = childnodes[current];
//OPTGROUP
if(currentOption.nodeName == "OPTGROUP") {
aTag += "
";
aTag += ""+$(currentOption).prop("label")+"";
var optChild = $(currentOption).children();
optChild.each(function(currentopt){
var currentOptOption = optChild[currentopt];
aTag += createA(currentOptOption, current, currentopt, "opt");
});
aTag += "
";
} else {
aTag += createA(currentOption, current, "", "");
};
});
return aTag;
};
var createChildDiv = function () {
var id = getPostID("postID");
var childid = getPostID("postChildID");
var sStyle = options.style;
sDiv = "";
sDiv += '';
return sDiv;
};
var createTitleDiv = function () {
var titleid = getPostID("postTitleID");
var arrowid = getPostID("postArrowID");
var titletextid = getPostID("postTitleTextID");
var inputhidden = getPostID("postInputhidden");
var sText = "";
var arrow = cpDefaultTitleImageSrc;
if(getElement(elementid).options.length>0) {
//sText = $("#"+elementid+" option:selected").text();
//arrow = $("#"+elementid+" option:selected").prop("title");
};
arrow = (arrow.length==0 || arrow==undefined || options.showIcon==false || options.useSprite!=false) ? "" : '
';
var sDiv = '
';
sDiv += ''+arrow + '
';
return sDiv;
};
var resetTitleDiv = function() {
var titleid = getPostID("postTitleID");
var arrowid = getPostID("postArrowID");
var titletextid = getPostID("postTitleTextID");
var inputhidden = getPostID("postInputhidden");
var sText = "";
var arrow = cpDefaultTitleImageSrc;
if(getElement(elementid).options.length>0) {
//sText = $("#"+elementid+" option:selected").text();
//arrow = $("#"+elementid+" option:selected").prop("title");
};
arrow = (arrow.length==0 || arrow==undefined || options.showIcon==false || options.useSprite!=false) ? "" : '
';
var lTitleInnerHTML = arrow;// + "
"+sText+"";
var lElem = document.getElementById(titletextid);
if(lElem)
lElem.innerHTML = lTitleInnerHTML;
};
var applyEventsOnA = function() {
var childid = getPostID("postChildID");
$("#"+childid+ " a.enabled").unbind("click"); //remove old one
$("#"+childid+ " a.enabled").bind("click", function(event) {
event.preventDefault();
manageSelection(this);
setValue();
if(!ddList) {
$("#"+childid).unbind("mouseover");
setInsideWindow(false);
var sText = (options.showIcon==false) ? $(this).text() : $(this).html();
setTitleText(sText);
//$this.data("dd").close();
$this.close();
};
//actionSettings.oldIndex = a_array[$($this).prop("id")].index;
});
};
var createDropDown = function () {
var changeInsertionPoint = false;
var id = getPostID("postID");
var titleid = getPostID("postTitleID");
var titletextid = getPostID("postTitleTextID");
var childid = getPostID("postChildID");
var arrowid = getPostID("postArrowID");
var iWidth = $("#"+elementid).width();
iWidth = iWidth+2;//it always give -2 width; i dont know why
var sStyle = options.style;
if($("#"+id).length>0) {
$("#"+id).remove();
changeInsertionPoint = true;
};
var sDiv = '
';
//create title bar
sDiv += createTitleDiv();
//create child
sDiv += createChildDiv();
sDiv += createATags();
sDiv += "
";
sDiv += "
";
if(changeInsertionPoint==true) {
var sid =getPostID("postElementHolder");
$("#"+sid).after(sDiv);
} else {
$("#"+elementid).after(sDiv);
};
if(ddList) {
var titleid = getPostID("postTitleID");
$("#"+titleid).hide();
};
$("#"+id).css("width", iWidth+"px");
$("#"+id).css("height", $("#"+elementid).height() + "px");
$("#"+id).find("."+styles.ddTitle).css("height", $("#"+elementid).height() + "px");
//$("#"+id).find("."+styles.ddTitleText).css("height", $("#"+elementid).height() + "px");
$("#"+childid).css("min-width", (iWidth-2)+"px");
if(allOptions.length>options.visibleRows) {
var margin = parseInt($("#"+childid+" a:first").css("padding-bottom")) + parseInt($("#"+childid+" a:first").css("padding-top"));
var iHeight = ((options.rowHeight)*options.visibleRows) - margin;
$("#"+childid).css("height", iHeight+"px");
} else if(ddList) {
var iHeight = $("#"+elementid).height();
$("#"+childid).css("height", iHeight+"px");
};
//set out of vision
if(changeInsertionPoint==false) {
setOutOfVision();
addRefreshMethods(elementid);
};
if($("#"+elementid).prop("disabled")==true) {
$("#"+id).css("opacity", styles.disabled);
};
applyEvents();
//add events
//arrow hightlight
$("#"+titleid).bind("mouseover", function(event) {
hightlightArrow(1);
});
$("#"+titleid).bind("mouseout", function(event) {
hightlightArrow(0);
});
//open close events
applyEventsOnA();
$("#"+childid+ " a.disabled").css("opacity", styles.disabled);
//alert("ddList "+ddList)
if(ddList) {
$("#"+childid).bind("mouseover", function(event) {if(!actionSettings.keyboardAction) {
actionSettings.keyboardAction = true;
$(document).bind("keydown", function(event) {
var keyCode = event.keyCode;
actionSettings.currentKey = keyCode;
if(keyCode==39 || keyCode==40) {
//move to next
event.preventDefault(); event.stopPropagation();
next();
setValue();
};
if(keyCode==37 || keyCode==38) {
event.preventDefault(); event.stopPropagation();
//move to previous
previous();
setValue();
};
});
}});
};
$("#"+childid).bind("mouseout", function(event) {setInsideWindow(false);$(document).unbind("keydown");actionSettings.keyboardAction = false;actionSettings.currentKey=null;});
$("#"+titleid).bind("click", function(event) {
setInsideWindow(false);
if($("#"+childid+":visible").length==1) {
$("#"+childid).unbind("mouseover");
} else {
$("#"+childid).bind("mouseover", function(event) {setInsideWindow(true);});
//alert("open "+elementid + $this);
//$this.data("dd").openMe();
$this.open();
};
});
$("#"+titleid).bind("mouseout", function(evt) {
setInsideWindow(false);
});
if(options.showIcon && options.useSprite!=false) {
setTitleImageSprite();
};
};
var getByIndex = function (index) {
for(var i in a_array) {
if(a_array[i].index==index) {
return a_array[i];
};
};
return -1;
};
var manageSelection = function (obj) {
var childid = getPostID("postChildID");
if($("#"+childid+ " a."+styles.selected).length==1) { //check if there is any selected
oldSelectedValue = $("#"+childid+ " a."+styles.selected).text(); //i should have value here. but sometime value is missing
//alert("oldSelectedValue "+oldSelectedValue);
};
if(!ddList) {
$("#"+childid+ " a."+styles.selected).removeClass(styles.selected);
};
var selectedA = $("#"+childid + " a."+styles.selected).prop("id");
if(selectedA!=undefined) {
var oldIndex = (actionSettings.oldIndex==undefined || actionSettings.oldIndex==null) ? a_array[selectedA].index : actionSettings.oldIndex;
};
if(obj && !ddList) {
$(obj).addClass(styles.selected);
};
if(ddList) {
var keyCode = actionSettings.currentKey;
if($("#"+elementid).prop("multiple")==true) {
if(keyCode == 17) {
//control
actionSettings.oldIndex = a_array[$(obj).prop("id")].index;
$(obj).toggleClass(styles.selected);
//multiple
} else if(keyCode==16) {
$("#"+childid+ " a."+styles.selected).removeClass(styles.selected);
$(obj).addClass(styles.selected);
//shift
var currentSelected = $(obj).prop("id");
var currentIndex = a_array[currentSelected].index;
for(var i=Math.min(oldIndex, currentIndex);i<=Math.max(oldIndex, currentIndex);i++) {
$("#"+getByIndex(i).id).addClass(styles.selected);
};
} else {
$("#"+childid+ " a."+styles.selected).removeClass(styles.selected);
$(obj).addClass(styles.selected);
actionSettings.oldIndex = a_array[$(obj).prop("id")].index;
};
} else {
$("#"+childid+ " a."+styles.selected).removeClass(styles.selected);
$(obj).addClass(styles.selected);
actionSettings.oldIndex = a_array[$(obj).prop("id")].index;
};
//isSingle
};
};
var addRefreshMethods = function (id) {
//deprecated
var objid = id;
getElement(objid).refresh = function(e) {
$("#"+objid).msDropDown(options);
};
};
var setInsideWindow = function (val) {
actionSettings.insideWindow = val;
};
var getInsideWindow = function () {
return actionSettings.insideWindow;
//will work on this
};
var applyEvents = function () {
var mainid = getPostID("postID");
var actions_array = attributes.actions.split(",");
for(var iCount=0;iCount");
$("#"+elementid).appendTo($("#"+sId));
};
var setTitleText = function (sText) {
var titletextid = getPostID("postTitleTextID");
$("#"+titletextid).html(sText);
};
var navigateA = function(w) {
var where = w;
var childid = getPostID("postChildID");
var visibleA = $("#"+childid + " a:visible");
var totalA = visibleA.length;
var currentP = $("#"+childid +" a:visible").index($("#"+childid +" a.selected:visible"));
var nextA;
switch(where) {
case "next":
if(currentP < totalA-1) {
currentP++;
nextA = visibleA[currentP];
};
break;
case "previous":
if(currentP < totalA && currentP>0) {
currentP--;
nextA = visibleA[currentP];
};
break;
};
if(typeof(nextA)=="undefined") {
return false;
};
$("#"+childid + " a."+styles.selected).removeClass(styles.selected);
$(nextA).addClass(styles.selected);
var selectedA = nextA.id;
if(!ddList) {
var sText = (options.showIcon==false) ? a_array[selectedA].text : $("#"+selectedA).html();
setTitleText(sText);
setTitleImageSprite(a_array[selectedA].index);
};
if(where=="next") {
if(parseInt(($("#"+selectedA).position().top+$("#"+selectedA).height()))>=parseInt($("#"+childid).height())) {
$("#"+childid).scrollTop(($("#"+childid).scrollTop())+$("#"+selectedA).height()+$("#"+selectedA).height());
};
} else {
if(parseInt(($("#"+selectedA).position().top+$("#"+selectedA).height())) <=0) {
$("#"+childid).scrollTop(($("#"+childid).scrollTop()-$("#"+childid).height())-$("#"+selectedA).height());
};
};
};
var next = function () {
navigateA("next");
};
var previous = function () {
navigateA("previous");
};
var setTitleImageSprite = function(i) {
if(options.useSprite!=false) {
var titletextid = getPostID("postTitleTextID");
var index = (typeof(i)=="undefined") ? getElement(elementid).selectedIndex : i;
var sClassName = getElement(elementid).options[index].className;
if(sClassName.length>0) {
var childid = getPostID("postChildID");
var id = $("#"+childid + " a."+sClassName).prop("id");
var backgroundImg = $("#"+id).css("background-image");
var backgroundPosition = $("#"+id).css("background-position");
var paddingLeft = $("#"+id).css("padding-left");
if(backgroundImg!=undefined) {
$("#"+titletextid).find("."+styles.ddTitleText).attr('style', "background:"+backgroundImg);
};
if(backgroundPosition!=undefined) {
$("#"+titletextid).find("."+styles.ddTitleText).css('background-position', backgroundPosition);
};
if(paddingLeft!=undefined) {
$("#"+titletextid).find("."+styles.ddTitleText).css('padding-left', paddingLeft);
};
$("#"+titletextid).find("."+styles.ddTitleText).css('background-repeat', 'no-repeat');
$("#"+titletextid).find("."+styles.ddTitleText).css('padding-bottom', '2px');
};
};
};
var setValue = function () {
//alert("setValue "+elementid);
var childid = getPostID("postChildID");
var allSelected = $("#"+childid + " a."+styles.selected);
if(allSelected.length==1) {
var sText = $("#"+childid + " a."+styles.selected).text();
var selectedA = $("#"+childid + " a."+styles.selected).prop("id");
if(selectedA!=undefined) {
var sValue = a_array[selectedA].value;
getElement(elementid).selectedIndex = a_array[selectedA].index;
};
//set image on title if using sprite
if(options.showIcon && options.useSprite!=false)
setTitleImageSprite();
} else if(allSelected.length>1) {
//var alls = $("#"+elementid +" > option:selected").removeprop("selected");
for(var i=0;i0 || $(sElement).prop("multiple")==true) ? true : false;
if(ddList) {
//do something
var iHeight = $("#"+elementid).height();
var childid = getPostID("postChildID");
$("#"+childid).css("height", iHeight+"px");
//hide titlebar
var titleid = getPostID("postTitleID");
$("#"+titleid).hide();
var childid = getPostID("postChildID");
$("#"+childid).css({display:'block',position:'relative'});
applyEventsOnA();
};
break;
case "size":
getElement(elementid)[prop] = val;
if(val==0) {
getElement(elementid).multiple = false;
};
ddList = ($(sElement).prop("size")>0 || $(sElement).prop("multiple")==true) ? true : false;
if(val==0) {
//show titlebar
var titleid = getPostID("postTitleID");
$("#"+titleid).show();
var childid = getPostID("postChildID");
$("#"+childid).css({display:'none',position:'absolute'});
var sText = "";
if(getElement(elementid).selectedIndex>=0) {
var aObj = getByIndex(getElement(elementid).selectedIndex);
sText = aObj.html;
manageSelection($("#"+aObj.id));
};
setTitleText(sText);
} else {
//hide titlebar
var titleid = getPostID("postTitleID");
$("#"+titleid).hide();
var childid = getPostID("postChildID");
$("#"+childid).css({display:'block',position:'relative'});
};
break;
default:
try{
//check if this is not a readonly properties
getElement(elementid)[prop] = val;
} catch(e) {
//silent
};
break;
};
};
//alert("get " + prop + " : "+$this.ddProp[prop]);
//$this.set("selectedIndex", 0);
};
this.get = function(prop, forceRefresh) {
if(prop==undefined && forceRefresh==undefined) {
//alert("c1 : " +$this.ddProp);
return $this.ddProp;
};
if(prop!=undefined && forceRefresh==undefined) {
//alert("c2 : " +$this.ddProp[prop]);
return ($this.ddProp[prop]!=undefined) ? $this.ddProp[prop] : null;
};
if(prop!=undefined && forceRefresh!=undefined) {
//alert("c3 : " +getElement(elementid)[prop]);
return getElement(elementid)[prop];
};
};
this.visible = function(val) {
var id = getPostID("postID");
if(val==true) {
$("#"+id).show();
} else if(val==false) {
$("#"+id).hide();
} else {
return $("#"+id).css("display");
};
};
this.add = function(opt, index) {
var objOpt = opt;
var sText = objOpt.text;
var sValue = (objOpt.value==undefined || objOpt.value==null) ? sText : objOpt.value;
var img = (objOpt["title"]==undefined || objOpt["title"]==null) ? '' : objOpt["title"];
var i = (index==undefined || index==null) ? getElement(elementid).options.length : index;
getElement(elementid).options[i] = new Option(sText, sValue);
if(img!='') getElement(elementid).options[i]["title"] = img;
//check if exist
var ifA = getByIndex(i);
if(ifA != -1) {
//replace
var aTag = createA(getElement(elementid).options[i], i, "", "");
$("#"+ifA.id).html(aTag);
//a_array[key]
} else {
var aTag = createA(getElement(elementid).options[i], i, "", "");
//add
var childid = getPostID("postChildID");
$("#"+childid).append(aTag);
applyEventsOnA();
};
};
this.remove = function(i) {
getElement(elementid).remove(i);
if((getByIndex(i))!= -1) { $("#"+getByIndex(i).id).remove();addRemoveFromIndex(i, 'd');};
//alert("a" +a);
if(getElement(elementid).length==0) {
setTitleText("");
} else {
var sText = getByIndex(getElement(elementid).selectedIndex).html;
setTitleText(sText);
};
$this.set("selectedIndex", getElement(elementid).selectedIndex);
};
this.disabled = function(dis, isLocal) {
getElement(elementid).disabled = dis;
//alert(getElement(elementid).disabled);
var id = getPostID("postID");
if(dis==true) {
$("#"+id).css("opacity", styles.disabled);
$this.close();
} else if(dis==false) {
$("#"+id).css("opacity", 1);
};
if(isLocal!=true) {
$this.set("disabled", dis);
};
};
//return form element
this.form = function() {
return (getElement(elementid).form == undefined) ? null : getElement(elementid).form;
};
this.item = function() {
//index, subindex - use arguments.length
if(arguments.length==1) {
return getElement(elementid).item(arguments[0]);
} else if(arguments.length==2) {
return getElement(elementid).item(arguments[0], arguments[1]);
} else {
throw {message:"An index is required!"};
};
};
this.namedItem = function(nm) {
return getElement(elementid).namedItem(nm);
};
this.multiple = function(is) {
if(typeof(is)=="undefined") {
return $this.get("multiple");
} else {
$this.set("multiple", is);
};
};
this.size = function(sz) {
if(typeof(sz)=="undefined") {
return $this.get("size");
} else {
$this.set("size", sz);
};
};
this.addMyEvent = function(nm, fn) {
$this.onActions[nm] = fn;
};
this.fireEvent = function(nm) {
eval($this.onActions[nm])($this);
};
//end
var updateCommonVars = function() {
$this.set("version", $.msDropDown.version);
$this.set("author", $.msDropDown.author);
};
var init = function() {
//create wrapper
createDropDown();
//update propties
//alert("init");
setOriginalProperties();
updateCommonVars();
if(options.onInit!='') {
eval(options.onInit)($this);
};
};
init();
};
//static
$.msDropDown = {
version: 2.37,
author: "Marghoob Suleman",
counter:20,
create: function(id, opt) {
return $(id).msDropDown(opt).data("dd");
}
};
$.fn.extend({
msDropDown: function(options, aDefaultTitleImgPath)
{
return this.each(function()
{
//if ($(this).data('dd')) return; // need to comment when using refresh method - will remove in next version
var mydropdown = new dd(this, options, aDefaultTitleImgPath);
$(this).data('dd', mydropdown);
});
}
});
//fixed for prop
if(typeof($.fn.prop)=='undefined') {
$.fn.prop = function(w) {
return $(this).attr(w);
};
};
})(jQuery);