



if (typeof(Wicket) == "undefined")
Wicket = { };
Wicket.ExtensibleChoiceAutocompleteSettings =
{
enterHidesWithNoSelection : false
};

Wicket.Collection=function() {

var lsize = 0;

this.add
= _add;
this.remove
= _remove;
this.isEmpty
= _isEmpty;
this.size
= _size;
this.clear
= _clear;
this.clone
= _clone;

function _add(newItem) {

if (newItem == null)
return;

lsize++;

this[(lsize - 1)] = newItem;
}

function _remove(index) {

if (index < 0 || index > this.length - 1)
return;

this[index] = null;

for (var i = index; i <= lsize; i++)
this[i] = this[i + 1];

lsize--;
}

function _isEmpty() {
return (lsize == 0);
}

function _size() {
return lsize;
}

function _clear() {

for (var i = 0; i < lsize; i++)

this[i] = null;

lsize = 0;
}

function _clone() {

var result = new Wicket.Collection();


for (var i = 0; i < lsize; i++)
result.add(this[i]);
return result;
}
};

Wicket.ExtensibleChoiceAutocomplete=function(elementId, hiddenElementId, noHitsPanelId, choiceName, choiceKeyAttribute, choiceValueAttribute, delayInMilliseconds, autoselectIfOneChoiceOnly, resizeBasedOnChoiceLenth, callbackUrl){
var KEY_TAB
= 9;
var KEY_ENTER
= 13;
var KEY_ESC
= 27;
var KEY_LEFT
= 37;
var KEY_UP
= 38;
var KEY_RIGHT
= 39;
var KEY_DOWN
= 40;
var KEY_SHIFT
= 16;
var KEY_CTRL
= 17;
var KEY_ALT
= 18;
var selected
= -1;

var choiceCount
= 0;

var visible
= 0;

var mouseactive
= 0;

var hidingautocomplete
= 0;

var choicesCollection
= new Wicket.Collection(); 
var componentBlured
= false;
var userSelectedChoice
= false;

var objonkeydown;
var objonblur;
var objonkeyup;
var objonkeypress;
var objonchange;

this.updateChoices=_updateChoices;

function initialize(){

var autocompleteField=wicketGet(elementId);

objonkeydown
= autocompleteField.onkeydown;
objonblur
= autocompleteField.onblur;
objonkeyup
= autocompleteField.onkeyup;
objonkeypress
= autocompleteField.onkeypress;
objonchange
= autocompleteField.onchange;

autocompleteField.onblur=function(event){

componentBlured = true;

if(mouseactive==1)
return false;


if(autoselectIfOneChoiceOnly&&choiceCount==1){
if(timeOutId==0){
selectChoice(getSelectedChoice());
}
}


if(choiceCount!=1&&userSelectedChoice==false){

if(timeOutId==0){

}
}

hideExtensibleChoiceAutocomplete();

hideNoHitsPanel();
}

autocompleteField.onkeydown=function(event){

componentBlured = false;

switch(wicketKeyCode(Wicket.fixEvent(event))){
case KEY_UP:

if(selected>-1)
selected--;

if(selected==-1){
hideExtensibleChoiceAutocomplete();
} else {
styleChoices();
}

if(navigator.appVersion.indexOf('AppleWebKit')>0)
return killEvent(event);
break;
case KEY_DOWN:

if(selected<choiceCount-1){
selected++;
}





styleChoices();
showExtensibleChoiceAutocomplete();


if(navigator.appVersion.indexOf('AppleWebKit')>0)
return killEvent(event);
break;
case KEY_ESC:
hideExtensibleChoiceAutocomplete();
return killEvent(event);
break;
case KEY_TAB:
case KEY_ENTER:

if(selected>-1){

userSelectedChoice = true;
selectChoice(getSelectedChoice());
hideExtensibleChoiceAutocomplete();
hidingAutocomplete=1;
} else if (Wicket.ExtensibleChoiceAutocompleteSettings.enterHidesWithNoSelection == true) {
hideExtensibleChoiceAutocomplete();
hidingAutocomplete=1;
}

if(typeof objonkeydown == "function")
objonkeydown();

if(typeof objonchange == "function")
objonchange();
if(selected>-1){
return killEvent(event);
}
return true;
break;
default:
}
}

autocompleteField.onkeyup=function(event){

componentBlured = false;
switch(wicketKeyCode(Wicket.fixEvent(event))){
case KEY_ENTER:
return killEvent(event);
case KEY_UP:
case KEY_DOWN:
case KEY_ESC:
case KEY_TAB:
case KEY_RIGHT:
case KEY_LEFT:
case KEY_SHIFT:
case KEY_ALT:
case KEY_CTRL:
break;
default:

callUpdateChoices();

hideNoHitsPanel();
}
if(typeof objonkeyup == "function")objonkeyup();
return null;
}

autocompleteField.onkeypress=function(event){

componentBlured = false;
switch(wicketKeyCode(Wicket.fixEvent(event))){
case KEY_ENTER:
if(selected>-1 || hidingAutocomplete==1){
hidingAutocomplete=0;
return killEvent(event);
}
case KEY_TAB:






break;
}
if(typeof objonkeypress == "function")objonkeypress();
}
return this;
}

function clearFieldValues(){
var autocompleteField
= wicketGet(elementId);
var autocompleteHidden
= null;

if(hiddenElementId!='')
autocompleteHidden = wicketGet(hiddenElementId);

autocompleteField.value = "";

if(autocompleteHidden){

if(autocompleteHidden.tagName.toLowerCase()=="input")
autocompleteHidden.value
= "";
else
autocompleteHidden.innerHTML
= "";


autocompleteHidden.onchange();
}
}

function getMenuId() {
return elementId+"-extensible-autocomplete";
}

function getAutocompleteMenu() {
var choiceDiv = document.getElementById(getMenuId());
if (choiceDiv == null) {
choiceDiv = document.createElement("div");
document.body.appendChild(choiceDiv);
choiceDiv.id = getMenuId();
choiceDiv.className = "wicket-eca";
choiceDiv.style.display = "none";
choiceDiv.style.position = "absolute";
choiceDiv.style.zIndex = "10000";
}
choiceDiv.show = function() { wicketShow(this.id) }
choiceDiv.hide = function() { wicketHide(this.id) }
return choiceDiv;
}

function killEvent(event){
if(!event)event=window.event;
if(!event)return false;
if(event.cancelBubble!=null){
event.cancelBubble=true;
}
if(event.returnValue){
event.returnValue=false;
}
if(event.stopPropagation){
event.stopPropagation();
}
if(event.preventDefault){
event.preventDefault();
}
return false;
}
var timeOutId
= 0;
var lastValue
= "";

function callUpdateChoices(){

resetHiddenField();

userSelectedChoice = false;

var value = wicketGet(elementId).value;
value = value.replace(" ", "");

if(value.length>2){
lastValue
= value;

if(timeOutId!=0){
window.clearTimeout(timeOutId);
timeOutId = 0;
}

timeOutId
= window.setTimeout(elementId+"_eca_prototype.updateChoices()", delayInMilliseconds);
} else {
hideExtensibleChoiceAutocomplete();
}
}

function _updateChoices(){
window.clearTimeout(timeOutId);
timeOutId = 0;
selected=-1;
var value = wicketGet(elementId).value;
var request = new Wicket.Ajax.Request(callbackUrl+"&q="+processValue(value), doUpdateExtensibleChoices, false, true, false, "wicket-extensible-autocomplete|d");
request.get();
}
function processValue(param) {
return (encodeURIComponent)?encodeURIComponent(param):escape(param);
}

function showExtensibleChoiceAutocomplete(){
var position=getPosition(wicketGet(elementId));
var menu = getAutocompleteMenu();
var input=wicketGet(elementId);
menu.show();
menu.style.left=position[0]+'px'
menu.style.top=(input.offsetHeight+position[1])+'px';

if(!resizeBasedOnChoiceLenth)
menu.style.width=input.offsetWidth+'px';
menu.style.width=input.offsetWidth+'px';
visible=1;
hideShowCovered();
wicketHide('feedback');
}

function hideExtensibleChoiceAutocomplete(){
hidingAutocomplete=1;
visible=0;
selected=-1;
getAutocompleteMenu().hide();
hideShowCovered();
}

function getPosition(element) {
var leftPosition=0;
var topPosition=0;
do {
topPosition += element.offsetTop
|| 0;
leftPosition += element.offsetLeft || 0;
element = element.offsetParent;
} while (element);
return [leftPosition,topPosition];
}

function doUpdateExtensibleChoices(response){

userSelectedChoice = false;

var menu = getAutocompleteMenu();

menu.innerHTML=response;

loadChoices();

var choices = getChoices();

if(choices) {

for(var i=0;i<choiceCount;i++){

var choice=choices[i];

choice.onclick = function(event){
userSelectedChoice = true;

selectChoice(this);

if(typeof objonchange == "function")objonchange();

hideExtensibleChoiceAutocomplete();
}

choice.onmouseover = function(event){

mouseactive=1;

selected = getElementIndex(this);

styleChoices();

showExtensibleChoiceAutocomplete();
}

choice.onmouseout = function(event){

mouseactive=0;
}
}
} else {

choiceCount=0;
}


if(componentBlured){


if(autoselectIfOneChoiceOnly&&choiceCount==1){
selectChoice(getSelectedChoice());
hideExtensibleChoiceAutocomplete();
return;
}else{

clearFieldValues();
hideExtensibleChoiceAutocomplete();
return;
}
}

if(choiceCount>0){
showExtensibleChoiceAutocomplete();
} else {
if (wicketGet(elementId).value.length>2)
showNoHitsPanel();
hideExtensibleChoiceAutocomplete();
}

styleChoices();
}

function getChoices(){

if (/msie/i.test(navigator.userAgent))
return choicesCollection;

return document.getElementsByName(choiceName);
}

function loadChoices(){

var choices = document.getElementsByName(choiceName);

if (/msie/i.test(navigator.userAgent)) {

choices = getAutocompleteMenu().all;

var size = choices.length?choices.length:0;

if(choicesCollection.size()>0)

choicesCollection.clear();

for(var i=0;i<size;i++)

if(choices[i].name==choiceName)

choicesCollection.add(choices[i]);

choiceCount = choicesCollection.size();
}else{

choiceCount = choices.length;
}
}

function getSelectedChoice(){

var choices = getChoices();


if(choiceCount==1){

return choices[0];
}

if(selected>-1){

return choices[selected];
}

return null;
}

function selectChoice(choice){

var autocompleteField
= wicketGet(elementId);
var autocompleteHidden
= null;

if(choice==null)
return;

if(hiddenElementId!='')
autocompleteHidden = document.getElementById(hiddenElementId);


var keyAttribute
= choice.attributes[choiceKeyAttribute];

var valueAttribute
= choice.attributes[choiceValueAttribute];


var choiceKey
var choiceValue;

if (valueAttribute==undefined)


choiceValue = stripHTML(choice.innerHTML);
else

choiceValue = valueAttribute.value;

if(keyAttribute==undefined){

var cb= choice.outerHTML;
var cb1 = cb.split('eca_key=');
var cb2 = cb1[1].split('"');
choiceKey = cb2[1];
}else{
choiceKey
= keyAttribute.value;
}

autocompleteField.value = choiceValue;

if(autocompleteHidden){

if(autocompleteHidden.tagName.toLowerCase()=="input")
autocompleteHidden.value
= choiceKey;
else
autocompleteHidden.innerHTML
= getAsHTML(choiceKey);
try {
autocompleteHidden.onchange();
} catch (e) {  };
}
}

function getElementIndex(choice) {

var choices = getChoices();

for(var i=0;i<choiceCount;i++)

if(choices[i]==choice)

return i;

return -1;
}

function stripHTML(str) {
return str.replace(/<[^>]+>/g,"");
}

function getAsHTML(str) {
var result = str;
result = result.replace("&lt;", "<");
result = result.replace("&gt;", ">");
return result;
}

function styleChoices(){

var choices = getChoices();

if(!choices) return;

for(var i=0;i<choiceCount;i++){

var choice=choices[i];

var classNames = null;

if(choice.className!=undefined)

classNames = choice.className.split(" ");
else
classNames = new String[0];

for (var j=0; j<classNames.length; j++) {

if (classNames[j] == 'selected') {
classNames[j] = '';
}
}

if(selected==i){
classNames.push('selected');
}

choice.className = classNames.join(" ");
}
}

function isVisible(element) {
var value = element.style.visibility;
if (!value) {
if (document.defaultView && typeof(document.defaultView.getComputedStyle)=="function") {
value = document.defaultView.getComputedStyle(element,"").getPropertyValue("visibility");
} else if (element.currentStyle) {
value = element.currentStyle.visibility;
} else {
value = '';
}
}
return value;
}

function hideShowCovered(){
if (!/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent)) {
return;
}

if(navigator.userAgent.indexOf("MSIE 7.")>0){
return;
}
var menu
= getAutocompleteMenu();
var point
= getPosition(menu);
var acLeftX
= point[0];
var acRightX
= menu.offsetWidth+acLeftX;
var acTopY
= point[1];
var acBottomY
= menu.offsetHeight+acTopY;
var hideTags
= new Array("select","iframe","applet");

for (var j=0;j<hideTags.length;j++) {

var tagsFound = document.getElementsByTagName(hideTags[j]);
for (var i=0; i<tagsFound.length; i++){
var tag
= tagsFound[i];
point
= getPosition(tag);
var leftX
= point[0];
var rightX
= leftX+tag.offsetWidth;
var topY
= point[1];
var bottomY = topY+tag.offsetHeight;
if (this.hidden || (leftX>acRightX) || (rightX<acLeftX) || (topY>acBottomY) || (bottomY<acTopY)) {
if(!tag.wicket_element_visibility) {
tag.wicket_element_visibility=isVisible(tag);
}
tag.style.visibility = visible==1?"hidden":"visible";
} else {
if (!tag.wicket_element_visibility) {
tag.wicket_element_visibility=isVisible(tag);
}
tag.style.visibility = visible==1?"hidden":"visible";
}
}
}
}
function getPositionIeFix(element) {
var leftPosition=0;
var topPosition=0;
var elementselector= "#"+element.id;

topPosition += $(elementselector).position().top;
leftPosition += $(elementselector).position().left;
element = element.offsetParent;
return [leftPosition,topPosition];
}
function showNoHitsPanel() {

var input=wicketGet(elementId); 
var position=getPositionIeFix(input); 
var panel = wicketGet(noHitsPanelId); 
panel.style.position = 'absolute';
panel.style['zIndex'] = '10000';
panel.style.left = '0px';
panel.style.top = '0px';



wicketHide('feedback');
wicketShow(noHitsPanelId);
}
function hideNoHitsPanel() {
wicketHide(noHitsPanelId);
}
function resetHiddenField() {
wicketGet(hiddenElementId).value="";
}

initialize();
}