/* Twiangulate Search Bar javascript file */


function searchBarBeforeCall() {
    watermarkOff();
    $('.searchBar').addClass('disabled');
    $('.searchBar select').attr('disabled', 'disabled');
    $('.searchBar input').attr('disabled', 'disabled');
    $('.searchBar button').attr('disabled', 'disabled');
    $('.twiCopy').css('visibility', 'hidden');
    if ($('#displayType').val() != 'map') {
        searchBarSwitchToNormal();
    }
    if ($('.searchBar').hasClass('searchBarHover')) {
        $('#user_message').addClass('underMiniBar').show();
    } else {
        $('#user_message').css('padding-top', '0px');
    }

    if ($('.keywordsInput').length == 1)
        $('.keywordsInput')[0].blur();
}


function searchBarAfterCall(on_error) {
    $('.searchBar').removeClass('disabled');
    $('.searchBar select').removeAttr('disabled');
    $('.searchBar input').removeAttr('disabled');
    $('.searchBar button').removeAttr('disabled');
    if (!on_error) {
        if ($('#displayType').val() == 'map')
            $('.twiCopy').css('visibility', 'visible');
        searchBarPosition = $('.searchBar').offset();
        searchBarSetInputState();
        searchBarToggleAmongFriends();
        $('#user_message').removeClass('underMiniBar');
    }
    watermarkOn();
}


function searchBarGetUsers() {
    var searchUsers = new Array();
    var twitterUrl = 'http://twitter.com/';
    for (i=0; i<inputs.length; i++) {
        var inputValue = $(inputs[i]).val().trim();
        if (inputValue) {
            inputValue = inputValue.replace(/^@/, '').replace(/^http:\/\/twitter\.com\//, '');
            if (searchUsers.indexOf(inputValue) == -1) { // do not add if duplicate
                searchUsers.push(inputValue);
            }
        }
    }
    return searchUsers;
}


function searchBarGetCriteria(searchUsers) {
    searchUsers = searchUsers || searchBarGetUsers();
    for (i=0; i<searchUsers.length; i++) {
        searchUsers[i] = searchUsers[i].replace(/\//, '.').replace(/-/g, '.'); // must encode list special characters
    }
    var searchCriteria = searchUsers.join('-');
    if ($("#searchMode").val() == 'keywords') {
        searchCriteria += '--' + encodeURIComponent(encodeURIComponent($('.keywordsInput').val()));
    }
    return searchCriteria;
}


function searchBarGetUrl(url) {
    if ($('.searchBar').hasClass('.searchBarConference')) {
        url += ('graph_label-' + $('#graphNodes').val() + '/');
        return url;
    }
    url += (searchBarGetCriteria() + '/');
    url += ($('#searchMode').val() + '/');
    url += ($('#displayType').val() + '/');
    var includeMyFriends = $('.includeFriendsSelector input:checkbox:checked').length ? '1' : '0';
    url += ('my_friends-' + includeMyFriends + '/');
    if ($('#referer').text().length) {
        url += ('referer-' + $('#referer').text() + '/');
    }
    if ($('#displayType').val() == 'map') {
        url += ('graph_label-' + $('#graphNodes').val() + '/');
        url += ('graph_bidir_only-' + $('#graphConnections').val() + '/');
        if ($('.searchBar').hasClass('advanced')) {
            url += ('graph_display_limit-' + $('#graph_display_limit').val() + '/');
            if ($('#graph_max_displayed_followers').val() != 'unlimited')
                url += ('graph_max_displayed_followers-' + $('#graph_max_displayed_followers').val() + '/');
            url += ('graph_max_displayed_friends-' + $('#graph_max_displayed_friends').val() + '/');
        }
    }
    if ($('#searchMode').val() == 'keywords') {
        url += ('keywords_sort-' + $('#keywordsSort').val() + '/');
        if ($('#pageCount').text().length) {
            url += ('page-' + $('#pageCount').text() + '/');
            $('#pageCount').text('');
        }
    }
    return url;
}


function searchBarSetInputs() {
    var resultUsers = searchResults.search_user_data.sort(searchBarSortFunction);
    if (resultUsers.length) {
        inputs.val('');
        for (var i = 0; i < resultUsers.length; i++) {
            $(inputs[i]).val(resultUsers[i].screen_name);
        }
        searchBarRefresh();
    }
}


function searchBarUserDataResult(data, textStatus) {
    if (data.friends) {
        searchBarUserData = data.friends;
        searchBarFollows = {};
        for (var i = 0; i < searchBarUserData.length; i++) {
            searchBarFollows[searchBarUserData[i].id] = false; // false: already following
        }
        searchBarSetUserData();
        if (typeof onSearchBarSetUserData === 'function') {
            onSearchBarSetUserData();
        }
    }
}


function searchBarAddToFollowers(screen_name) {
    var usersData = searchBarResultData.concat(searchBarSearchUserData);
    for (var i = 0; usersData[i]; i++) {
        if (usersData[i].screen_name == screen_name) {
            searchBarFollows[usersData[i].id] = true; // true: now following
            break;
        }
    }
}


function searchBarGetUserData() {
    var target = siteUrls.friends + userData.username + '/';
    if ('versions' in userData && 'friends' in userData.versions) {
        target += '?' + userData.versions.friends;
    }
    $.ajax({
        type: 'GET',
        dataType: 'json',
        url: target,
        timeout: 300000,
        error: null,
        success: searchBarUserDataResult
    });
}


function searchBarRefresh() {
    if (inputs) {
        inputs.change();
    }
}


var searchBarSortFunction = function (a, b) {
    return a.screen_name.toLowerCase() > b.screen_name.toLowerCase() ? 1 : (a.screen_name.toLowerCase() < b.screen_name.toLowerCase() ? -1 : 0);
}


function searchBarSetUserData() {
    var dataTemp = searchBarUserData.concat(searchBarResultData.concat(searchBarSearchUserData));
    dataTemp.sort(searchBarSortFunction);
    searchBarAutoData = unique(dataTemp)
    searchBarInitAutocomplete(searchBarAutoData);
    searchBarRefresh();
}


function searchBarAutoDetailHtml(row) {
    return '<div class="ac_row"><div class="tw_image">' + getTwitterImageHtml(row.icon_url, row.screen_name) + '</div>' +
       '<div class="tw_data"><span class="tw_screen_name">' + row.screen_name + '</span>' +
       '<span class="tw_full_name"> (' + row.full_name + ')</span>' +
       '<div class="tw_counts">' + thousandSeparator(row.followers_count) + ' followers, ' +
       thousandSeparator(row.friends_count) + ' friends</div></div>';
}


function searchBarDetailHtml(row) {
    return '<div class="detailRow"><div class="af_image">' + getTwitterImageHtml(row.icon_url, row.screen_name) + '</div>' +
       '<div class="extended_data"><div class="af_screen_name">' + row.screen_name + '</div>' +
       '<div class="af_full_name"> (' + row.full_name + ')</div>' +
       '<div class="af_counts">' + thousandSeparator(row.followers_count) + ' followers,</div><div class="af_counts">' +
       thousandSeparator(row.friends_count) + ' friends</div></div>';
}


function searchBarAutocompleteResult(event, data, formatted) {
    var detailDiv = $(this).next();
    detailDiv.css('background-image', 'none');
    detailDiv.css('opacity', '1');
    detailDiv.html(searchBarDetailHtml(data));
}


function searchBarInitAutocomplete(autoData) {
    if (!inputs) {
        return;
    }
    inputs.flushCache();
    inputs.unautocomplete();
    inputs.autocomplete(autoData, {
        matchContains: true,
        autoFill: false,
        cacheLength: 1,
        minChars: 2,
        width: 300,
        max: 10000,
        scrollHeight: 237,
        formatItem: searchBarAutoDetailHtml,
        formatMatch: function(row) {
            return row.screen_name + ' ' + row.full_name;
        },
        formatResult: function(row) {
            return row.screen_name;
        }
    });
    inputs.result(searchBarAutocompleteResult);
    // must do it here as well or events will not fire
    searchBarAttachEvents();
}


function searchBarInputChanged(event) {
    var screen_name = $(this).val();
    var detailDiv = $(this).next();
    var row = {};
    for (var i=0; i<searchBarAutoData.length; i++) {
        if (searchBarAutoData[i].screen_name.toLowerCase() == screen_name.toLowerCase()) {
            row = searchBarAutoData[i];
            break;
        }
    }
    if (row.screen_name) {
        detailDiv.css("background-image", "none");
        detailDiv.css('opacity', '1');
        detailDiv.html(searchBarDetailHtml(row));
    } else {
        detailDiv.css("background-image", "url('/site_media/img/sampleBox.jpg')");
        detailDiv.css('opacity', '.7')
        detailDiv.html("");
    }
}


function searchBarInputClear(event) {
    var detailDiv = $(this).next();
    detailDiv.css("background-image", "url('/site_media/img/sampleBox.jpg')");
    detailDiv.html("");
}


function searchBarBookmark() {
    $("#bookmarkText").text(document.location.href);
    var bookmarkDialog = $("#bookmarkDialog").overlay({
                        expose: '#000',
                        closeOnClick: false,
                        api: true
                    });
    bookmarkDialog.load();
}


function searchBarSwitchToMini() {
    $('.searchBar').removeClass('searchBarHover').addClass('searchBarMini');
    $('#header, #user_message, #output_content').hide();

    $('#miniLogo, #miniDescription, #toggle_minisearchbar').remove();

    var userNumber = searchResults.graph_data.nodes.length - (isResultTwitterListMode() ? 0 : searchBarGetUsers().length);
    var searchBarText = jQuery.trim($('.searchModeSelector .selected').html().toLowerCase());
    if (userNumber == 1)
        searchBarText = searchBarText.substring(0, searchBarText.length - 1);
    if (userNumber < 0)
        userNumber = 0;

    var miniDescription = 'Displaying ' + (searchBarText.indexOf('biggest') != -1
            ? searchBarText.replace(' ', ' ' + userNumber + ' ')
            : userNumber + ' ' + searchBarText
        ) + ' of ' + getUserList(searchBarGetUsers());
    if (isResultKeywordsMode()) {
        miniDescription = 'Displaying ' + userNumber + ' results for query '
            + '"' + $('.keywordsInput').val() + '"';
        if (searchBarGetUsers().length) {
            miniDescription += (' for friends of ' + searchBarGetUsers()[0]);
        }
    }

    $('.searchBar form').append(
        '<a id="miniLogo" href="/search"><img src="/site_media/img/logo-mini.png" alt="Twiangulate" title="Twiangulate" /></a>' +
        '<div id="miniDescription"> ' + miniDescription + '. <img src="/site_media/img/question.gif" alt="Info" title="Info" /></div>' +
        '<u id="toggle_minisearchbar">details</u>'
    );
    $('#toggle_minisearchbar').click(searchBarToggleHover);
    $('#miniDescription img').click(searchGraphToggleInfo);
}


function searchBarSwitchToNormal() {
    $('.searchBar').removeClass('searchBarMini').removeClass('searchBarHover');
    $('#header, #user_message, #output_content').show();
    $('#miniLogo, #miniDescription, #toggle_minisearchbar').remove();
}


function searchBarToggleHover() {
    if ($('.searchBar').hasClass('searchBarHover')) {
        $('.searchBar').removeClass('searchBarHover').addClass('searchBarMini');
        $('#user_message').removeClass('underMiniBar');
        $('#miniDescription').show();
        $('#toggle_minisearchbar').html('details');
    } else {
        $('.searchBar').removeClass('searchBarMini').addClass('searchBarHover');
        $('#user_message').addClass('underMiniBar');
        $('#miniDescription').hide();
        $('#toggle_minisearchbar').html('hide');
    }
    if (!$('#user_message').is(':hidden')) graphAreaSizeSetup();
}


function searchBarSetInputState() {
    if (isPageTwiangulation() || isPageBiggestFollowersMode()) {
        $('.userInput').removeClass('disabled');
        $('.userInput input').removeAttr('disabled');
    } else {
        $('.userInput:gt(0)').addClass('disabled');
        $('.userInput:gt(0) input').val('').attr('disabled', 'disabled');
    }
    searchBarRefresh();
}


function searchBarSelectSearchMode() {
    if ($('.searchBar').hasClass('disabled')) return

    $('#searchMode').val(
        this.id.substring(this.id.indexOf('_') + 1)
    );

    $('.searchModeSelector li').removeClass('selected');
    $(this).addClass('selected');

    if ($('.searchKeywords').length == 1) {
        $('.keywordsInput').val('');
        if (inputs[0].value == '')
            $('.keywordsMode input')[0].checked = false;
        else
            $('.keywordsMode input')[0].checked = true;
        searchBarToggleAmongFriends();
    }
    if ($('#searchMode').val() == 'keywords') {
        $('.searchBar').addClass('searchBarKeywords');
    } else {
        $('.searchBar').removeClass('searchBarKeywords');
        $('.userInput input').removeAttr('disabled');
    }

    searchBarSetInputState();
    if ($("#searchMode").val() == 'common_list_users') {
        watermarkOn();
    } else {
        watermarkOff();
    }
}


function searchBarSelectDisplayType() {
    if ($('.searchBar').hasClass('disabled')) return;

    $('.displayTypeSelector > span').removeClass('selected');
    $(this).addClass('selected');

    $('.displayTypeSelector .optional').toggle(this.id == 'result_map');

    $('#displayType').val(
        this.id.substring(this.id.indexOf('_') + 1)
    );

    if ($('#displayType').val() == 'map')
        $('.toggleAdvanced').show();
    else {
        $('.searchBar').removeClass('advanced').find('.toggleAdvanced, .advancedOptions').hide();
        $('.toggleAdvanced').html('A d v a n c e d');
    }
}


function searchBarSelectGraphNode() {
    if ($('.searchBar').hasClass('disabled'))
        return;

    $('#nodeTypeSelector span').removeClass('selected');
    $(this).addClass('selected');

    $('#graphNodes').val(
        this.id.substring(this.id.indexOf('_') + 1)
    );

    if (typeof query_params != 'undefined')
        query_params = query_params.replace(/label=([^&]*)/i, '');

    getSearchResults();
}


function searchBarSelectGraphConnection() {
    if ($('.searchBar').hasClass('disabled'))
        return;

    $('#connectionTypeSelector span').removeClass('selected');
    $(this).addClass('selected');

    $('#graphConnections').val(
        this.id == "graph_bidir" ? 1 : 0
    );

    if (typeof query_params != 'undefined')
        query_params = query_params.replace(/bidir_only=([^&]*)/i, '')

    getSearchResults();
}


function searchBarSelectKeywordsSort() {
    if ($('.searchBar').hasClass('disabled'))
        return;

    $('.keywordsSortSelector span').removeClass('selected');
    $(this).addClass('selected');

    $('#keywordsSort').val(
        this.id.substring(this.id.indexOf('_') + 1)
    );
}


function searchBarToggleAmongFriends() {
    if ($('.keywordsMode input')[0].checked) {
        $('.searchKeywords').removeClass('disabled');
        $('.userInput input').removeAttr('disabled');
    } else {
        $('.searchKeywords').addClass('disabled');
        $('.userInput input').attr('disabled', 'disabled');
    }
}


function searchBarToggleAdvanced() {
    if ($('.searchBar').hasClass('disabled')) return;

    $('.searchBar').toggleClass('advanced');

    $(this).html(
        $('.searchBar').hasClass('advanced') ? 'S i m p l e' : 'A d v a n c e d'
    )
}



function searchBarOnScroll() {
    var searchBar = $('.searchBar');
    var searchBarPlaceholder = $('.searchBarPlaceHolder');
    var searchBarMenu = $('.searchModeSelector li')
    if (!searchBar || !searchBarPosition
    || searchBar.hasClass('searchBarMini') || searchBar.hasClass('searchBarHover')) {
        return; // Page has no search bar, or it is in mini/hover mode quit
    }

    if (searchBarPosition && $(window).scrollTop() > searchBarPosition.top - searchBarMenu.height()) {
        searchBar.css('position', 'fixed');
        searchBar.css('top', '0');
        searchBarPlaceholder.show();
    } else {
        searchBarPlaceholder.hide();
        searchBar.css('position', 'static');
    }
}


function searchBarInitScroll() {
    searchBarPosition = undefined;
    $(window).scroll(searchBarOnScroll);
}


function watermarkOn() {
    if ($("#searchMode").val() != 'common_list_users') return;
    var input = $(inputs[0])
    var text = input.val();
    if (text.replace(/^\s+|\s+$/g, '') == '') {
        input.val(searchBarListWatermarkText);
        input.addClass("list-watermark")
    }
}


function watermarkOff() {
    var input = $(inputs[0])
    var text = input.val();
    if (text == searchBarListWatermarkText) {
        input.val('');
        input.removeClass("list-watermark")
    }
}


function searchBarAttachEvents() {
    inputs.blur(searchBarInputChanged);
    inputs.change(searchBarInputChanged);
    inputs.keyup(searchBarInputChanged);
    inputs.keypress(searchBarInputClear);

    $(inputs[0]).blur(watermarkOn);
    $(inputs[0]).focus(watermarkOff);

    if (typeof conferenceBarLastInputCheck != 'undefined')
        $('.conferenceBar .userList input[type="text"]:last').keydown(conferenceBarLastInputCheck);

    $('.searchModeSelector li').click(searchBarSelectSearchMode);
    $('.displayTypeSelector > span').click(searchBarSelectDisplayType);
    $('#nodeTypeSelector span').click(searchBarSelectGraphNode);
    $('#connectionTypeSelector span').click(searchBarSelectGraphConnection);

    $('.keywordsMode input:checkbox').change(searchBarToggleAmongFriends);
    $('.keywordsSortSelector > span').click(searchBarSelectKeywordsSort);

    $('.toggleAdvanced').click(searchBarToggleAdvanced);
}


function searchBarInitialize() {
    inputs = $('.searchBar .userInput input[type="text"]');
    searchBarAttachEvents();
    searchBarInitScroll();
    searchBarAutoData = [];
    searchBarUserData = [];
    searchBarSearchUserData = [];
    searchBarResultData = [];
    searchBarFollows = {};
    searchBarSetUserData();
    searchBarListWatermarkText = "owner_name/list-name           ";
    if (userData) {
        searchBarGetUserData();
    }
    searchBarOldCriteria = searchBarGetCriteria().toLowerCase();
    watermarkOn();
}
