/*
* AUSU jQuery-Ajax Auto Suggest
* http://www.oslund.ca/
*
* @version
* 1.0.1 (Jan 28 2011)
*
* @copyright
* Copyright (C) 2011 Isaac Oslund
* Dual licensed under the MIT and GPL licenses.
* http://www.opensource.org/licenses/mit-license.php
* http://www.opensource.org/licenses/gpl-license.php
*/

String.prototype.startsWith = function (str) {
    return (this.indexOf(str) === 0);
};


(function ($) {
    $.fn.autosugguest = function (config) {

        var defaults = {
            className: 'suggest',
            methodType: 'POST',
            addParams: null,
            rtnIDs: false,
            dataFile: 'data.php',
            minChars: 4,
            fadeTime: 100
        };

        var config = $.extend(defaults, config);

        config.addParams = (config.addParams != '') ? '&' + config.addParams : '';

        $('<div class="ausu-suggestionsBox"><div class="ausu-suggestionsBoxResults" id="ausu-suggestionTotalResults"></div><ul></ul></div>').appendTo('.' + config.className);
        $(".ausu-suggestionsBox > ul li").live('mouseover', function () {
            var sel = $(this).parent().find("li[class='selected']").removeClass('selected');
            $(this).addClass('selected');

            var selectedLat = $(this).attr("lat");
            var selectedLon = $(this).attr("lon");
            var liId = parseInt($(this).attr("id"));
            var markerIndex = parseInt($(this).attr("index"));
            var liSource = $(this).attr("source");

            

            var tempPoint = new google.maps.LatLng(selectedLat, selectedLon);
            map.panTo(tempPoint);
            if (liSource.startsWith("txtFrom")){
                markers[markerIndex].setIcon(arrivalIcon);
            }else{
                markers[markerIndex].setIcon(departureIcon);
            }
            markers[markerIndex].setZIndex(999);
        });

        $(".ausu-suggestionsBox > ul li").live('mouseout', function () {
            
            var liId = parseInt($(this).attr("id"));
            var markerIndex = parseInt($(this).attr("index"));
            var liSource = $(this).attr("source");

            try {
                if (liSource.startsWith("txtFrom")){
                    markers[markerIndex].setIcon(departureIcon);
                }else{
                    markers[markerIndex].setIcon(arrivalIcon);
                }
                markers[markerIndex].setZIndex(liId);
            } catch (e) {}
        });

        $("." + config.className + " > input").keyup(function (event) {
            var fieldParent = $(this).parents('div.' + config.className);

            if (event.which != 39 && event.which != 37 && event.which != 38 && event.which != 40 && event.which != 13 && event.which != 9) {

                //var temp = fieldParent.find('input:eq(0)');
                fieldVal = $("#" + this.id).val();
                //alert(fieldVal);
                suggest(fieldVal, this.id);
            } else {

                var fieldChild = fieldParent.find('.ausu-suggestionsBox > ul');

                switch (event.which) {
                    case 40: { keyEvent(fieldChild, 'next'); break; }
                    case 38: { keyEvent(fieldChild, 'prev'); break; }
                    case 13:
                        {
                            fieldParent.children('input:eq(0)').val($("li[class='selected'] a").text());
                            if (config.rtnIDs == true) fieldParent.children('input:eq(1)').val($("li[class='selected']").attr("id"));
                            fieldParent.children('div.ausu-suggestionsBox').hide();
                            return false;
                            break;
                        }
                    case 9:
                        {
                            offFocus(this); $("li").removeClass("selected");
                            break;
                        }
                }
            }
        });

        $("." + config.className).bind("keypress", function (event) {
            if (event.keyCode == 13) return false;
        });

        $("." + config.className + " > input").live("blur", function () { offFocus(this); $("li").removeClass("selected"); });

        function suggest(dataInput, id) {
            if (dataInput.length < config.minChars) {
                $('#' + id).parent('.' + config.className).children('div.ausu-suggestionsBox').fadeOut();
            } else {
                $('#' + id + ":eq(0)").addClass('ausu-load');

                var fromVal = 0;
                if (id.startsWith("txtTo")) {
                    fromVal = $("#hfFrom").val();
                    if (id.length == 6){
                        var currentId = id.substring(id.length - 1);
                        var hiddenFrom = "#hfFrom" + currentId;
                        fromVal = $(hiddenFrom).val();
                    }
                }

                $.ajax({
                    type: config.methodType,
                    url: config.dataFile,
                    data: "id=" + fromVal + "&filter=" + dataInput  + config.addParams,
                    dataType: 'xml',
                    success: function (data) {
                        if (data != null) {
                            $('#' + id).parent('.' + config.className).children('div.ausu-suggestionsBox').fadeIn();
                            var listContent = "";
                            var totalResults = 0;

                            $(data).find("results").each(function () {
                                totalResults = $(this).attr('totalResults');
                            });

                            $(data).find("result").each(function () {
                                var thisId = $(this).attr('id');
                                var thisIndex = 0;

                                for (var i = 0; i < markers.length; i++) {
                                    if (markers[i].zIndex == thisId){
                                        thisIndex = i;
                                        break;
                                    }
                                }
                                listContent = listContent + "<li id='" + thisId + "' source='" + id + "' index='" + thisIndex + "' code='" + $(this).attr('code') + "' lat='" + $(this).attr('lat') + "' lon='" + $(this).attr('lon') + "' ><a>[" + $(this).attr('code') + "] " + $(this).text() + "</a></li>";
                            });

                            $('#' + id).parent('.' + config.className).find('.ausu-suggestionsBox > ul').html(listContent);
                            $('#' + id).parent('.' + config.className).find('.ausu-suggestionsBox > div').html(totalResultsTitle + totalResults);
                            
                            $('#' + id + ":eq(0)").removeClass('ausu-load');
                        }
                        else {
                            $('#' + id + ":eq(0)").removeClass('ausu-load');
                        }
                    }
                });
            }
        }

        function keyEvent(fieldChild, action) {
            yx = 0;
            fieldChild.find("li").each(function () {
                if ($(this).attr("class") == "selected")
                    yx = 1;
            });

            if (yx == 1) {
                var sel = fieldChild.find("li[class='selected']");
                (action == 'next') ? sel.next().addClass("selected") : sel.prev().addClass("selected");
                sel.removeClass("selected");
            }
            else {
                (action == 'next') ? fieldChild.find("li:first").addClass("selected") : fieldChild.find("li:last").addClass("selected");
            }
        }

        function offFocus(fieldChild) {
            var fieldParent = $(fieldChild).parents('div.' + config.className);
            fieldParent.children('div.ausu-suggestionsBox').delay(config.fadeTime).fadeOut();
        }

        $(".ausu-suggestionsBox > ul li").live("click", function () {
            var fieldParent = $(this).parents('div.' + config.className);
            fieldParent.children('input:eq(0)').val($(this).text());

            if (config.rtnIDs == true) {
                fieldParent.children('input:eq(1)').val($(this).attr("id"));

                var currentHiddenValue = $(this).attr("id");
                var currentSource = fieldParent.children('input:eq(0)').attr("id");
                var anchorText = $(this).find("a").html();
                var selectedLat = $(this).attr("lat");
                var selectedLon = $(this).attr("lon");

                var locationId = $(this).attr("id");


                if (currentSource.startsWith("txtFrom")) {
                    var fromLength = currentSource.length;
                    
                    var txtFrom = "#txtFrom";
                    var txtTo = "#txtTo";
                    var hfTo = "#hfTo";

                    if (fromLength == 8){
                        var currentNum = currentSource.substring(fromLength - 1);
                        txtFrom += currentNum;
                        txtTo += currentNum;
                        hfTo += currentNum;
                    }

                    $(txtTo).val('');
                    $(hfTo).val("null");
                    $(txtTo).addClass('ausu-load');

                    $.ajax({
                        type: config.methodType,
                        url: config.dataFile,
                        data: "id=" + $(this).attr("id") + "&filter=null" + config.addParams,
                        dataType: 'xml',
                        success: function (data) {
                            if (data != null){
                                MapAddMarker(locationId, selectedLat, selectedLon, anchorText, currentSource, data);
                            }
                            $(txtTo).removeClass('ausu-load');
                            $(txtTo).focus();
                        }
                    });
                }else if((currentSource.startsWith("txtTo")) && (currentSource.length == 6) ){
                    //se periptwsi poy eimaste se island hopping
                    var currentToId = parseInt(currentSource.substring(currentSource.length - 1), 10);
                    if (currentToId < maxItineraries){
                    

                        var hi
                        var hiddenFromNext = "#hfFrom" + (currentToId + 1);
                        $(hiddenFromNext).val(currentHiddenValue);
                        var txtFromNext = "#txtFrom" + (currentToId + 1);
                        $(txtFromNext).val($(this).text());
                        var txtToNext = "#txtTo" + (currentToId + 1);
                        $(txtToNext).focus();
                    }
                }else if(currentSource.startsWith("txtTo")){
                    
                    MapAddMarker(locationId, selectedLat, selectedLon, anchorText, currentSource);
                }
            }
            fieldParent.children('div.ausu-suggestionsBox').hide();
        });


    };
})(jQuery);
