DIC = { 'dropdown_invitation': '#dropdown_invitation#', 'dropdown_loading': '#dropdown_loading#' } Event = { KEY_UP: 38, //up arrow KEY_DOWN: 40, //down arrow KEY_LEFT: 37, //left arrow KEY_RIGHT: 39, //right arrow KEY_RETURN: 13, //enter KEY_ESC: 27, //esc KEY_BACKSPACE: 8 //backspace } var obj_deep_level = 1; function print_r(obj) { obj_deep_level++; if (obj_deep_level > 10) return; for (var key in obj) { if (obj[key] != null && typeof(obj[key]) == "object") print_r(obj[key]); else document.writeln('
' + key + ': ' + obj[key] + ' ' + typeof(obj[key]) + '

'); } obj_deep_level--; } /****** dropDownList.js ******/ function dropDownList( editField, clickCallback, submitter, jSwhat, overlap, invitingText ) { var req = new Object(); req.clickCallback = clickCallback; req.editField = get_by_id( editField ); req.submitter = get_by_id( submitter ); req.invitingText = invitingText || DIC.dropdown_invitation; if ( !req.editField ) { throw "editField not found"; } req.editField.setAttribute( 'autocomplete', "off" ); var span = document.createElement( 'DIV' ); span.style.position = 'relative'; span.className = 'dropDownContainer'; req.editField.parentNode.replaceChild( span, req.editField ); span.appendChild( req.editField ); req.list = document.createElement( 'UL' ); req.list.className = 'dropDownList'; // span.appendChild( req.list ); req.indicator = document.createElement('img'); req.indicator.className = 'indicator'; req.indicator.src = '/themes/blue/img/progress.gif'; req.indicator.body = span; // IE fix if (req.list.runtimeStyle) { span.style.zoom = '1'; req.list.style.top = '1.7em'; }; req.editField.onfocus = function() { req.invite(); req.editField.form.onsubmit = req.preventSubmit; }; req.editField.onblur = function() { if (req.JsHttpRequest) { req.JsHttpRequest.onDone = function(xmlhttp) {}; req.JsHttpRequest.abort(); } req.editField.form.onsubmit = null; setTimeout( function(){ req.clearList() }, 200 ); }; req.editField.onkeyup = function(e) { e = (e) ? e : ((window.event) ? event : null ); if ( req.oldReqValue == req.editField.value) { switch ( e.keyCode ) { case Event.KEY_BACKSPACE: case Event.KEY_ESC: case Event.KEY_UP: case Event.KEY_DOWN: req.indicate(true); break; default: return; } } else { if ( e.keyCode != Event.KEY_UP && e.keyCode != Event.KEY_DOWN) { req.oldReqValue = req.editField.value; } clearTimeout(req.timeout); } if ( req.editField.value.length == 0 ) { req.clearList() req.invite() return; } switch ( e.keyCode ) { case Event.KEY_BACKSPACE: req.clearList(); break; case Event.KEY_ESC: req.clearList(); return; break; case Event.KEY_UP: if ( req.list.childNodes.length > 0 ) { if ( req.selected !== null ) { req.list.childNodes[req.selected].className = ""; } switch ( req.selected ) { case null: req.selected = req.list.childNodes.length - 1; break; case 0: req.selected = null; req.editField.value = req.oldReqValue; break; default: req.selected--; break; } if ( req.selected !== null ) { req.list.childNodes[req.selected].className = "selected"; req.editField.value = req.list.childNodes[req.selected].title; } return; } break; case Event.KEY_DOWN: if ( req.list.childNodes.length > 0 ) { if ( req.selected !== null ) { req.list.childNodes[req.selected].className = ""; } switch ( req.selected ) { case null: req.selected = 0; break; case req.list.childNodes.length - 1: req.selected = null; req.editField.value = req.oldReqValue; break; default: req.selected++; break; } if ( req.selected !== null ) { req.list.childNodes[req.selected].className = "selected"; req.editField.value = req.list.childNodes[req.selected].title; } return; } break; case Event.KEY_RETURN: return; } req.JsHttpRequest = new CXMLHttp(); req.JsHttpRequest.onDone = function(xmlhttp) { if ( xmlhttp.responseText ) { if (window.console) window.console.out(xmlhttp.responseText, '', 'Suggest'); } req.fillList(xmlhttp.responseXML); req.indicate(false); } req.timeout = setTimeout( function() { req.indicate(true); var text = req.editField.value; req.JsHttpRequest.getQuery('/ajax_' + jSwhat + '.php?q=' + text); }, 300); } req.addLI = function( value ) { var li = document.createElement( 'LI' ); req.list.appendChild( li ); var editFieldRegexp = new RegExp( '(' + req.editField.value + ')', 'i' ); var highlightedName = value.name.replace( editFieldRegexp, '
$1
' ) var sizeSpan = ''; if (value.size != null) sizeSpan = '' + value.size + ''; else if (value.uname != '') sizeSpan = '(' + value.uname + ')'; li.innerHTML = '
' + highlightedName + '' + sizeSpan + '
'; li.title = value.name; li.onclick = req.clickCallback; // Event.observe(li, 'click', req.clickCallback.bindAsEventListener(li)); if (req.list.runtimeStyle) { // IE fix li.onmouseover = function(){ li.className += ' hover'; } li.onmouseout = function(){ li.className = li.className.replace( /\bhover\b/i, '' ); } } } req.clearList = function() { req.overlapper('visible'); req.indicate(false); if (window.WCH) { WCH.Discard( req.list ); } req.list.style.visibility = 'hidden'; while ( req.list.childNodes.length > 0 ) { req.list.removeChild( req.list.firstChild ); } if ( req.list == req.editField.parentNode.lastChild ) { req.editField.parentNode.removeChild( req.list ); } req.selected = null; } req.fillList = function( jsList ) { req.clearList(); req.list.style.visibility = 'visible'; var root = jsList.documentElement; if (!root) return ; var elems = root.getElementsByTagName('item'); for ( var i = 0; i < elems.length; i++ ) { // document.writeln(elems[i]); req.addLI( { name: elems[i].getAttribute("name"), size: elems[i].getAttribute("value"), uname: elems[i].getAttribute("uname") } ); } if ( req.list.childNodes.length == 0 ) return; req.editField.parentNode.appendChild( req.list ); req.overlapper('hidden'); if (window.WCH) { WCH.Apply( req.list, req.list.parentNode, true ); } return; } req.invite = function() { if (req.editField.value.length) return; var li = document.createElement( 'LI' ); li.appendChild(document.createTextNode(req.invitingText)); req.list.appendChild( li ); req.list.style.visibility = 'visible'; req.editField.parentNode.appendChild( req.list ); req.overlapper('hidden'); if (window.WCH) { WCH.Apply( req.list, req.list.parentNode, true ); } } req.indicate = function(status) { var x = 0; var y = 0; req.indicator.style.position = 'relative'; req.indicator.style.left = x - 24 + 'px'; req.indicator.style.top = y + 2 + 'px'; req.indicator.body.appendChild(req.indicator); if (!status) { req.indicator.body.removeChild(req.indicator); } } req.preventSubmit = function( event ) { if (req.list.childNodes.length == 0) { if (req.list.runtimeStyle) req.submitter.click() return; } if (!event) { event = window.event; event.returnValue = false; event.cancelBubble = true; } else { event.preventDefault(); event.stopPropagation(); } setTimeout( function() { var selectedItem = req.list.childNodes[req.selected]; req.editField.blur(); if (req.submitter == null) return; if ( req.selected === null) { req.submitter.click() } else { selectedItem.click = req.clickCallback; selectedItem.click() } req.submitter.focus() }, 100 ) } req.overlapper = function(value){ if (overlap && req.list.runtimeStyle) { for (var index = 0; index < overlap.length; index++) { get_by_id(overlap[index]).style.visibility = value; } } } return; }