/* User table main javascript file */


function userTableBeforeShow() {
    $("#userTable").css("visibility", "visible");
    $("#userTable tr:gt(1)").remove();
    $(".pager").css("visibility", "hidden");
}


function userTableAfterShow(showPager) {
    $(".follow_button").click(follow);
    if (showPager) {
        $(".pager").css("visibility", "visible");
    }
}


function userTableBeforeCall() {
    $("#userTable").css("visibility", "hidden");
    $("#userTable tr:gt(1)").remove();
    $(".pager").css("visibility", "hidden");
}


function userTableSetPager(pageNumber, pageCount, clickCallback) {
    if (pageCount > 1) {
        $(".pager").css("visibility", "visible");
        $(".pager").pager({ pagenumber: pageNumber, pagecount: pageCount, buttonClickCallback: clickCallback });
    }
}


function userTableIsNewUser(name) {
    var result = false;
    if (watched_data && 'new_users' in watched_data) {
        for (var i = 0; i < watched_data.new_users.length; i++) {
            if (watched_data.new_users[i].toLowerCase() == name.toLowerCase()) {
                result = true;
                break;
            }
        }
    }
    return result;
}


function userTableAddRow(row, rowNum) {
    var rowClass = (rowNum % 2 == 0) ? 'table_even_row' : 'table_odd_row';
    var followColumn = '';
    if (!(row.id in searchBarFollows)) {
        followColumn = '<td><button type="button" class="follow_button" name="follow" value="' + row.screen_name + '">Follow</button></td>';
    } else if (searchBarFollows[row.id]) {
        followColumn = '<td>Now following</td>';
    } else {
        followColumn = '<td></td>';
    }

    var u_screen_name = highlightKeywordsInResults(row.screen_name);
    var u_full_name = highlightKeywordsInResults(row.full_name);
    var u_description = highlightKeywordsInResults(row.description);
    var u_location = highlightKeywordsInResults(row.location);

    var usersColumn = '<td class="followed_image_td">';
    for (var i=0; i < row.users.length; i++) {
        usersColumn += '<a class="followed_image" href="http://twitter.com/'
            + row.users[i] + '" target="_blank">'
            + getTwitterImageHtmlByName(row.users[i]) + '</a>';
    }
    usersColumn += '</td>';
    var imageColumn = '<td><a class="twitter_image" href="http://twitter.com/'
        + row.screen_name + '" target="_blank">'
        + getTwitterImageHtml(row.icon_url, row.screen_name)
        + '<p>' + u_screen_name + '</p></a></td>';
    var fullName = row.url
        ? '<td><a href="' + row.url + '" target="_blank" title="' + row.url + '">' + u_full_name + '</a></td>'
        : '<td>' + u_full_name + '</td>';
    var description = '<td>' + u_description + '</td>';
    var location = '<td>' + u_location + '</td>';
    var friends = '<td>' + thousandSeparator(row.friends_count) + '</td>';
    var followers = '<td>' + thousandSeparator(row.followers_count) + '</td>';

    var contentColumn = fullName + description + friends + followers + location;
    var newClass = userTableIsNewUser(row.screen_name) ? ' newUser' : '';
    var rowId = 'user-' + row.screen_name.toLowerCase().replace(/\//g, '-');
    var rowStart = '<tr id="' + rowId + '" class="' + rowClass + newClass + '">';

    if (isResultImprovedFollowersMode()) {
        $('#userTable').append(rowStart + usersColumn + imageColumn + contentColumn + followColumn + '</tr>');
    } else {
        $('#userTable').append(rowStart + followColumn + imageColumn + contentColumn + '</tr>');
    }
}


function userTableAddLinkToTop() {
    var colspan = isResultImprovedFollowersMode() ? 8 : 7;
    $('#userTable').append('<tr class="toplink"><td colspan="' + colspan + '"><a href="javascript:$.scrollTo(0);">scroll to top</a></td></tr>');
}


function userTableSort(field, order) {
    var compoundSortFunction = function(a, b) {
        // always sort first upon the users field (based on users number then on users name)
        if (a.users.length < b.users.length) {
            return 1;
        } else if (a.users.length > b.users.length) {
            return -1;
        } else {
            if (a.users.toString() > b.users.toString()) {
                return 1;
            } else if (a.users.toString() < b.users.toString()) {
                return -1;
            }
        }
        // then sort on the desired field
        var result = 0;
        if (a[field].toLowerCase) {
            result = a[field].toLowerCase() > b[field].toLowerCase() ? 1 : (a[field].toLowerCase() < b[field].toLowerCase() ? -1 : 0);
        } else {
            result = a[field] > b[field] ? 1 : (a[field] < b[field] ? -1 : 0);
        }
        if (order == 'desc') {
            result = -1 * result;
        }
        return result;
    }
    var sortFunction = function(a, b) {
        // users field is handeled separatly, first sort on number of users, than on the name of users
        var result = 0;
        if (field == 'users') {
            if (a.users.length < b.users.length) {
                result = -11;
            } else if (a.users.length > b.users.length) {
                result = 1;
            } else {
                if (a.users.toString() > b.users.toString()) {
                    result = 1;
                } else if (a.users.toString() < b.users.toString()) {
                    result = -1;
                }
            }
        } else {
            if (a[field].toLowerCase) {
                result = a[field].toLowerCase() > b[field].toLowerCase() ? 1 : (a[field].toLowerCase() < b[field].toLowerCase() ? -1 : 0);
            } else {
                result = a[field] > b[field] ? 1 : (a[field] < b[field] ? -1 : 0);
            }
        }
        if (order == 'desc') {
            result = -1 * result;
        }
        return result;
    }
    var arrowId = '#' + field + '_' + order;
    $('.sortingDown').removeClass('selected_desc');
    $('.sortingUp').removeClass('selected_asc');
    $(arrowId).addClass('selected_' + order);
    if (isResultImprovedFollowersMode()) {
        searchResults.friends.sort(sortFunction);
    } else {
        searchResults.friends.sort(compoundSortFunction);
    }
}


function highlightKeywordsInResults(text) {
    if (isResultKeywordsMode()) {
        var query = $('.keywordsInput').val().replace(/(\b(\w+)\b(?!\*))*/g, function (str) {return str ? '\\b' + str + '*' : ''});
        query = query.replace(/"/g, '').replace(/ \| /g, '|').replace(/ \& /g , '&').replace(/\*/g, '(\\w*)');
        var reg_q = new RegExp('(' + query + ')', 'gi');
        if (text.match(reg_q)) {
            text = text.replace(reg_q, '{{$1}}');
        } else {
            var keywords = $('.keywordsInput').val().match(/(@?\w+\*?)/gi);
            if (keywords) {
                keywords.sort(function(a, b) {
                    return a.length > b.length ? -1 : a.length < b.length ? 1 : 0;
                });
                for (var i = 0; w = keywords[i]; i++) if (!/@/.test(w)) {
                    var reg_w = new RegExp('(' + w.replace(/\*/g, '(\\w*)') + ')', 'gi');
                    if (w.length == 1) {
                        text = text.replace(new RegExp(' (' + w + ') ', 'gi'), ' {{$1}} ');
                        text = text.replace(new RegExp('(' + w + ') ', 'gi'), '{{$1}} ');
                        text = text.replace(new RegExp(' (' + w + ')', 'gi'), ' {{$1}}');
                    } else
                        text = text.replace(reg_w, '{{$1}}');
                }
            }
        }
        text = text.replace(/{{/g, '<span class="search_highlight">').replace(/}}/g, '</span>');
    }

    return text;
}
