﻿jQuery.fn.extend({
    asselectbox: function (options, callbackFnk) {
        return this.each(function () {
            new jQuery.asSelectBox(this, options, callbackFnk);
        });
    }
});

jQuery.asSelectBox = function (selectobj, options, callbackFnk) {
    var opt = options || {};
    opt.inputClass = opt.inputClass || "selectbox";
    opt.containerClass = opt.containerClass || "selectbox-wrapper";
    opt.containerOutClass = opt.containerOutClass || "selectbox-wrapper-out";
    opt.hoverClass = opt.hoverClass || "current";
    opt.currentClass = opt.selectedClass || "selected"
    opt.debug = opt.debug || false;
    opt.baseId = opt.baseId || "";
    opt.dataUrl = opt.dataUrl || "";
    opt.dataType = opt.dataType || "";
    opt.parentElementValue = opt.parentElementValue || "";
    opt.defaultText = opt.defaultText || "";
    opt.divStyle = opt.divStyle || "";

    opt.showsearch = opt.showsearch || true;

    var elm_id = selectobj.id.replace("_input", "");
    if (opt.baseId.length < 1) opt.baseId = elm_id;
    else elm_id = opt.baseId;
    var noMatchItem = $("<option>Kayıt bulunamadı...</option>").attr("disabled", "true");

    var hoverClass = 'selected';
    var activeitem = 0;
    var active = -1;
    var inFocus = false;
    var hasfocus = 0;
    //jquery object for select element
    var $select = $(selectobj);
    // jquery container object

    $select.val(opt.defaultText);

    var dataHolder = document.createElement("input");
    $dataHolder = $(dataHolder);
    $dataHolder.attr('id', elm_id);
    $dataHolder.attr('name', elm_id);
    $dataHolder.attr('value', "-1");
    $dataHolder.attr('type', "hidden");

    var datasetHolder = document.createElement("select");
    $datasetHolder = $(datasetHolder);
    $datasetHolder.attr('id', elm_id + "_ds");
    //$datasetHolder.attr('name', elm_id + "_ds");
    $datasetHolder.attr('style', "display:none;");

    $select.after($dataHolder);
    $select.after($datasetHolder);

    var dataSLCT = $("#" + elm_id + "_slct");

    if (opt.dataUrl.length > 0) {
        var optionsUL = '';
        var urlim = opt.dataUrl;
        if (opt.parentElementValue > 0) { urlim += opt.parentElementValue; }

        $.getJSON(urlim, function (JSON) {

            optionsSL = '';
            $.each(JSON, function (i, data) {
                optionsSL += '<option value="' + data.item_id + '">' + data.item_text + '</option>';
            });
            var datasetHolder = $("#" + elm_id + "_ds");
            datasetHolder.html(optionsSL);

            var dataslct = $("#" + elm_id + "_slct");
            dataslct.html(optionsSL);

        });

    }


    $select.click(function () {

        var dataSLCT = $("#" + elm_id + "_slct");
        var oldstyle = dataSLCT.attr('style');
        dataSLCT.removeAttr('style');
        var patt1 = /block/gi;
        if (oldstyle.match(patt1)) {
            dataSLCT.hide();
        }
        else {
            dataSLCT.attr('style', opt.divStyle);
            dataSLCT.show();
            $select.val("");
        }

    })
    .keyup(function (e) {
        if (jQuery.inArray(e.keyCode, new Array(9, 13, 16, 33, 34, 35, 36, 38, 40)) > -1)
            return true;

        // set search text
        search = $.trim($select.val());

        // if a previous timer is running, stop it
        //clearSearchTimer();

        // start new timer
        //if (opt.showsearch) timer = setTimeout(searching, 300);
        searching();
    })
    .keydown(function (event) {

        switch (event.keyCode) {
            case 13: // return
                event.preventDefault(); // seems not working in mac !
                resetItem();
                break;
            case 38: // up
                event.preventDefault();
                slctIndex = $("select#" + elm_id + "_slct").attr("selectedIndex");
                $("select#" + elm_id + "_slct").attr("selectedIndex", --slctIndex);
                break;
            case 40: // down
                event.preventDefault();
                slctIndex = $("select#" + elm_id + "_slct").attr("selectedIndex");
                $("select#" + elm_id + "_slct").attr("selectedIndex", ++slctIndex);
                break;
            case 27: //escape
                $dataSLCT.removeAttr('style');
                $dataSLCT.attr('style', opt.divStyle);
                $dataSLCT.hide();
                break;
        }
    });

    $("#" + elm_id + "_slct")
        .keydown(function (event) {
            switch (event.keyCode) {
                case 13: // return
                    event.preventDefault(); // seems not working in mac !
                    resetItem();
                    break;
            }
        })
        .click(function () {

            resetItem();

        })
        .dblclick(function () {

            resetItem();
        });

    function resetItem() {
        var dataSLCT = $("select#" + elm_id + "_slct");
        var txtsel = $('select#' + elm_id + '_slct>option:selected').text();
        var selVal = dataSLCT.val();
        $select.val(txtsel);
        $("#" + elm_id).val(selVal);
        dataSLCT.hide();
        if (typeof callbackFnk == 'function') {
            callbackFnk(this, selVal);
        }
    }

    function escapeRegExp(str) {
        var specials = ["/", ".", "*", "+", "?", "|", "(", ")", "[", "]", "{", "}", "\\", "^", "$"];
        var regexp = new RegExp("(\\" + specials.join("|\\") + ")", "g");
        return str.replace(regexp, "\\$1");
    };

    function searching() {
        if (searchCache == search) { // no change ...
            timer = null;
            //return;
        }

        var matches = 0;
        searchCache = search;
        var selector = $("#" + elm_id + "_slct");
        //selector.hide();
        var divStyle = selector.attr('style').toString().replace('display:none;', '').replace('display:block;', '');
        selector.removeAttr('style');
        selector.attr('style', divStyle);
        selector.hide();
        selector.empty();

        // escape regexp characters
        //var regexp = escapeRegExp(search);
        var regexp = "^" + search; // exact match
        search = new RegExp(regexp, "i");

        // for each item in list
        for (var i = 0; i < datasetHolder.length && matches < 20; i++) {

            // search  
            if (search.length == 0 || search.test(datasetHolder.options[i].text)) {
                var opt = $(datasetHolder.options[i]).clone().attr(idxAttr, i - 1);
                selector.append(opt);
                matches++;
            }
        }

        // result actions 
        if (matches == 0) {
            //selector.append(noMatchItem);
            selector.append($("<option>" + searchCache + " kaydı bulunamadı...</option>").attr("disabled", "true"));
        }
        else if (matches >= 1) {
            //selector.selectedIndex(0);
        }

        /*
        // append top match item if matches exceeds maxMultiMatch
        if (matches >= settings.maxMultiMatch) {
        selector.append(topMatchItem);
        }

        // resize selector
        selectorHelper.size(matches);*/
        //selector.show();
        selector.removeAttr('style');
        selector.attr('style', divStyle);
        selector.show();
        timer = null;
    };



};
