var DDRegister=function() { var inputs=$$('select.DropDown'); for(i=0; i 0) return; var header = data[0]; var key = this.optionUL.readAttribute('key-column'); if(!key) key = this.optionUL.readAttribute('key'); var show = this.optionUL.readAttribute('show'); var keyIdx = 0; var showIdx = 1; for(var c = 0; c < header.length; ++c) { if (header[c] == key) keyIdx = c; if (header[c] == show) showIdx = c; } this.optionUL.innerHTML=''; this.items.length = 0; for(var i = 1; i < data.length; ++i) { var li=new Element('li'); li.innerHTML=' '+data[i][showIdx]; this.items.push(li); this.optionUL.appendChild(li); li.writeAttribute( 'value', String(data[i][keyIdx].Value()) ); li.writeAttribute('index', i - 1); li.observe('mouseover', this.liMouseOverCallback); } }, setupStaticLI: function() { var thisobj = this; $A(this.optionUL.childNodes).each(function(element){ if (element.nodeName.toLowerCase() != "li") return; element = $(element); var myIndex = thisobj.items.length; thisobj.items.push(element); element.writeAttribute('index', myIndex); element.observe('mouseover', thisobj.liMouseOverCallback); }); }, onKeyDown: function(evt) { var key=$(evt).which || evt.keyCode; var index=this.highlightIndex; if(key==38) { // up arrow if(index>0) --index; else index=this.items.length-1; this.highlight(index); } else if(key==40) { // down arrow if(index=0 && index item_top) list.scrollTop = item_top; } }, offs: function(elem){ if ("getBoundingClientRect" in elem){ var rect = elem.getBoundingClientRect(); var root = document.documentElement; return [rect.left - root.clientLeft, rect.top - root.clientTop]; } var res = Element.cumulativeOffset(elem); var scr = Element.cumulativeScrollOffset(elem); for (var iii = 0; iii < 2; ++iii) res[iii] -= scr[iii]; return res; }, setOpen: function(){ if (this.isopen_) return; if (this.highlighted_ && this.highlighted_.parentNode == this.list_) Element.scrollContainerTo(this.list_, this.highlighted_); Element.setStyle(this.element, {"width": this.list_.offsetWidth + "px"}); Element.setStyle(this.list_, {"position": "", "height": "", "borderStyle": ""}); document.body.appendChild(Element.remove(this.list_)); this.update_list_position(); if ("zindex_timer_" in this) window.clearTimeout(this.zindex_timer_); this.zindex_timer_ = window.setTimeout(this.update_zindex.bind(this), 200); if (typeof this.list_handlers_ === "undefined"){ var docscroll = this.document_scroll.bindAsEventListener(this); this.list_handlers_ = [ [this.list_, "mousedown", this.list_mousedown.bindAsEventListener(this)], [this.list_, "mouseup", this.list_mouseup.bindAsEventListener(this)], [this.list_, "mouseover", this.list_mouseover.bindAsEventListener(this)], [this.element, "blur", this.setClosed.bind(this)], [document, "mousewheel", docscroll], [document, "DOMMouseScroll", docscroll] ]; } this.add_handlers(this.list_handlers_); this.isopen_ = true; }, update_zindex: function(){ var zindex = 0; for (var elem = this.element; elem && elem.nodeType === Node.ELEMENT_NODE; elem = elem.parentNode){ zindex += parseInt(Element.getStyle(elem, "zIndex")) || 0; } Element.setStyle(this.list_, {"zIndex": zindex + 100}); delete this.zindex_timer_; }, document_scroll: function(event){ if (typeof this.scroll_timer_ !== "undefined"){ window.clearTimeout(this.scroll_timer_); delete this.scroll_timer_; } this.scroll_timer_ = this.update_list_position.bind(this).defer(); }, setClosed: function(){ if (!this.isopen_) return; Element.setStyle(this.list_, {"position": "static", "height": "0", "borderStyle": "none", "width": ""}); Element.setStyle(this.element, {"width": ""}); this.element.appendChild(Element.remove(this.list_)); if (typeof this.list_handlers_ != "undefined") this.remove_handlers(this.list_handlers_); this.isopen_ = false; }, toggleOpen: function(){ if (this.isopen_) this.setClosed(); else this.setOpen(); }, mousedown: function(event){ var elem = Event.element(event); if (elem != this.list_ && !Element.descendantOf(elem, this.list_)){ this.toggleOpen(); event.preventDefault(); this.element.focus(); } }, keydown: function(event){ if(event.altKey || event.ctrlKey || event.shiftKey) return; switch (event.which || event.keyCode) { case Event.KEY_ESC: this.setClosed(); break; case Event.KEY_UP: case Event.KEY_LEFT: var sibling = this.prev_item(this.highlighted_); if (sibling) this.select(sibling); event.preventDefault(); break; case Event.KEY_DOWN: case Event.KEY_RIGHT: var sibling = this.next_item(this.highlighted_); if (sibling) this.select(sibling); event.preventDefault(); break; case Event.KEY_HOME: case Event.KEY_PAGEUP: { this.select(this.first_item()); event.preventDefault(); break; } case Event.KEY_END: case Event.KEY_PAGEDOWN: { this.select(this.last_item()); event.preventDefault(); break; } case Event.KEY_BACKSPACE: if (typeof this.keyboard_input_ != "undefined" && this.keyboard_input_.length > 0){ this.keyboard_input_ = this.keyboard_input_.slice(0, -1); this.select_by_substr(this.keyboard_input_); } event.preventDefault(); return; case Event.KEY_RETURN: { if (this.isopen_) this.select(this.highlighted_); this.toggleOpen(); event.preventDefault(); this.check_change(); break; } default: return; } delete this.keyboard_input_; StopEvent(event); return false; }, keypress: function(event){ var keycode = event.which || event.keyCode; var charcode = Event.getKeyCode(event); if (charcode){ var letter = String.fromCharCode(charcode) this.select_by_substr((this.keyboard_input_ || "") + letter.toLowerCase()); if (letter == " ") event.preventDefault(); } }, select_by_substr: function(str){ for (var child = this.list_.firstChild; child; child = child.nextSibling){ if (child.nodeType != Node.ELEMENT_NODE) continue; for (var grandchild = child.firstChild; grandchild; grandchild = grandchild.nextSibling){ if (grandchild.nodeType != Node.TEXT_NODE) continue; if (String(grandchild.nodeValue).toLowerCase().replace(/^\s+/g, "").startsWith(str)){ this.keyboard_input_ = str; this.select(child); this.underline(str); return; } } } }, get_event_item: function(event){ if (!event) return null; var elem = Event.element(event); if (!elem || !Element.descendantOf(elem, this.list_)) return null; while (elem && elem.parentNode != this.list_) elem = elem.parentNode; return elem; }, list_mousedown: function(event){ event.preventDefault(); }, list_mousedown: function(event){ if (Prototype.Browser.IE) this.ignore_blur_ = true; event.preventDefault(); }, list_mouseup: function(event){ var li = this.get_event_item(event); if (!li) return; var oldval = URLSerialize(this.Value()); this.select(li); this.setClosed(); if (oldval != URLSerialize(this.Value())) this.onchange(); }, list_mouseover: function(event){ var li = this.get_event_item(event); if (li) this.highlight(li); }, Focus: function(){ this.element.focus(); }, blur: function(){ delete this.keyboard_input_; this.underline(null); this.check_change(); }, onbeforedeactivate: function(event){ if (this.ignore_blur_){ delete this.ignore_blur_; Event.stop(event); return false; }else return true; }, underline: function(str){ if (str && str.length > 0) for (var vchild = this.valcont_.firstChild; vchild; vchild = vchild.nextSibling){ if (vchild.nodeType != Node.TEXT_NODE) continue; var val = String(vchild.nodeValue); if (val.toLowerCase().replace(/^\s+/g, "").startsWith(str)){ var ind = val.toLowerCase().indexOf(str); if (ind > 0) vchild.parentNode.insertBefore(document.createTextNode(val.substr(0, ind)), vchild); var part = new Element("font", {"class": "Highlight"}); part.appendChild(document.createTextNode(val.substr(ind, str.length))); vchild.parentNode.insertBefore(part, vchild); if (ind + str.length < val.length) vchild.parentNode.insertBefore(document.createTextNode(val.substr(ind + str.length)), vchild); vchild.parentNode.removeChild(vchild); break; } } else for (var vchild = this.valcont_.firstChild; vchild; vchild = vchild.nextSibling){ if (vchild.nodeType != Node.ELEMENT_NODE || Node.localName(vchild).toLowerCase() != "font") continue; if (vchild.getAttribute("class") == "Highlight"){ for (var vgrandchild = vchild.firstChild; vgrandchild; vgrandchild = vchild.firstChild){ vchild.parentNode.insertBefore(vchild.removeChild(vgrandchild), vchild); } vchild.parentNode.removeChild(vchild); break; } } }, check_change: function(){ if (URLSerialize(this.Value()) != this.stored_value_) this.onchange(); }, oninit: function(){ new AEvent("WM_INIT", {}, this); this.store_value(); }, onchange: function(args){ new AEvent("CHANGE", typeof args == "undefined" ? {} : {"args": args}, this); this.store_value(); }, store_value: function(){ this.stored_value_ = URLSerialize(this.Value()); }, SetTabOrder: function(tabbase){ this.tabbase_ = tabbase; if (this.visibility_ && this.visibility_ != "yes") return tabbase++; else{ this.element.tabIndex = tabbase++; return tabbase; } }, WM_REFRESH: function(aevent){ if (aevent.Data()["id"] == this.element.getAttribute("localid")) this.refresh(); } });