

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,comboboxDropDownWidthHack:0,animationType:"slide",width:"120px"};if(options)
{jQuery.extend(settings,options);}
this.onChange=function()
{};return this.each(function()
{var _originalElementJQuery=jQuery(this);var _containerJQuery=null;var _containerDefaultStyle="border-left: solid 2px #777;border-top: solid 2px #777;border-right: solid 1px #ccc;border-bottom: solid 1px #ccc;";var _containerEnforcedStyle="padding:0;";var _dropDownListJQuery=null;var _dropDownListEnforcedStyle="list-style-type:none;min-height:15px;padding-top:0;margin:0;";var _dropDownListDefaultStyle="cursor:default;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;";var _dropDownListItemDefaultStyle="cursor:default;padding-left:2px;font-weight:normal;font-style:normal;";var _dropDownListGroupItemContainerEnforcedStyle="list-style-type:none;";var _dropDownListGroupItemContainerDefaultStyle="padding-left:10px;margin-left:0;";var _dropDownListGroupItemHeaderEnforcedStyle="";var _dropDownListGroupItemHeaderDefaultStyle="font-style:italic;font-weight:bold;";var _valueDisplayContainerJQuery=null;var _valueDisplayContainerEnforcedStyle="position:relative;overflow:hidden;";var _valueDisplayJQuery=null;var _valueDisplayEnforcedStyle="float:left;position:absolute;cursor:default;overflow:hidden;";var _dropDownButtonJQuery=null;var _dropDownButtonDefaultStyle="overflow:hidden;width: 16px;height: 18px;color:#000;background: #D6D3CE;,font-family: verdana;font-size: 10px;cursor: default;text-align: center;vertical-align:middle;";var _dropDownButtonEnforcedStyle="background-repeat:no-repeat;float:right;";var _dropDownButtonDefaultUnselectedStyle="padding-left:0px;padding-top:1px;width:12px;height:13px;border-right:solid 2px #404040;border-bottom:solid 2px #404040;border-left:solid 2px #f0f0f0;border-top:solid 2px #f0f0f0";var _dropDownButtonDefaultSelectedStyle="padding-left:1px;padding-top:3px;width:12px;height:13px;border:solid 1px #808080";var _dropDownButtonDefaultCharacter="&#9660;";var _lastItemSelectedJQuery=null;var _lastValue=null;var _downdownListPositionIsInverted=false;var _maximumItemLength=0;var _dropDownListOffset=null;var comboboxDropDownWidthHack=settings.comboboxDropDownWidthHack;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");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)
{_maximumItemLength=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+comboboxDropDownWidthHack;}
_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);}
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.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(settings.onItemClick&&_lastValue){eval(settings.onItemClick+"('"+_originalElementJQuery.val()+"');");}
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","#000");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);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();}}}
JQ('.comboboxDropDownContainer').bgiframe();}
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();});}

