﻿/// <reference path="jquery/jquery-1.3.2.js" />

var SEARCH_CHAR_COUNT = 3;

var currentRowIndex = -1;
var upArrow = 38;
var downArrow = 40;
var enterKey = 13;
var tabKey = 9;

$.fn.airportComboBox = function(options) {
    var resultsPanel = null;
    var focus = false;

    this
    .keyup(function(evt) {
        var txtBox = $(this)[0];

        if (txtBox.tagName == 'INPUT'
			&& txtBox.type == 'text'
			&& $(txtBox).val().length > SEARCH_CHAR_COUNT - 1) {

            var keyCode = getkeyCode(evt);

            if (keyCode == upArrow || keyCode == downArrow || keyCode == enterKey) {
                handleArrowKeys($(txtBox), keyCode);
                evt.stopPropagation();
                return;
            }

            var args = '{searchTerm:\'' + $(txtBox).val() + '\'}';

            if (resultsPanel)
                $(resultsPanel).empty();

            $.ajax({
                type: 'POST'
				, url: '/airportsearch.asmx/FindAirport'
				, contentType: 'application/json; charset=utf-8'
				, dataType: 'json'
				, data: args
				, success: function(data, status) {
				    populateAirports($(txtBox), data);
				}
				, error: function(xmlHttpRequest, status, err) {
				    alert('err: ' + err);
				}
            });
        }
        else if ($(this).val().length < SEARCH_CHAR_COUNT) {
            if (resultsPanel)
                resultsPanel.css("display", "none");
        }
    })
    .keydown(function(evt) {
        var txtBox = $(this)[0];
        if (txtBox.tagName == 'INPUT'
			&& txtBox.type == 'text') {

            var keyCode = getkeyCode(evt);

            if (keyCode == tabKey) {
                handleArrowKeys($(txtBox), keyCode);
                evt.stopPropagation();
                return;
            }
        }
    })
    .keypress(function(evt) {
        var keyCode = getkeyCode(evt);

        if (keyCode == enterKey)
            return false;
    })
    .emptyText(ICAO_EMPTY_TEXT)
    .alphanumeric({ allow: ".,' " })
    .focus(function() {
        focus = true;
    })
    .blur(function() {
        focus = false;
    });

    function handleArrowKeys(txtBox, keyCode) {

        var listCtl;
        var selected;
        var next = null;

        if (resultsPanel) {
            listCtl = resultsPanel.children()[0];
            selected = resultsPanel.find(".hover");
        }

        if (keyCode == downArrow) {
            if (selected && selected.length == 0) {
                $(listCtl).children("li:first").addClass('hover');
            }
            else {
                if (selected && selected.next().length > 0) {
                    selected.removeClass('hover');

                    selected = selected.next();
                    selected.addClass('hover');

                    if (selected.position().top + selected.height() > resultsPanel.height()) {
                        resultsPanel.scrollTop(resultsPanel.scrollTop() + selected.height());
                    }
                }
            }
        }
        else if (keyCode == upArrow) {
            if (selected && selected.length > 0) {
                if (selected.prev().length > 0) {
                    selected.removeClass("hover");

                    selected = selected.prev();

                    selected.addClass("hover");

                    if (selected.position().top < 0) {
                        if (resultsPanel.scrollTop() - selected.height() < 0)
                            resultsPanel.scrollTop(0);
                        else
                            resultsPanel.scrollTop(resultsPanel.scrollTop() - selected.height());
                    }
                }
            }
        }
        else if (keyCode == enterKey || keyCode == tabKey) {
            if (selected)
                setValues(txtBox, $(selected).text(), $(selected).attr('id'));
            else
                setValues(txtBox, "[" + txtBox.val() + "]", txtBox.val());
        }
    }

    function closeResultsPanel() {
        if (resultsPanel) {
            $(resultsPanel).remove();
            resultsPanel = null;

            $(document).unbind("click", closeResultsPanel);
        }
    }

    function populateAirports(txtBox, data) {
        if (focus) {

            if (!resultsPanel) {
                resultsPanel = $("<div/>").insertAfter(txtBox)
									.addClass("airportResults")
									.css('left', txtBox.position().left)
									.css('top', txtBox.position().top + txtBox.height() + 5)
									.css("min-width", txtBox.width())
									.css("position", "absolute");
            }

            resultsPanel.html(data.d);

            resultsPanel.css("display", "block")
					.scrollTop(0);

            var posDdl = $(txtBox).position();

            resultsPanel.children("ul").children("li").hover(
                            function() {
                                var selected = resultsPanel.find(".hover");

                                if (selected.length > 0)
                                    selected.removeClass("hover");

                                $(this).addClass('hover');
                            },
                            function() { $(this).removeClass('hover'); }
                        ).click(function() {
                            setValues(txtBox, $(this).text(), $(this).attr('id'));
                        });

            resultsPanel.children("ul").children(":first").addClass("hover");

            $(document).bind("click", closeResultsPanel);

        }

    }

    function setValues(txtCtl, text, id) {
        if (text.length > 0) {
            var start = text.lastIndexOf("[") + 1;
            var stop = text.lastIndexOf("]");

            text = text.substring(start, stop);

            if (Airport.validateAirport(text)) {
                text = text.toUpperCase();

                $(txtCtl).val(text).change();

                if (options) {
                    if (options.selectedAirportChanged)
                        options.selectedAirportChanged();
                }
            }
            else {
                $(txtCtl).val("").change();
            }
        }

        if (resultsPanel) {
            closeResultsPanel();
        }
    }

    return this;
};





