Phx.namespace('Phx.Application.Modules.ManageFriendInvitations', new function()
{
    this.init = function() {
    };


    this.showInviteFriendsDialog = function(response, name, module, callback)
    {
        var _htmlDialog = Phx.UI.Dialog.HTML(i18n.getPText('vcard_invite_dialog_title', name), {
            message : response.module.data.html
        });

        _htmlDialog.show();

        _friends = [].concat(response.module.data.friends);

        for (var i = 0; i < _friends.length; i++) {
        	_friends[i].html = _renderFriendEntry;
        	_friends[i].styleClass = _getFriendEntryStyleClass;
        }
        _friends.sort(_compareFriends);
        _searchedFriends = [].concat(_friends);

        _leftContainer = $('#SelectFriends_LeftContainer').longlist({
            renderType : 'ul',
        	elements : _searchedFriends,
            width : 210,
            count : 5,
            elementHeight : 50,
            elementHeightDiff : 5,
            showMatches : true
        });

        _selectedFriends = [];

        _rightContainer = $('#SelectFriends_RightContainer').longlist({
            renderType : 'ul',
        	elements : _selectedFriends,
            width : 210,
            count : 5,
            elementHeight : 50,
            elementHeightDiff : 5,
            showMatches : false
        });

        _leftContainer.bind('itemclick', function (ev, data)
        {
        	if (data.element.selected) {
                data.element.selected = 0;
                data.htmlElement.removeClass('selected');
                _updateButtonRightState();
            } else {
                data.element.selected = 1;
                data.htmlElement.addClass('selected');
                _updateButtonRightState(true);
            }
        });

        _leftContainer.bind('itemdblclick', function (ev, data)
        {
        	data.element.selected = 1;
        	_removeFriendFromList(_friends, data.element);
        	_removeFriendFromList(_searchedFriends, data.element);
        	_selectedFriends.push(data.element);
        	_selectedFriends.sort(_compareFriends);
        	_rightContainer.refresh(true);
        	_leftContainer.refresh(true);
        	_updateButtonLeftState(true);
        	_updateButtonRightState(false);
        	_updateSaveButton();
        });

        _rightContainer.bind('itemclick', function (ev, data)
        {
        	if (data.element.selected) {
                data.element.selected = 0;
                data.htmlElement.removeClass('selected');
                _updateButtonLeftState();
            } else {
                data.element.selected = 1;
                data.htmlElement.addClass('selected');
                _updateButtonLeftState(true);
            }
        });

        _rightContainer.bind('itemdblclick', function (ev, data)
        {
        	data.element.selected = 1;
        	_removeFriendFromList(_selectedFriends, data.element);
        	_friends.push(data.element);
        	_friends.sort(_compareFriends);

        	_rightContainer.refresh(true);
        	_searchFriends();
        	_updateButtonLeftState();
        	_updateSaveButton();
        });

        $('#btnAddFriendToInvitationList').unbind('click').bind('click', _addFriendsToSelectionList);
        $('#btnRemoveFriendFromInvitationList').unbind('click').bind('click', _removeFriendsFromSelectionList);
        $('#search-field').unbind('keypress').bind('keyup change blur', _searchFriends);

        var _save = $('#ManageFriends-Save');

        if (_save.length > 0) {
            _save.unbind('click.vcard').bind('click.vcard', function() {
                if (_selectedFriends.length <= 0) {
            		return;
            	}
            	var _result = [];
            	for (var i = 0; i < _selectedFriends.length; i++) {
            		_result.push(_selectedFriends[i].ids);
            	}

                $().trigger('OmnitureTracking', {abTest: 'inviteFriendChooserSuccess'});

                callback(_result.join('&friendIdList[]='), module);
                _htmlDialog.close();
            });
        }

        var _cancel = $('#ManageFriends-Cancel');

        if (_cancel.length > 0) {
            _cancel.unbind('click.vcard').bind('click.vcard', function() {
                $().trigger('OmnitureTracking', {abTest: 'inviteFriendChooserAbort'});
                _htmlDialog.close();
            });
        }
    };

    var _renderFriendEntry = function (element, position, list)
    {
    	var name = element.name.escapeHtml();
    	if (list.options().showMatches) {
    		var searchTerm = $('#search-field').val().toLowerCase().escapeHtml();
    		if (searchTerm.length > 0) {

		    	var nameLeft = '';
		    	while (true) {
		    		var index = name.toLowerCase().indexOf(searchTerm);
		    		if (index < 0) {
		    			nameLeft += name;
		    			break;
		    		}
		    		nameLeft += name.substring(0, index);
		    		nameLeft += '<span class="match">'+name.substring(index, index+searchTerm.length)+'</span>';
		    		name = name.substring(index+searchTerm.length);
		    	}
		    	name = nameLeft;
        	}
    	}


    	return '<span class="pictureframe"><img alt="" src="'+element.imagePath+'"/></span>'+
               '<span class="name ellipsis">'+name+'</span>'+
               '<span class="uniName ellipsis">'+element.uniName.escapeHtml()+'</span>';

    };

    var _getFriendEntryStyleClass = function (element, position)
    {
    	if (element.selected) {
    		return 'selected';
    	}
    	else {
    		return '';
    	}
    };

    var _updateButtonRightState = function (val) {
    	if (val === true) {
    		$('#btnAddFriendToInvitationList').addClass('enabled').removeClass('disabled');
    		return;
    	}
    	if (val === false) {
    		$('#btnAddFriendToInvitationList').addClass('disabled').removeClass('enabled');
    		return;
    	}
    	for (var i = 0; i < _searchedFriends.length; i++) {
			if (_searchedFriends[i].selected) {
				$('#btnAddFriendToInvitationList').addClass('enabled').removeClass('disabled');
				return;
			}
		}
    	$('#btnAddFriendToInvitationList').addClass('disabled').removeClass('enabled');
    };

    var _updateButtonLeftState = function (val) {
    	if (val === true) {
    		$('#btnRemoveFriendFromInvitationList').addClass('enabled').removeClass('disabled');
    		return;
    	}
    	if (val === false) {
    		$('#btnRemoveFriendFromInvitationList').addClass('disabled').removeClass('enabled');
    		return;
    	}
		for (var i = 0; i < _selectedFriends.length; i++) {
			if (_selectedFriends[i].selected) {
				$('#btnRemoveFriendFromInvitationList').addClass('enabled').removeClass('disabled');
				return;
			}
		}
    	$('#btnRemoveFriendFromInvitationList').addClass('disabled').removeClass('enabled');
    };


    var _compareFriends = function (friend1, friend2)
    {
    	var name1 = friend1.name.toLowerCase();
    	var name2 = friend2.name.toLowerCase();

    	if (name1 < name2) {
    		return -1;
    	}
    	else if (name2 < name1) {
    		return 1;
    	}
    	else {
    		return 0;
    	}
    };

    var _searchFriends = function ()
    {
    	var searchTerm = $('#search-field').val().toLowerCase();

    	_searchedFriends.splice(0, _searchedFriends.length);

    	for (var i = 0; i < _friends.length; i++) {
    		if (searchTerm.length === 0) {
    			_searchedFriends.push(_friends[i]);
    		}
    		else if (_friends[i].name.toLowerCase().indexOf(searchTerm) >= 0) {
    			_searchedFriends.push(_friends[i]);
    		}
    	}
	    _leftContainer.refresh(true);
	    _updateButtonRightState();
    };

    var _removeFriendFromList = function (list, friend) {
    	for (var i = 0; i < list.length; i++) {
    		if (list[i].ids === friend.ids) {
    			list.splice(i, 1);
    			return;
    		}
    	}
    };

    var _addFriendsToSelectionList = function ()
    {
    	var i;
    	var moved = false;
    	for (i = 0; i < _searchedFriends.length; i++) {
    		if (_searchedFriends[i].selected) {
    			_removeFriendFromList(_friends, _searchedFriends[i]);
    			_selectedFriends.push(_searchedFriends[i]);
    			_searchedFriends.splice(i, 1);
    			moved = true;
    			i--;
    		}
    	}
    	_selectedFriends.sort(_compareFriends);
    	_leftContainer.refresh(true);
    	_rightContainer.refresh(true);
    	_updateButtonRightState(false);
    	_updateButtonLeftState(moved? true:null);
    	_updateSaveButton();
    };

    var _removeFriendsFromSelectionList = function ()
    {
    	var i;
    	for (i = 0; i < _selectedFriends.length; i++) {
    		if (_selectedFriends[i].selected) {
    			_friends.push(_selectedFriends[i]);
    			_selectedFriends.splice(i, 1);
    			i--;
    		}
    	}
    	_friends.sort(_compareFriends);
    	_searchFriends();

    	_rightContainer.refresh(true);
    	_updateButtonLeftState(false);
    	_updateSaveButton();
    };

    var _updateSaveButton = function ()
    {
    	if (_selectedFriends.length > 0) {
    		$('#ManageFriends-Save').removeClass('button-disabled');
    	}
    	else {
    		$('#ManageFriends-Save').addClass('button-disabled');
    	}
    };
}());
