﻿var agent=navigator.userAgent.toLowerCase();
var isOpera = (agent.indexOf("opera") != -1);

var appVer = navigator.appVersion.toLowerCase();
var isSafari = ((agent.indexOf('safari')!=-1)&&(agent.indexOf('mac')!=-1))?true:false;
var isKonq = false;

var kqPos   = agent.indexOf('konqueror');
var isMinor = parseFloat(appVer);
var isMajor = parseInt(isMinor);
if (kqPos !=-1) {
	isKonq  = true;
	isMinor = parseFloat(agent.substring(kqPos+10,agent.indexOf(';',kqPos)));
	isMajor = parseInt(isMinor);
}
var isKHtml  = (isSafari || isKonq);
var iePos  = appVer.indexOf('msie');
var isIE   = ((iePos!=-1) && (!isOpera) && (!isKHtml));
var isIE6up = (isIE && isMinor >= 6);
var isWindows   = ( (agent.indexOf("win")!=-1) || (agent.indexOf("16bit")!=-1) );
var isMac	= (agent.indexOf("mac")!=-1);
if (isMac) { 
	isWindows = false;
}

var preferredDelimiter = "";

var BACKSPACE = 8;
var TAB = 9;
var ENTER = 13;
var ESC = 27;
var LEFTARROW = 37;
var UPARROW = 38;
var RIGHTARROW = 39;
var DOWNARROW = 40;

function DynamicComboBox (sToFormField, sResultsPopup, DynamicComboBoxItems, bAutoPostBack, sSelectedValue) {

    this.DynamicComboBoxItems   = DynamicComboBoxItems;
    this.toFormField = document.getElementById(sToFormField);
    this.toSelectedValue = document.getElementById(sSelectedValue);
    this.resultsPopup = document.getElementById(sResultsPopup);
    this.autoPostBack   = bAutoPostBack;
    //this.em = document.getElementById("Text1");
    
    //this.em.value   = "INIT:\r\n";
    if(this.DynamicComboBoxItems.length>0){
        var aMatch  = false;
        for(index = 0; index < this.DynamicComboBoxItems.length; index++){
            if(this.DynamicComboBoxItems[index].getDataTextField() == this.toFormField.value){
                aMatch  = true;
                this.toFormField.value  = this.DynamicComboBoxItems[index].getDataTextDisplayField();
            }
        }
        if((!aMatch)||this.toSelectedValue.value == ""){
            
            //this.toFormField.value  = this.DynamicComboBoxItems[0].getDataTextDisplayField();
        }
        this.SELECTED_INDEX = 0;
        this.regainFocus = false;
        
        this.onBlur = _ComboBoxonBlur;
        this.onToMouseDown  = _ComboBoxonToMouseDown;
        this.onMouseDown    = _ComboBoxonMouseDown;
        this.onMouseUp  = _ComboBoxonMouseUp;
        this.onMouseOver    = _ComboBoxonMouseOver;
        this.onMouseOut = _ComboBoxonMouseOut;
        this.onKeyDown  = _ComboBoxonKeyDown;
        this.onKeyPress = _ComboBoxonKeyPress;
        this.onKeyUp    = _ComboBoxonKeyUp;
        this.cancelEvent    = _ComboBoxcancelEvent;
        this.getSelectedItem    = _ComboBoxgetSelectedItem;
        this.commit = _ComboBoxcommit;
        this.commitAndExit  = _ComboBoxcommitAndExit;
        this.parseSearchTerm    = _ComboBoxparseSearchTerm;
        this.overwriteSearchTerm    = _ComboBoxoverwriteSearchTerm;
        this.findSearchTermStart    = _ComboBoxfindSearchTermStart;
        this.selectNextContact  = _ComboBoxselectNextContact;
        this.selectPreviousContact  = _ComboBoxselectPreviousContact;
        this.hasClass   = _ComboBoxhasClass;
        this.removeClass    = _ComboBoxremoveClass;
        this.addClass   = _ComboBoxaddClass;
        this.swapClass  = _ComboBoxswapClass;
        this.searchDynamicComboBoxItems = _ComboBoxsearchDynamicComboBoxItems;
        this.hideResultsPopup   = _ComboBoxhideResultsPopup;
        this.isResultsPopupVisible  = _ComboBoxisResultsPopupVisible;
        this.showResultsPopup   = _ComboBoxshowResultsPopup;
        this.getResultsPopupWidth   = _ComboBoxgetResultsPopupWidth;
        this.findResultsPopupWidth  = _ComboBoxfindResultsPopupWidth;
        this.trimLeft   = _ComboBoxtrimLeft;
        this.isBlank    = _ComboBoxisBlank;
	    if(this.toFormField) {
	        this.toFormField.DynamicComboBox    = this;
		    this.toFormField.onkeydown = this.onKeyDown;
		    this.toFormField.onkeypress = this.onKeyPress;
		    this.toFormField.onkeyup = this.onKeyUp;
		    this.toFormField.onblur = this.onBlur;
		    this.toFormField.onmouseup = this.onToMouseDown;
	    }
	}
	this.resultsPopup.style.visibility = "hidden";	
}
function _ComboBoxgetDynamicComboBoxInstance(toFormField, resultsPopup, DynamicComboBoxItems) {
    //this.em.value   = "getDynamicComboBoxInstance";
	return new _DynamicComboBox(toFormField, resultsPopup, DynamicComboBoxItems);
}
function _ComboBoxonBlur (evnt) {
	var DynamicComboBox = this.DynamicComboBox;
	if (DynamicComboBox.regainFocus) {
		DynamicComboBox.commit();
		DynamicComboBox.regainFocus = false;
	}
	else {
		DynamicComboBox.hideResultsPopup();
		DynamicComboBox.commitAndExit();
		if(DynamicComboBox.autoPostBack==true){		
		    //WebForm_OnSubmit();
		    theForm.submit();   
		}
	}
}

function _ComboBoxonToMouseDown(evnt) {

	var DynamicComboBox = this.DynamicComboBox;
	DynamicComboBox.toFormField.select();
	//DynamicComboBox.em.value    += "onToMouseDown\r\n";
	this.focus();
	return true;
}

function _ComboBoxonMouseDown (evnt) {
    
	var DynamicComboBox = this.DynamicComboBox;
	//DynamicComboBox.em.value    += "onMouseDown\r\n";
	DynamicComboBox.regainFocus = true;
}

function _ComboBoxonMouseUp (evnt) {
   
	var DynamicComboBox = this.DynamicComboBox;
	DynamicComboBox.toFormField.select();
	//DynamicComboBox.em.value    += "onMouseUp\r\n";
	var children = DynamicComboBox.resultsPopup.childNodes;
	for (i=0; i<children.length; ++i) {
		if (this == children[i]) {
			DynamicComboBox.SELECTED_INDEX = i;
			break;
		}
	}
	DynamicComboBox.commit();
	DynamicComboBox.hideResultsPopup();
}

function _ComboBoxonMouseOver (evnt) {
	
	var DynamicComboBox = this.DynamicComboBox;
	//DynamicComboBox.em.value    += "onMouseOver\r\n";
	if (!DynamicComboBox.hasClass(this, "ItemResultsHighlight")) {
		DynamicComboBox.swapClass(this, "ItemResultsHide", "ItemResultsHighlight");
	}
}

function _ComboBoxonMouseOut (evnt) {
	
	var DynamicComboBox = this.DynamicComboBox;
	//DynamicComboBox.em.value    += "onMouseOut\r\n";
	if (DynamicComboBox.hasClass(this, "ItemResultsHighlight")) {
		DynamicComboBox.swapClass(this, "ItemResultsHighlight", "ItemResultsHide");
	}
}

function _ComboBoxonKeyDown (evnt) {
    
	var DynamicComboBox = this.DynamicComboBox;
	//DynamicComboBox.em.value    = "onKeyDown\r\n";
	if (!evnt) evnt = window.event;
	var keyCode = evnt.keyCode;
	switch(keyCode) {
		case ESC:
		    DynamicComboBox.commit();
			DynamicComboBox.hideResultsPopup();
			DynamicComboBox.cancelEvent(evnt);
			return true;
		case TAB:
		    //DynamicComboBox.commitAndExit();
			//DynamicComboBox.hideResultsPopup();
			//DynamicComboBox.cancelEvent(evnt);
			return;
		case ENTER:
		    DynamicComboBox.commit();
			DynamicComboBox.hideResultsPopup();
			DynamicComboBox.cancelEvent(evnt);
			/*if (DynamicComboBox.isResultsPopupVisible()) DynamicComboBox.cancelEvent(evnt);*/
			return true;
	}
	return true;
}

function _ComboBoxonKeyPress (evnt) {
	var DynamicComboBox = this.DynamicComboBox;
	//DynamicComboBox.em.value    += "onKeyPress\r\n";
	if (!evnt) {
		evnt = window.event;
	}
	var keyCode = evnt.keyCode;
	switch(keyCode) {
		case LEFTARROW:
		case RIGHTARROW:
			DynamicComboBox.hideResultsPopup();
			return;
		case ESC:
			DynamicComboBox.hideResultsPopup();
			DynamicComboBox.cancelEvent(evnt); // else box reappears
			return;
		case UPARROW:
		    return;
		case DOWNARROW:
		    return;
		case TAB:
		    //window.alert("Press");
		    return;
		case ENTER:
			if (DynamicComboBox.isResultsPopupVisible()) DynamicComboBox.cancelEvent(evnt);
			return true;
	}
	return true;
}

function _ComboBoxonKeyUp (evnt) {
    
	var DynamicComboBox = this.DynamicComboBox;
	//DynamicComboBox.em.value    += "onKeyUp\r\n";
	if (!evnt) {
		evnt = window.event;
	}
	var keyCode = evnt.keyCode;
	switch(keyCode) {
		case LEFTARROW:
		    DynamicComboBox.commit();
			DynamicComboBox.hideResultsPopup();
			DynamicComboBox.cancelEvent(evnt);
			return;			
		case RIGHTARROW:
			DynamicComboBox.commit();
			DynamicComboBox.hideResultsPopup();
			DynamicComboBox.cancelEvent(evnt);
			return;
		case ESC:
			DynamicComboBox.commit();
			DynamicComboBox.hideResultsPopup();
			DynamicComboBox.cancelEvent(evnt);
			return;
		case UPARROW:
			DynamicComboBox.selectPreviousContact();
			DynamicComboBox.cancelEvent(evnt);
			return;
		case DOWNARROW:
			DynamicComboBox.selectNextContact();
			DynamicComboBox.cancelEvent(evnt);
			return;
		case TAB:
		    //window.alert("Up");
		    //DynamicComboBox.commit();
			//DynamicComboBox.hideResultsPopup();
			//DynamicComboBox.cancelEvent(evnt);
		    return;
		case ENTER:			
			DynamicComboBox.commit();
			DynamicComboBox.hideResultsPopup();
			DynamicComboBox.cancelEvent(evnt);			
			return;
		default:
		var searchTerm = DynamicComboBox.parseSearchTerm(DynamicComboBox.toFormField);
	    var escapeNonAlphaNum1 = /[\n\r]/gi;
	    searchTerm = searchTerm.replace(escapeNonAlphaNum1,"");
	    /*
	    if(""==searchTerm.toString()) {
	        DynamicComboBox.hideResultsPopup();
	    }
	    */
	    DynamicComboBox.searchDynamicComboBoxItems(searchTerm);
	    return;
	}
	
}

function _ComboBoxcancelEvent (evnt) {	
	evnt.returnValue = false;
	if (evnt.preventDefault) evnt.preventDefault();
}

function _ComboBoxgetSelectedItem () {
       return this.resultsPopup.childNodes[this.SELECTED_INDEX];
}

function _ComboBoxcommit () {
    var selectedItem = this.getSelectedItem();
    var newChunk    = "";
    if(selectedItem){
	    //newChunk = selectedItem.value + preferredDelimiter;
	    newChunk = this.DynamicComboBoxItems[selectedItem.index].getDataTextDisplayField();
	    //alert(this.DynamicComboBoxItems[selectedItem.index].getDataTextDisplayField());
	    //alert(newChunk);
	    this.toFormField.value    = selectedItem.valueID;
	}else{
	    newChunk    = this.DynamicComboBoxItems[0].getDataTextDisplayField();
	    this.toFormField.value    = this.DynamicComboBoxItems[0].getDataValueField()
	}
	this.overwriteSearchTerm(this.toFormField, newChunk);
	this.toFormField.focus();
	this.toSelectedValue.value = this.toFormField.value;
	this.toFormField.scrollTop = this.toFormField.scrollHeight;
}
function _ComboBoxcommitAndExit () {
    //alert(this.toFormField.value);
    if(this.toFormField.value == ""){
        this.toSelectedValue.value = this.toFormField.value;
    }else{
        var selectedItem = this.getSelectedItem();
        var newChunk    = "";
        if(selectedItem){
	        newChunk = this.DynamicComboBoxItems[selectedItem.index].getDataTextDisplayField();
	        //this.selectedText.value    = selectedItem.valueID;
	        this.overwriteSearchTerm(this.toFormField, newChunk)
	    }else{
	        //newChunk    = this.DynamicComboBoxItems[0].getDataTextDisplayField();
	        //newChunk    = this.DynamicComboBoxItems[0].getDataTextDisplayField();
	        //this.selectedText.value    = this.DynamicComboBoxItems[0].getDataValueField()
	    }
    	
	    this.toSelectedValue.value = this.toFormField.value;
	}
	//alert(this.toSelectedValue.value);
	//this.overwriteSearchTerm(this.toFormField, newChunk);
	
}
function _ComboBoxparseSearchTerm (element) {
	
	if (!element)
	{
		return;
	}
	var val = element.value;
	var searchTermStart = this.findSearchTermStart(val);
	if (-1 == searchTermStart) return this.trimLeft(val);
	var newVal = val.substring(searchTermStart + 1, val.length);
	return this.trimLeft(newVal);
}

function _ComboBoxoverwriteSearchTerm (element, newChunk) {
	
	if (!element) return;
	element.value   = newChunk;
	/*
	var oldVal = element.value;
	var searchTermStart = this.findSearchTermStart(oldVal);
	if (-1 == searchTermStart || (oldVal.lastIndexOf("\n")==searchTermStart)) {
		element.value = oldVal.substring(0, searchTermStart + 1) + newChunk;
	} else { // if delimeter is not carriage return add space before the mail id
		element.value = oldVal.substring(0, searchTermStart + 1 ) +" "+ newChunk;
	}
	*/
}

function _ComboBoxfindSearchTermStart (val) {
	
	if (!val) return -1;
	var commaindex = val.lastIndexOf(",");
	var semicolonindex = val.lastIndexOf(";");
	var enterindex = val.lastIndexOf("\n");
	if (-1 == commaindex && -1 == semicolonindex && -1==enterindex) return -1;
	if(commaindex > semicolonindex & commaindex > enterindex) {
		return commaindex;
	} else if(semicolonindex > enterindex) {
		return semicolonindex;
	} else {
		return enterindex;
	}
}

function _ComboBoxselectPreviousContact () {
	if (!this.isResultsPopupVisible()) return;
	var curIdx = this.SELECTED_INDEX;
	if (curIdx - 1 >= 0) {
		this.swapClass(this.resultsPopup.childNodes[curIdx], "ItemResultsHighlight", "ItemResultsHide");
		this.swapClass(this.resultsPopup.childNodes[curIdx - 1], "ItemResultsHide", "ItemResultsHighlight");
		this.SELECTED_INDEX = curIdx - 1;
	}
}

function _ComboBoxselectNextContact () {
	if (!this.isResultsPopupVisible()) return;
	// subtract to force moz JS impl to cast int
	var curIdx = this.SELECTED_INDEX - 0;
	if (curIdx + 1 < this.resultsPopup.childNodes.length) {
		this.swapClass(this.resultsPopup.childNodes[curIdx], "ItemResultsHighlight", "ItemResultsHide");
		this.swapClass(this.resultsPopup.childNodes[curIdx + 1], "ItemResultsHide", "ItemResultsHighlight");
		this.SELECTED_INDEX = curIdx + 1;
	}
}

function _ComboBoxhasClass (element, className) {
	
	if (!element) return;
	return element.className.indexOf(className) != -1;
}

function _ComboBoxswapClass (element, oldClass, newClass) {

	if (!element) return;
	this.removeClass(element, oldClass);
	this.addClass(element, newClass);
}

function _ComboBoxremoveClass (element, oldClass) {
	
	
	if (!element) return;
	var idx = element.className.indexOf(oldClass);
	if (-1 == idx) return;
	element.className = element.className.substring(0, idx)
						+ element.className.substring(idx + oldClass.length + 1);
}

function _ComboBoxaddClass (element, newClass) {
	

	if (element && -1 == element.className.indexOf(newClass)) {
		element.className = element.className + " " + newClass;
	}
}

function _ComboBoxsearchDynamicComboBoxItems (searchTerm) {
	var searchTerm = searchTerm.toLowerCase();
	
	while (this.resultsPopup.hasChildNodes()) {
		this.resultsPopup.removeChild(this.resultsPopup.childNodes[0]);
	}
	var nextContact = null;
	var matchFound = false;
	var matchesFound = 0;
	var matchDATATEXTFIELD = false;
	var matchDATATEXTFIELD2 = false;
	var searchTermLength = searchTerm.length;
	
	for(index = 0; index < this.DynamicComboBoxItems.length; index++) {
    	nextContact = this.DynamicComboBoxItems[index];
		matchFound = false;
		matchDATATEXTFIELD = false;
		matchDATATEXTFIELD2 = false;
		
		if(nextContact.compareTo(searchTerm, nextContact.SEARCH_DATATEXTFIELD) == 0) {
			matchFound = true;
			matchDATATEXTFIELD = true;
		}
		
		if(nextContact.compareTo(searchTerm, nextContact.SEARCH_DATATEXTFIELD2) == 0) {
			matchFound = true;
			matchDATATEXTFIELD2 = true;
		}
		
		
		if(matchFound) {
			matchesFound++;
			var item = window.document.createElement("div");

			var itemWidth = this.getResultsPopupWidth() - 4; // align right edges of itemlist & addrbox
			//item.style.width = itemWidth + "px";
			
			if (  !isSafari  ) {
			    item.DynamicComboBox    = this;
			    item.valueID    = nextContact.getDataTextField();
			    item.index  = index;
				item.onmousedown = this.onMouseDown;
				item.onmouseup = this.onMouseUp;
				item.onmouseover = this.onMouseOver;
				item.onmouseout = this.onMouseOut;
			} else if (isWindows && !isIE6up) {
				item.style.cursor = 'hand';
			} else {
				item.style.cursor = 'pointer';
			}
			var label = "";
			
			label = "<nobr>";
		    label += nextContact.getHighlightedText(searchTermLength, matchDATATEXTFIELD, matchDATATEXTFIELD2);
			label += "</nobr>";
			/*
			label += nextContact.getDataTextDisplayField(searchTermLength, DynamicComboBoxItem.SEARCH_DATATEXTFIELD);
			
			if(nextContact.getMatch(DynamicComboBoxItem.SEARCH_DATATEXTFIELD)) {
				label = "<nobr>";
				label += nextContact.getDataTextDisplayField(searchTermLength, DynamicComboBoxItem.SEARCH_DATATEXTFIELD);
				label += "</nobr>";
			} else {
				label = "<nobr>";
				label += nextContact.getDataTextDisplayField(searchTermLength, DynamicComboBoxItem.SEARCH_DATATEXTFIELD);
				label += "</nobr>";
			}*/
			item.innerHTML = label;
			
			
			
			if (matchesFound == 1) {
			    //this.em.value    += "Highlight";
				item.className = "ItemResultsHighlight";
				this.SELECTED_INDEX = 0;
			} 
			else {
				item.className = "ItemResultsHide";
			}
			//item.value = "'"+nextContact.getDataTextDisplayField()+"'";
			this.resultsPopup.appendChild(item);
		}
	}
   if(matchesFound > 0) {
		this.showResultsPopup();
	} else {
		this.hideResultsPopup();
	}
}

function _ComboBoxisResultsPopupVisible () {
	

	return "visible" == this.resultsPopup.style.visibility;
}

function _ComboBoxhideResultsPopup () {
	this.resultsPopup.style.visibility = "hidden";
}

function _ComboBoxshowResultsPopup () {
	

	if (!(isMac && isIE)) {
		if ("hidden" == this.resultsPopup.style.visibility) {
			this.resultsPopup.style.visibility = "visible";
		}
	}
}

function _ComboBoxgetResultsPopupWidth () {

	var resultsPopupWidth = this.findResultsPopupWidth(this.resultsPopup);
	var toFormFieldWidth = this.findResultsPopupWidth(this.toFormField);
	if (toFormFieldWidth > resultsPopupWidth) {
		resultsPopupWidth = toFormFieldWidth;
	}
	return resultsPopupWidth;
}

function _ComboBoxfindResultsPopupWidth (obj) {
	

	if (obj.offsetWidth) {
		return obj.offsetWidth;
	} else if (obj.width) { // Netscape 4.x
		return obj.width;
	}
}

function _ComboBoxtrimLeft (val) {
	

	var len = val.length;
	var split = 0;
	for (i=0; i<len; i++) {
		if (val.charAt(i) != ' ') {
			split = i;
			break;
		}
	}
	return val.substring(split, len);
}

function _ComboBoxisBlank (val) {
	

	if (0 == val.length) return true;
	for (i=0; i<val.length; i++) {
		if (val.charAt(i) != ' ') {
			return false;
		}
	}
	return true;
}