function levenshtein (s1, s2) {
    if (s1 == s2) return 0;
    var s1_len = s1.length;
    var s2_len = s2.length;
    if (s1_len === 0) return s2_len;
    if (s2_len === 0) return s1_len;
    var split = false;
    try {
        split=!('0')[0];
    } catch (e){
        split=true;
    }
    if (split){
        s1 = s1.split('');
        s2 = s2.split('');
    }
    var v0 = new Array(s1_len+1);
    var v1 = new Array(s1_len+1);
    var s1_idx=0, s2_idx=0, cost=0;
    for (s1_idx=0; s1_idx<s1_len+1; s1_idx++) {
        v0[s1_idx] = s1_idx;
    }
    var char_s1='', char_s2='';
    for (s2_idx=1; s2_idx<=s2_len; s2_idx++) {
        v1[0] = s2_idx;
        char_s2 = s2[s2_idx - 1];
        for (s1_idx=0; s1_idx<s1_len;s1_idx++) {
            char_s1 = s1[s1_idx];
            cost = (char_s1 == char_s2) ? 0 : 1;
            var m_min = v0[s1_idx+1] + 1;
            var b = v1[s1_idx] + 1;
            var c = v0[s1_idx] + cost;
            if (b < m_min) m_min = b;
            if (c < m_min) m_min = c;
            v1[s1_idx+1] = m_min;
        }
        var v_tmp = v0;
        v0 = v1;
        v1 = v_tmp;
    }
    return v0[s1_len];
}


function dump(arr,level) {
    var dumped_text = "";
    if(!level) level = 0;
    var level_padding = "";
    for (var j=0;j<level+1;j++) level_padding += "    ";
    if (typeof(arr) == 'object') {
        for(var item in arr) {
            var value = arr[item];
            if(typeof(value) == 'object') {
                dumped_text += level_padding + "'" + item + "' ...\n";
                dumped_text += dump(value,level+1);
            } else {
                dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
            }
        }
    } else {
        dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
    }
    return dumped_text;
}

var Url = {
    encode : function (string) {
            return escape(this._utf8_encode(string));
    },
    decode : function (string) {
            return this._utf8_decode(unescape(string));
    },
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";
        for (var n = 0; n < string.length; n++) {
            var c = string.charCodeAt(n);
            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }
        }
        return utftext;
    },
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;
        while ( i < utftext.length ) {
            c = utftext.charCodeAt(i);
            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }
        }
        return string;
    }
}

var AC = {
    hover : false,
    i : 0,
    max : 0,
    dropDown : $('#searchDropDown'),
    next : 0,
    url : '/ajaxSearch.php',
    delay : 600,
    success : false,
    searchItems : function(query,kind) {
        var data;
        $.ajax({
            url: this.url+'?q='+query+'&k='+kind,
            async : false,
            dataType : 'json',
            success: function (json) {
                data = json;
                AC.success = true;
            }
        })

        return data;
    },
    makeRow : function(i, data) {
        if (data.mediaName) {
            var ID = data.itemId;
            var url= "http://www.imusic.dk/"+data.mediaName.toLowerCase()+"/"+ID+"/";

            if (data.artist && data.title) {
                var artist = data.artist;
                var artistLength = artist.length;
                var title = data.title;
                var titleLength = title.length;
                var tMax = 25;
                var aMax = 25;
                if (artistLength < 25) tMax += (aMax-artistLength);
                if (titleLength < 25) aMax += (tMax-titleLength);
                if (levenshtein(title, artist) < 3 || title.indexOf(artist) > 0) {
                    var artist ="";
                    var title = data.title;
                } else {
                    var artist = (artistLength > aMax ? artist.substring(0,aMax)+"..." : artist);
                    var title = (titleLength > tMax ? title.substring(0,tMax)+"..." : title);
                }
            } else {
                return false;
            }

            row="<tr class='resultItem' it='"+(i+1)+"' onClick=\"document.location='"+url+"';\">";
            row+="<td class='image'><img id='img"+i+"' src='http://www.imusic.dk"+data.thumbnailURL+"'></td>";
            row+="<td class='title'>";
            if (artist) row += Url.decode(artist)+"<br>";
            if (title) row += Url.decode(title)+"<br>";
            row+="</td>";
            row+="<td class='price'>";
            if (data.mediaName) row += "<span class='media' style='background-image: url("+data.mediaBackgroundFile+");'>";
            if (data.units > 1) row += data.units+" ";
            row += data.mediaName.toUpperCase();
            row += "</span>";
            if (data.price) row+="<br><div style='margin-top: 3px;'>"+data.price+"</div>";
            row+="</td>";
            row+="</tr>";

            return row;
        }
    },
    makeTable : function(json) {
        var table = "<table id='ajaxSearchResults' cellpadding=0 cellspacing=0>";
        var i=0;
        $(json).each(function(){
            this.max++;
            var row = AC.makeRow(i, this);
            if (row) {
                table+=row;
                i++;
            }
        });
        this.max = i;
        table+="</table>";
        return table;
    },
    beginSearch : function(e) {
        var query = $("#searchQuery").attr('value');
        var kind = $("select[name='kind']").attr('value');
        if (query.length > 1) {
            AC.showLoader();
            AC.i = 0;
            data = this.searchItems(query,kind);
            if (data) {
                if (data.length > 0) {
                    var table = AC.makeTable(data);
                    if (table) {
                        $('#searchDropDown').css('height','auto').html(table).show();
                    }
                } else {
                    this.showErr(query);
                    $('#searchDropDown').height(70);
                }
            }
            if ($("#searchDropDown").height() > 330) {
                $("#searchDropDown").height(330);
            }
        } else {
            $('#searchDropDown').hide();
        }
    },
    iterate : function(key) {
        if (key == 38) {
            this.next = (this.i - 1);
            if (this.next < 0) {
                this.next = this.max;
                scrollTo = (this.next-4)
            } else {
                scrollTo = this.next;
            }

        } else if (key == 40) {
            this.next = this.i + 1;
            if (this.next > this.max) {
                this.next = 0;
                scrollTo = 0;
            } else {
                scrollTo = (this.next-4);
            }
        }
        $('#searchDropDown').scrollTo(".resultItem[it='"+(scrollTo)+"']", 100);
        this.select(this.next);
        this.i = this.next;
    },
    select : function(i) {
        $(".hover").removeClass("hover").attr("selected", "0");
        $(".resultItem[it='"+i+"']").addClass("hover").attr("selected", "1");
    },
    showLoader : function() {
        $('#searchDropDown').html("<p class='loading'><img src='/gfx/loading.gif'></p>").show();
    },
    showErr : function(query) {
        $('#searchDropDown').html('<p class="error">Beklager, din søgning på "'+query+'" gav ingen resultater.</H4>').show();
    }
}

$().ready(function() {
    $("#searchDropDown, #searchQuery").hover(function(){
        AC.hover=true;
    }, function(){
        AC.hover=false;
    });
    $('#searchQuery').focus(function(){
        if (AC.success) $('#searchDropDown').show();
    }).blur(function(){
        if (!AC.hover) $('#searchDropDown').hide();
    });
    $("#searchQuery").keyup(function(e) {
        var key = e.keyCode;
        if (key == 38 || key == 40) {
            AC.iterate(key);
        } else if (key == 13) {
            if (AC.select == 0) {
                $("form[name='searchForm']").submit();
            } else {
                $(".resultItem[it='"+AC.i+"']").trigger('click');
            }
        } else if ((key > 48 && key < 93 || key == 8)) {
            clearTimeout(this.timeout);
            this.timeout=setTimeout("AC.beginSearch();", AC.delay);
        }
    });
    $("select[name='kind']").change(function(){
        AC.beginSearch();
    });
    $('.resultItem').live('mouseover mouseout', function(event) {
        var td = $(this).find('td');
        AC.i = $(this).attr('it');
        if (event.type == 'mouseover') {
            $('.hover').removeClass('hover');
            td.addClass('hover');
        } else {
            td.removeClass('hover');
        }
    });
});
