var hasShownOnce = false;
jQuery.isUndefined = function (o) { return o === undefined };
jQuery.isNumeric = function (n) { return !isNaN(parseInt(n)) };

function JPMap() {
    this.keys = [];
    this.values = [];
    this.iterator = -1;

    return this;
}
JPMap.prototype = {

    _get: function (key) {
        var itemIndex = $.inArray(key, this.keys);

        if (itemIndex == -1)
            return undefined;
        else return this.values[itemIndex];
    },

    get: function (key) {
        var item = this._get(key);
        if ($.isUndefined(item)) return item;

        return this.isPreservant(item) ? item.vals : item;
    },

    isPreservant: function (value) {
        if ($.isUndefined(value) || value == null || typeof (value) !== "object") return false;
        return !!value.__JPMap__Preservant__;
    },

    set: function (key, val) {
        var itemIndex = $.inArray(key, this.keys);

        if (itemIndex == -1) {
            this.iterator++;
            this.keys[this.iterator] = key;
            this.values[this.iterator] = val;
        } else {
            this.values[itemIndex] = val;
        }
    },

    length: function () {
        return this.keys.length;
    },

    hasKey: function (key) {
        return $.inArray(key, this.keys) != -1;
    },

    first: function () {
        return this.values[0];
    },

    preservantSet: function (key, val) {
        if (!this.hasKey(key))
            return this.set(key, val);

        var currentVal = this._get(key);

        if (!this.isPreservant(currentVal)) {
            this.set(key, {
                __JPMap__Preservant__: true,
                vals: []
            });
            this._get(key).vals.push(currentVal);
        }

        this._get(key).vals.push(val);
    },

    remove: function (key) {
        var itemIndex = $.inArray(key, this.keys);

        if (itemIndex == -1)
            return undefined;

        return {
            key: this.keys.splice(itemIndex, 1),
            value: this.values.splice(itemIndex, 1)
        };
    },

    each: function (cb) {
        for (var i = 0; i < this.keys.length; ++i) cb(this.keys[i], this.values[i]);
    },

    uniqify: function () {
        var nk = [];
        var nv = [];
        for (var i = 0; i < this.keys.length; ++i) {
            if ($.inArray(this.values[i], nv) == -1) {
                nk.push(this.keys[i]);
                nv.push(this.values[i]);
            }
        }
        this.keys = nk;
        this.values = nv;
    },
    toString: function () {
        var str = "{";
        for (var i = 0; i < this.keys.length; ++i) str += "\"" + this.keys[i] + "\": \"" + this.values[i] + "\",";
        str = str.substr(0, str.length - 1) + "}";
        return str;
    },
    dump: function (dname, count) {
        var _c = count || this.length();
        var sdump = "";
        for (var i = 0; i < _c; ++i) sdump += (dname || "j") + ".set(\"" + this.keys[i] + "\",\"" + this.values[i] + "\");";
        return sdump;
    }
}
jQuery.contiguities = function (outer, inner) {
    var r = $.indexes(outer, inner);
    var f = [];
    for (var i = 0; i < r.length; ++i) {
        f.push({ idx: r[i], len: inner.length, fin: (r[i] + inner.length) });
    }
    return f;
}

jQuery.wrapContiguities = function (outer, inner, wrfunc) {
    var c = $.contiguities(outer, inner);
    if (c.length == 0)
        return outer;

    var after = outer.substring(c[c.length - 1].fin);
    var newOuter = "";
    for (var i = 0; i < c.length; ++i) {
        newOuter += outer.substring(i == 0 ? 0 : (c[i - 1].fin), c[i].idx);
        newOuter += wrfunc(outer.substr(c[i].idx, c[i].len));
    }

    newOuter += after;

    return newOuter;
}
jQuery.indexes = function (outer, inner) {
    if (!inner || inner.length == 0 || inner == "")
        return [];
    var idx = [];
    var l = 0;
    var outerl = outer.toLowerCase();
    var innerl = inner.toLowerCase();
    while ((l = outerl.indexOf(innerl, l)) != -1) { idx.push(l); l += inner.length; }
    return idx;
}
/**
Some functionality from prototype
**/
Array.prototype.each = function (iterator, context) {
    for (var i = 0, length = this.length >>> 0; i < length; i++) {
        if (i in this) iterator.call(context, this[i], i, this);
    }
}

Array.prototype.pluck = function (property) {
    var results = [];
    this.each(function (value) {
        results.push(value[property]);
    });
    return results;
}
Array.prototype.toStringify = function () {
    this.each(function (value) {
        value.toString = function () { return this.label; };
    })
}
function isetSelectionRange(input, selectionStart, selectionEnd) {
    if (input.createTextRange) {
        var range = input.createTextRange();
        range.collapse(true);
        range.moveEnd('character', selectionEnd);
        range.moveStart('character', selectionStart);
        range.select();
    }
    else if (input.setSelectionRange) {
        input.focus();
        input.setSelectionRange(selectionStart, selectionEnd);
    }
}

$(document).ready(function () {
    var glob = new JPMap();
    $("#countryCity").autocomplete({
        source: function (req, res) {
            var t = new Date().getTime();
            glob.set(t, { rcb: res });
            $.ajax({
                url: "include/multisite/ajax/MSAutoCompleter.asp",
                data: ("term=" + $("#countryCity").val()),
                complete: $.proxy(function (xhr) {
                    var r = $.parseJSON(xhr.responseText);
                    r.toStringify();
                    this.rcb(r);
                }, glob.get(t))
            });
        },
        open: function () {
            searchTerms = $("#countryCity").val().split(" ");
            $(".ui-autocomplete a").each(function () {
                var resultText = $(this).text();
                for (var i = 0; i < searchTerms.length; ++i)
                    resultText = $.wrapContiguities(resultText, searchTerms[i], function (e) { return "[" + e + "]"; });

                resultText = resultText.replace(/\[/g, "<b>");
                resultText = resultText.replace(/\]/g, "</b>");
                $(this).html(resultText);
            });
        },
        select: function (event, ui) {
            setTimeout($.proxy(function () {
                $(".CountryDDLSelect").val(this.country);
                //setStateList();
                $(".StateDDLSelect").val(this.state);
                // setCityList();
                $(".CityDDLSelect").val(this.city);
            }, ui.item), 1);
            isetSelectionRange(event.target, 0, 0);
            /* $("#form1").submit(); */
        },
        delay: 200
    });
    $("#countryCity").focus(function () {
        var value = $(this).val();
        if (value == "Enter Location Here") {
            $(this).val("");
        }

    });
    $(".DynamicInput").one("focus", function () {
        var focusFunc = $.proxy(function () {
            var val = $(this).val();
            if (val == $(this).attr("_o_val")) $(this).val("").css({ color: "black" });
        }, this);
        $(this).attr("_o_val", $(this).val());
        focusFunc();

        $(this).focus(focusFunc);
    }).blur(function () {
        var val = $(this).val();
        if (val == "") $(this).css({ color: "#AAA9A9" }).val($(this).attr("_o_val"));
    })

    //initialize();

});
