jQuery.fn.combobox=function(options){var settings={comboboxContainerClass:null,comboboxValueContainerClass:null,comboboxValueContentClass:null,comboboxDropDownButtonClass:null,comboboxDropDownClass:null,comboboxDropDownItemClass:null,comboboxDropDownItemHoverClass:null,comboboxDropDownGroupItemHeaderClass:null,comboboxDropDownGroupItemContainerClass:null,animationType:"slide",width:170};if(options){jQuery.extend(settings,options)}this.onChange=function(){};return this.each(function(){var _originalElementJQuery=jQuery(this);var _containerJQuery=null;var _containerDefaultStyle="font-size: 10pt; padding-right: 2px; border-left: solid 1px #777;border-top: solid 1px #777;border-right: solid 1px #ccc;border-bottom: solid 1px #ccc; background-color: #FFFFFF;";var _containerEnforcedStyle="font-size: 10pt; ";var _dropDownListJQuery=null;var _dropDownListEnforcedStyle="font-size: 10pt; list-style-type:none;min-height:15px;padding-top:0;margin:0;";var _dropDownListDefaultStyle="font-size: 10pt; cursor:pointer;padding:2px;background:#fff;border-right:solid 1px #000;border-bottom:solid 1px #000;border-left:solid 1px #aaa;border-top:solid 1px #aaa;overflow:auto";var _dropDownListItemEnforcedStyle="display:block; white-space: normal;";var _dropDownListItemDefaultStyle="font-size: 10pt; line-height: 11pt; cursor:pointer;padding-right:2px;font-weight:normal;font-style:normal;";var _dropDownListGroupItemContainerEnforcedStyle="list-style-type:none; direction: rtl; ";var _dropDownListGroupItemContainerDefaultStyle="padding-left:10px; margin-right:0;  direction: rtl;";var _dropDownListGroupItemHeaderEnforcedStyle="font-size: 10pt;";var _dropDownListGroupItemHeaderDefaultStyle="font-size: 10pt; font-style:italic;font-weight:bold;";var _valueDisplayContainerJQuery=null;var _valueDisplayContainerEnforcedStyle="position:relative;overflow:hidden;";var _valueDisplayJQuery=null;var _valueDisplayEnforcedStyle="font-size: 10pt; cursor:pointer; direction: rtl; float:right;position:absolute;cursor:default;overflow:hidden;";var _dropDownButtonJQuery=null;var _dropDownButtonDefaultStyle="overflow:hidden;width: 16px; height: 18px;color:#FFFFFF;background: #75849B;font-family: verdana;font-size: 10px;cursor: default;text-align: center;vertical-align:middle;";var _dropDownButtonEnforcedStyle="background-repeat:no-repeat; background-position:left top; float:left;";var _dropDownButtonDefaultUnselectedStyle="padding-right:0px;padding-top:1px;width:12px;height:14px;border-right:solid 1px #60677A;border-bottom:solid 1px #60677A;border-left:solid 1px #C9D2E1;border-top:solid 1px #C9D2E1";var _dropDownButtonDefaultSelectedStyle="padding-right:1px;padding-top:3px;width:12px;height:14px;border:solid 1px #808080";var _dropDownButtonDefaultCharacter="&#9660;";var _lastItemSelectedJQuery=null;var _lastValue=null;var _downdownListPositionIsInverted=false;var _maximumItemLength=settings.width;var _dropDownListOffset=null;String.format=function(){var currentString=null;if(arguments.length!=0){currentString=arguments[0];for(var argumentIndex=1;argumentIndex<arguments.length;argumentIndex++){var modifiedString=new RegExp('\\{'+(argumentIndex-1)+'\\}','gm');currentString=currentString.replace(modifiedString,arguments[argumentIndex])}}return currentString};function setInnerWidth(elementJQuery,width){var differenceWidth=(elementJQuery.outerWidth()-elementJQuery.width());elementJQuery.width(width-differenceWidth)}function setInnerHeight(elementJQuery,height){var differenceheight=(elementJQuery.outerHeight()-elementJQuery.height());elementJQuery.height(height-differenceheight)}function buildValueDisplay(){var valueDisplayContainerHTML="";if(settings.comboboxValueContainerClass){valueDisplayContainerHTML=String.format("<div class='{0}' style='{1}'></div>",settings.comboboxValueContainerClass,_valueDisplayContainerEnforcedStyle)}else{valueDisplayContainerHTML=String.format("<div style='{0}'></div>",_valueDisplayContainerEnforcedStyle)}var valueDisplayHTML="";if(settings.comboboxValueContentClass){valueDisplayHTML=String.format("<div class='{0}' style='{1}'></div>",settings.comboboxValueContentClass,_valueDisplayEnforcedStyle)}else{valueDisplayHTML=String.format("<div style='{0}'></div>",_valueDisplayEnforcedStyle)}var dropdownButtonHTML="";if(settings.comboboxDropDownButtonClass){dropdownButtonHTML=String.format("<div class='{1}' style='{0}'></div>",_dropDownButtonEnforcedStyle,settings.comboboxDropDownButtonClass)}else{dropdownButtonHTML=String.format("<div style='{0}'>{1}</div>",(_dropDownButtonEnforcedStyle+_dropDownButtonDefaultStyle),_dropDownButtonDefaultCharacter)}_valueDisplayJQuery=jQuery(valueDisplayHTML);_dropDownButtonJQuery=jQuery(dropdownButtonHTML);_valueDisplayContainerJQuery=jQuery(valueDisplayContainerHTML);_valueDisplayContainerJQuery.appendTo(_containerJQuery);_valueDisplayJQuery.appendTo(_valueDisplayContainerJQuery);_dropDownButtonJQuery.appendTo(_valueDisplayContainerJQuery);setDropDownButtonState(0)}function buildDropDownItem(childJQuery){var dataItemHTML="";var dataItemClass=null;var dataItemText="";var dataItemValue=null;var dataItemStyle="";var dataItemType="option";if(childJQuery.is('option')){dataItemText=childJQuery.text();dataItemValue=childJQuery.val();if(settings.comboboxDropDownItemClass){dataItemClass=settings.comboboxDropDownItemClass;dataItemStyle=_dropDownListItemEnforcedStyle}else{dataItemStyle=(_dropDownListItemEnforcedStyle+_dropDownListItemDefaultStyle)}if(dataItemClass){dataItemHTML=String.format("<li style='{0}' class='{1}'>{2}</li>",dataItemStyle,dataItemClass,dataItemText)}else{dataItemHTML=String.format("<li style='{0}'>{1}</li>",dataItemStyle,dataItemText)}}else{dataItemText=childJQuery.attr('label');dataItemValue=childJQuery.attr('class');dataItemType="optgroup";if(settings.comboboxDropDownGroupItemHeaderClass){dataItemClass=settings.comboboxDropDownGroupItemHeaderClass;dataItemStyle=_dropDownListGroupItemHeaderEnforcedStyle}else{dataItemStyle=(_dropDownListGroupItemHeaderEnforcedStyle+_dropDownListGroupItemHeaderDefaultStyle)}if(dataItemClass){dataItemHTML=String.format("<li><span style='{0}' class='{1}'>{2}</span></li>",dataItemStyle,dataItemClass,dataItemText)}else{dataItemHTML=String.format("<li><span style='{0}'>{1}</span></li>",dataItemStyle,dataItemText)}}var dataItemJQuery=jQuery(dataItemHTML);dataItemJQuery.css("display","inline-block");dataItemJQuery[0].dataValue=dataItemValue;dataItemJQuery[0].dataType=dataItemType;dataItemJQuery[0].title=dataItemText;return dataItemJQuery}function recursivelyBuildList(parentJQuery,childrenOptionsJQuery){childrenOptionsJQuery.each(function(){var childJQuery=jQuery(this);var builtDropDownItemJQuery=buildDropDownItem(childJQuery);parentJQuery.append(builtDropDownItemJQuery);var offsetLeft=builtDropDownItemJQuery.offset().left;offsetLeft-=_dropDownListOffset.left;if(offsetLeft<0){offsetLeft=0}var width=(offsetLeft+builtDropDownItemJQuery.outerWidth());if(width>_maximumItemLength){_maximumItemLength=width}applyMultipleStyles(builtDropDownItemJQuery,_dropDownListItemEnforcedStyle);if(childJQuery.is('optgroup')){var dataGroupItemHTML="";if(settings.comboboxDropDownGroupItemContainerClass){dataGroupItemHTML=String.format("<ul style='{0}' class='{1}'></ul>",_dropDownListGroupItemContainerEnforcedStyle,settings.comboboxDropDownGroupItemContainerClass)}else{dataGroupItemHTML=String.format("<ul style='{0}'></ul>",(_dropDownListGroupItemContainerEnforcedStyle+_dropDownListGroupItemContainerDefaultStyle))}var dataGroupItemJQuery=jQuery(dataGroupItemHTML);builtDropDownItemJQuery.append(dataGroupItemJQuery);recursivelyBuildList(dataGroupItemJQuery,childJQuery.children())}})}function buildDropDownList(){var originalElementChildrenJQuery=_originalElementJQuery.children();_lastItemSelectedJQuery=null;_lastValue=null;if(_dropDownListJQuery){_dropDownListJQuery.empty()}else{var dropDownHTML="";if(settings.comboboxDropDownClass){dropDownHTML=String.format("<ul class='{0}' style='{1}'></ul>",settings.comboboxDropDownClass,_dropDownListEnforcedStyle)}else{dropDownHTML=String.format("<ul style='{0}'></ul>",(_dropDownListEnforcedStyle+_dropDownListDefaultStyle))}_dropDownListJQuery=jQuery(dropDownHTML);_dropDownListJQuery.appendTo(_containerJQuery);_dropDownListJQuery.attr("tabIndex",0)}if(originalElementChildrenJQuery.length>0){_dropDownListOffset=_dropDownListJQuery.offset();recursivelyBuildList(_dropDownListJQuery,originalElementChildrenJQuery)}}function applyMultipleStyles(elementJQuery,multipleCSSStyles){var stylePairArray=multipleCSSStyles.split(";");if(stylePairArray.length>0){for(var stylePairArrayIndex=0;stylePairArrayIndex<stylePairArray.length;stylePairArrayIndex++){var stylePair=stylePairArray[stylePairArrayIndex];var splitStylePair=stylePair.split(":");elementJQuery.css(splitStylePair[0],splitStylePair[1])}}}function setDropDownButtonState(state){if(settings.comboboxDropDownButtonClass){var width=_dropDownButtonJQuery.width();var offset=state*width;var background_positionCSS=String.format("-{0}px 0px",offset);_dropDownButtonJQuery.css("background-position",background_positionCSS)}else{var style=_dropDownButtonDefaultUnselectedStyle;if(state==1){style=_dropDownButtonDefaultSelectedStyle}applyMultipleStyles(_dropDownButtonJQuery,style)}}function updateDropDownListWidth(){var dropdownListWidth=_containerJQuery.outerWidth();if(dropdownListWidth<_maximumItemLength){dropdownListWidth=_maximumItemLength}_dropDownListJQuery.width(dropdownListWidth)}function positionDisplayValue(){var displayValueHeight=_valueDisplayJQuery.outerHeight();var displayContainerHeight=_valueDisplayContainerJQuery.height();var difference=((displayContainerHeight-displayValueHeight)/2);if(difference<0){difference=0}_valueDisplayJQuery.css("top",difference);_valueDisplayJQuery.css("right",0)}function applyLayout(){_containerJQuery.width(settings.width);var controlWidth=_containerJQuery.width();setInnerWidth(_valueDisplayContainerJQuery,controlWidth);var displayValueWidth=(_valueDisplayContainerJQuery.width()-_dropDownButtonJQuery.outerWidth());setInnerWidth(_valueDisplayJQuery,displayValueWidth);var dropDownButtonHeight=_dropDownButtonJQuery.outerHeight();setInnerHeight(_valueDisplayContainerJQuery,dropDownButtonHeight);_dropDownListJQuery.css("position","absolute");_dropDownListJQuery.css("z-index","20000");updateDropDownListWidth();var currentLeftPosition=_dropDownListJQuery.offset().left;var leftPosition=(currentLeftPosition-(_containerJQuery.outerWidth()-_containerJQuery.width()));_dropDownListJQuery.css("left",currentLeftPosition);_dropDownListJQuery.hide()}function bindItemEvents(){jQuery("*",_dropDownListJQuery).not("ul").not("span").not("[@dataType='optgroup']").each(function(){var itemJQuery=jQuery(this);itemJQuery.click(function(clickEvent){clickEvent.stopPropagation();container_onItemClick(itemJQuery)});itemJQuery.mouseover(function(){container_onItemMouseOver(itemJQuery)});itemJQuery.mouseout(function(){container_onItemMouseOut(itemJQuery)})})}function bindBlurEvent(){_dropDownListJQuery.blur(function(blurEvent){blurEvent.stopPropagation();dropDownListJQuery_onBlur()})}function bindContainerClickEvent(){_containerJQuery.click(function(clickEvent){container_onClick()})}function unbindContainerClickEvent(){_containerJQuery.unbind("click")}function bindEvents(){_containerJQuery.keydown(function(keyEvent){keyEvent.preventDefault();container_onKeyDown(keyEvent)});bindContainerClickEvent();bindBlurEvent();bindItemEvents()}function setDisplayValue(){var valueHasChanged=false;var originalElement=_originalElementJQuery[0];if(originalElement.length>0){var selectedText=originalElement[originalElement.selectedIndex].text;_valueDisplayJQuery.text(selectedText);_valueDisplayJQuery.attr("title",selectedText);positionDisplayValue();if(_lastValue){if(_lastValue!=_originalElementJQuery.val()){valueHasChanged=true}}_lastValue=_originalElementJQuery.val();if(valueHasChanged){if(_originalElementJQuery.combobox.onChange){_originalElementJQuery.combobox.onChange()}}if(_lastItemSelectedJQuery){toggleItemHighlight(_lastItemSelectedJQuery,false)}_lastItemSelectedJQuery=jQuery("li[@dataValue='"+_lastValue+"']",_dropDownListJQuery);toggleItemHighlight(_lastItemSelectedJQuery,true)}}function toggleItemHighlight(elementJQuery,isHighlighted){if(elementJQuery){if(settings.comboboxDropDownItemHoverClass){if(isHighlighted){elementJQuery.addClass(settings.comboboxDropDownItemHoverClass)}else{elementJQuery.removeClass(settings.comboboxDropDownItemHoverClass)}}else{if(isHighlighted){elementJQuery.css("background","#737F99");elementJQuery.css("color","#fff")}else{elementJQuery.css("background","");elementJQuery.css("color","")}}}}function buildContainer(){var containerHTML="";if(settings.comboboxContainerClass){containerHTML=String.format("<div class='{0}' style='{1}'></div>",settings.comboboxContainerClass,_containerEnforcedStyle)}else{containerHTML=String.format("<div style='{0}' style='{1}'></div>",_containerDefaultStyle,_containerEnforcedStyle)}_containerJQuery=jQuery(containerHTML);_originalElementJQuery.before(_containerJQuery);_containerJQuery.append(_originalElementJQuery);_originalElementJQuery.hide();_containerJQuery.attr("tabIndex",0)}function initialiseControl(){buildContainer();buildValueDisplay();buildDropDownList();applyLayout();bindEvents();setDisplayValue()}function setDropDownListFocus(){_dropDownListJQuery.focus()}function setAndBindContainerFocus(){_containerJQuery.focus();bindContainerClickEvent()}function slideUp(newTop){_dropDownListJQuery.animate({height:"toggle",top:newTop},"fast",setDropDownListFocus)}function slideDown(newTop){_dropDownListJQuery.animate({height:"toggle",top:newTop},"fast",setAndBindContainerFocus)}function getDropDownListTop(){var comboboxTop=_containerJQuery.position().top;var dropdownListHeight=_dropDownListJQuery.outerHeight();var comboboxBottom=(comboboxTop+_containerJQuery.outerHeight());var windowScrollTop=jQuery(window).scrollTop();var windowHeight=jQuery(window).height();var availableSpaceBelow=(windowHeight-(comboboxBottom-windowScrollTop));var dropdownListTop;dropdownListTop=comboboxBottom;_downdownListPositionIsInverted=false;if(availableSpaceBelow<dropdownListHeight){if((comboboxTop-windowScrollTop)>dropdownListHeight){dropdownListTop=(comboboxTop-dropdownListHeight);_downdownListPositionIsInverted=true}}return dropdownListTop}function toggleDropDownList(isShown){if(isShown){if(_dropDownListJQuery.is(":hidden")){unbindContainerClickEvent();toggleItemHighlight(_lastItemSelectedJQuery,true);setDropDownButtonState(1);var dropdownListTop=getDropDownListTop();_dropDownListJQuery.css("top",dropdownListTop);_dropDownListJQuery.css("left",_containerJQuery.offset().left);switch(settings.animationType){case"slide":if(_downdownListPositionIsInverted){var comboboxTop=_containerJQuery.position().top;var containerHeight=_containerJQuery.outerHeight();_dropDownListJQuery.css("top",(comboboxTop-containerHeight));slideUp(dropdownListTop)}else{_dropDownListJQuery.slideDown("fast",setDropDownListFocus)}break;case"fade":_dropDownListJQuery.fadeIn("fast",setDropDownListFocus);break;default:_dropDownListJQuery.show();setDropDownListFocus()}}}else{if(_dropDownListJQuery.is(":visible")){setDropDownButtonState(0);switch(settings.animationType){case"slide":if(_downdownListPositionIsInverted){comboboxTop=_containerJQuery.position().top;dropdownListHeight=_dropDownListJQuery.height();slideDown(comboboxTop-_containerJQuery.outerHeight())}else{_dropDownListJQuery.slideUp("fast",setAndBindContainerFocus)}break;case"fade":_dropDownListJQuery.fadeOut("fast",setAndBindContainerFocus);break;default:_dropDownListJQuery.hide();setAndBindContainerFocus()}}}}function selectValue(subSelector){var originalElement=_originalElementJQuery[0];var currentIndex=originalElement.selectedIndex;var newIndex=-1;var optionCountZeroBased=originalElement.length-1;switch(subSelector){case":next":newIndex=currentIndex+1;if(newIndex>optionCountZeroBased){newIndex=optionCountZeroBased}break;case":previous":newIndex=currentIndex-1;if(newIndex<0){newIndex=0}break;case":first":newIndex=0;break;case":last":newIndex=optionCountZeroBased;break}originalElement.selectedIndex=newIndex;setDisplayValue()}function isDropDownVisible(){return _dropDownListJQuery.is(":visible")}_originalElementJQuery.combobox.updateSelection=function(){setDisplayValue()};_originalElementJQuery.combobox.update=function(){buildDropDownList();updateDropDownListWidth();bindItemEvents();setDisplayValue()};function container_onClick(){if(_dropDownListJQuery.is(":hidden")){toggleDropDownList(true)}else{toggleDropDownList(false)}}function dropDownListJQuery_onBlur(){if(_dropDownListJQuery.is(":visible")){toggleDropDownList(false)}}function container_onItemClick(itemJQuery){_originalElementJQuery.val(itemJQuery[0].dataValue);setDisplayValue();toggleDropDownList(false)}function container_onItemMouseOver(itemJQuery){toggleItemHighlight(_lastItemSelectedJQuery,false);toggleItemHighlight(itemJQuery,true)}function container_onItemMouseOut(itemJQuery){toggleItemHighlight(itemJQuery,false)}function container_onKeyDown(keyEvent){switch(keyEvent.which){case 33:case 36:selectValue(":first");break;case 34:case 35:selectValue(":last");break;case 37:selectValue(":previous");break;case 38:if(keyEvent.altKey){toggleDropDownList(!(isDropDownVisible()))}else{selectValue(":previous")}break;case 39:selectValue(":next");break;case 40:if(keyEvent.altKey){toggleDropDownList(!(isDropDownVisible()))}else{selectValue(":next")}break;case 27:case 13:toggleDropDownList(false);break;case 9:_dropDownListJQuery.blur();$(window)[0].focus();break}keyEvent.cancelBubble=true}initialiseControl()})}
