﻿var timer = null;
var activeTextbox = null;
var result_json = null;
var resultpane = null;
var selected = -1;
var selected_json = [];
var selected_hash = [];
var lastsearch = "";
var checkback_function = null;

function setCheckback(cbfunc) {
    checkback_function = cbfunc;
}

function checkClick(txtfld, buttonName, e)
{
    var key;
    if (activeTextbox != txtfld)
    {
        clearResults();
        activeTextbox = txtfld;
    }

     if(window.event)
     {
          key = window.event.keyCode;     //IE
     }
     else
     {
          key = e.which;     //firefox
     }

	if (txtfld.value.length > 2 && key != simpliciKey.ENTER && !(simpliciKey.checkKey(key, simpliciKey.SPECIAL)))
    {
        var resultpane_array = getElementsByClass("autocomplete");
    	clearTimeout(timer);
	    timer = setTimeout(function(){doClick(buttonName);}, 200);
	    return true;
    }
	return false;
}
function doClick(buttonName)
{
    //Get the button the user wants to have clicked
    var btn = document.getElementById(buttonName);
    if (btn != null && activeTextbox.value.length > 2 && lastsearch != activeTextbox.value)
    { //If we find the button click it
    	lastsearch = activeTextbox.value;
        toggleThinking(1);
        btn.click();
        event.keyCode = 0
    }
}
function moveThinkingMsg(msgobj)
{
    setPosition(msgobj, 0, 0);
 	var tbpos_array = findPos(activeTextbox);
   	var respos_array = findPos(msgobj);
    setPosition(msgobj, tbpos_array[0]-respos_array[0], 20+tbpos_array[1]-respos_array[1]);
}
function moveResults()
{
	var resultpane_array = getElementsByClass("autocomplete");
    if (resultpane_array.length == 1)
    {
        resultpane = resultpane_array[0];
     	var tbpos_array = findPos(activeTextbox);
       	var respos_array = findPos(resultpane);
        setPosition(resultpane, tbpos_array[0]-respos_array[0], 22+tbpos_array[1]-respos_array[1]);
    }
}
function resultsVisible()
{
	if (resultpane) {
		if (resultpane.style.display != 'none') {
			return true;
		}
	}
	return false;
}
function toggleThinking(towhat)
{
    var classNames = ' ' + activeTextbox.className + ' ';
    var thinkingmsg = $('thinkingmsg');
//    if (classNames.indexOf(' thinking ') > -1)
	if (towhat == 0)
    {
        classNames = classNames.replace(/thinking /, '');
        moveResults();
        thinkingmsg.style.display = 'none';
    }
    else
    {
        classNames = 'thinking ' + classNames;
        thinkingmsg.style.display = 'inline';
        moveThinkingMsg(thinkingmsg);
    }
    classNames = trimAll(classNames);
    activeTextbox.className = classNames;
}
function trimAll(sString)
{
    while (sString.substring(0,1) == ' ')
    {
        sString = sString.substring(1, sString.length);
    }
    while (sString.substring(sString.length-1, sString.length) == ' ')
    {
    sString = sString.substring(0,sString.length-1);
    }
    return sString;
}
// Arrow keys movement
function getResultsList() {
    var listResults = $('cityresults');
    return(listResults.getElementsByTagName('li'));
}
function showSelected() {
    var results = getResultsList();
    if (selected >= results.length) { selected = -1; }
    else if (selected < -1) { selected = results.length - 1; }
    for(i = 0; i < results.length; i++) {
        if (selected == i) {
            results[i].className = 'selected';
        }
        else {
            results[i].className = '';
        }
    }
    if (selected == -1) {
        activeTextbox.focus();
    }
}
function selectResult(idx, buttonToPush) {
    activeTextbox.className = 'complete';
    activeTextbox.value = result_json[idx].cityname;
    clearResults();
    selected_json[keyToIndex(activeTextbox.id, selected_hash)] = result_json[idx];
    checkback_function(selected_json, selected_hash);
}
function getJSONResponse(strJSON) {
    result_json = eval(strJSON);
    if (result_json.length == 1) {
        selectResult(0);
    }
}

// SimpliciKey callbacks
function clearResults(keynum) {
    if (resultsVisible()) {
        resultpane.style.display = 'none';
        resultpane = null;
        selected = -1;
    }
}
function navResults(keyval) {
	if (resultsVisible()) {
	    selected += keyval;
    	showSelected();
    }
}
function enterResults(keynum) {
    if (resultsVisible()) {
		if (selected > -1) {
			selectResult(selected);
		}
		else {
		    selectResult(0);
		}
    }
}

// Helper functions (possibly should be split into common.js
function keyToIndex(k, trans_array) {
    for (trani = 0; trani < trans_array.length; trani++) {
        if (trans_array[trani] == k) {
            return trani;
        }
    }
    trans_array[trani] = k;
    return trani;
}

function findPos(obj) {
	var curleft = curtop = 0;
	
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	
	return [curleft,curtop];
}
function setPosition(obj, x, y)
{
    obj.style.left = "" + x + "px";
    obj.style.top = "" + y + "px";
}
function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp('(^|\\s)'+searchClass+'(\\s|$)');
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}