var popupExisted=false;
var accounts=new Object();
var buddyIdCounter=0;
var accountIdCounter=0;
var groupIdCounter=0;
var buddies=new Object();
var buddyRows=new Object();
var maxStringLength=40;
var maxStringTooltipLength=20;
var updateBuddyUrl = "/purple/update";
var delimiter ="DELIMITER";
var dialogBoxList=new Object();
var chatContents=new Object();
var dialogIndex=0;
var topPositionDialog=95;
var leftPositionDialog=5;
var groups=new Object();
var longPollingReq;
var avatarPath="/avatars/";
var isLoginChatab=true;
var currentDialogChat;
var dashboardPrepared = false;

function prepareDashboard(){
    if (dashboardPrepared) {
        return;
    }
    $( '#loginForm' ).fadeOut(1000,function(){
        $( 'body' ).removeClass('loginFormBody');
        $( 'body' ).addClass('dashboardBody');

    });

    $( '#dashBoardView' ).show();
    window.onbeforeunload = function() {
        return "Leaving or refreshing this page can result in log out all of the accounts";
    }
    setupDashboard();
    dashboardPrepared = true;
}

function setupDashboard() {
    $( "#accordion" ).accordion({
        autoHeight:false

    });

    $('#dashboard').dialog({
        position:[1250,95],
        resizable:'none',
        closeOnEscape: false,
        open: function(event, ui) {
            $(".ui-dialog-titlebar-close").hide();
        },
        title:'Dashboard'
    });

    $('#tooltip').hover(function(){
        $('#tooltip').show();
    },function(){
        $('#tooltip').hide();

    });


    updateBuddy();
    setupUI();
    setupMainMenu();
}



//
//<update>
//    <account name="steeldragonice" protocol="yahoo">
//        <error></error>
//        <buddies>
//            <buddy>
//                <username></username>
//                <alias></alias>
//                <avatar></avatar>
//                <status></status>
//                <message></message>
//            </buddy>
//        </buddies>
//        <messages>
//            <message>
//                <fromAccount></fromAccount>
//                <toAccount></toAccount>
//                <message></message>
//                <time></time>
//            <message>
//        </messages>
//    </account>
//</update>

function addNewAccountView(accountName,protocol){
    if(accounts[accountName+delimiter+protocol]==null){

        accounts[accountName+delimiter+protocol]=new Object();
        var id=getNextAccountId();
        accounts[accountName+delimiter+protocol]["id"]=id;
        $('#add-buddy-dialog form select.account-list').append('<option id="addBuddy'+id+'">'+accountName+'('+protocol+')</option>');
        $('#add-group-dialog form select.account-list').append('<option id="addGroup'+id+'">'+accountName+'('+protocol+')</option>');
        //        $('#register-dialog form div.password-for-current-accounts').append('<label for="password'+accountName+'" id="label'+id+'">'+accountName+'('+protocol+')\'s password</label>'
        //            +'<input type="password" id="password'+id+'"/>');

        //add to your account
        $('#your-account li ul.account-root').append('<li  id="yourAccount'+id+'"><a><img class="account-status" src="images/Available-bt.png" alt="available"/><img src="images/'+protocol+'_online.png" alt="'+protocol+'" width="10px" height="10px"/>'+accountName+'</a>'
            +'<ul>'
            +'    <li><a onclick="changeStatusForAccount(\''+accountName+'\',\''+protocol+'\',\'Available\')"><img src="images/Available-bt.png" alt="available"/>Available</a></li>'
            +'    <li><a onclick="changeStatusForAccount(\''+accountName+'\',\''+protocol+'\',\'Away\')"><img src="images/Away-bt.png" alt="away"/>Away</a></li>'
            +'    <li><a onclick="changeStatusForAccount(\''+accountName+'\',\''+protocol+'\',\'Invisible\')"><img src="images/Invisible-bt.png" alt="invisible"/>Invisible</a></li>'
            +'    <li><a onclick="processLogoutSingle(\''+accountName+'\',\''+protocol+'\')"><img src="images/logout.png" alt="logout"/></a></li>'
            +'</ul>'
            +'</li>');
        $('#your-account').dropmenu({
            effect  : 'fade',
            speed   : 250,
            timeout : 500
        });

    }
}

function removeAccountView(accountName,protocol){
    var id=accounts[accountName+delimiter+protocol]["id"];
    $('option#addBuddy'+id).remove();
    $('option#addGroup'+id).remove();
    $('li#yourAccount'+id).remove();
    $('label#label'+id).remove();
    $('input#password'+id).remove();
}

function changeStatusForAccount(accountName,protocol,status){
    var id=accounts[accountName+delimiter+protocol]["id"];

    $('#yourAccount'+id+' img.account-status').attr('src',"images/"+status+"-bt.png");
    changeStatusForAccountToServer(accountName,protocol,status);
}



function updateBuddy(){
    longPollingReq = $.ajax({
        type: "GET",
        //url here
        url: updateBuddyUrl,
        dataType: "json",
        success: function(data) {
            $.each(data,function(key,val){
                var protocol = key;
                if(protocol=="status"||val=="timeout"){
                }else{
		
                    $.each(val,function(key,val){
                        //cut the tail after @
                        var strs=key.toString().split("@");
                        var accountName=strs[0];
                        addNewAccountView(accountName,protocol);
                        $.each(val,function(key,val){
                            if(key=="buddyList"){
                                $.each(val,function(key,val){
                                    var username="";
                                    var alias="";
                                    var message="";
                                    var avatar="";
                                    var status="";
                                    var group="";
                                    $.each(val,function(key,val){
                                        if(key=="username"){
                                            var strs=val.toString().split("@");
                                            username=strs[0];
                                        }else if(key=="alias"){
                                            alias=val;
                                        }else if(key=="message"){
                                            message=val;
                                        }else if(key=="avatar"){
                                            avatar=val;
                                        }else if(key=="status"){
                                            status=val;
                                        }else if(key=="group"){
                                            group=val;
                                        }
                                    });
                               
                                    if(avatar==""){
                                        avatar="images/no_avatar.png";
                                    }else{
                                        avatar=avatarPath+avatar;

                                    }

                                    message=processMessage(message);
                                


                                    var buddy=new Array();
                                    buddy["username"]=username;
                                    buddy["alias"]=alias;
                                    buddy["avatar"]=avatar;
                                    buddy["status"]=status;
                                    buddy["message"]=message;
                                    buddy["group"]=group;
                                    buddy["protocol"]=protocol;
                                    buddy["ofAccount"]=accountName;
                                    buddy["id"]=getNextBuddyId();
                                

                                    var oldStatus=status;
                                    var oldAlias=alias;
                                    var oldAvatar=avatar;
                                    if(buddies[username+delimiter+protocol+delimiter+accountName]!=null){
                                        oldStatus=buddies[username+delimiter+protocol+delimiter+accountName]['status'];
                                        oldAlias=buddies[username+delimiter+protocol+delimiter+accountName]['alias'];
                                        oldAvatar=buddies[username+delimiter+protocol+delimiter+accountName]['avatar'];
                                        buddy["id"]=buddies[username+delimiter+protocol+delimiter+accountName]["id"];
                                    }
                                
                                    //add buddy to buddies
                                    buddies[username+delimiter+protocol+delimiter+accountName]=buddy;
                                    if(oldAlias!=alias){
                                        //update chat box
                                        var id="chatbox"+buddy["id"];
                                        if(dialogBoxList[id]!=null){
                                            dialogBoxList[id].dialog( "option", "title", buddy['alias'] );

                                            $('#'+id+' div.dialog-chat-content div.text-line span.sender-text').each(function(){
                                                $(this).text(alias+':');
                                            });
                                        }
                                    }

                                    if(buddyRows[username+delimiter+protocol+delimiter+accountName]!=null){
                                        updateBuddyRow(buddy,oldStatus);
                                   
                                    }
                                    addBuddyRow(buddy);

                                });
                            }else if(key=="messageList") {
                                //message
                                $.each(val,function(key,val){
                                    var fromAccount="";
                                    var message="";
                                    var time="";

                                    $.each(val,function(key,val){
                                        if(key=="fromAccount"){
                                            var strs=val.toString().split("@");
                                            fromAccount=strs[0];
                                        }else if(key=="message"){
                                            message=val;
                                        }else if(key=="time"){
                                            time=val;
                                        }
                                    });
                                    var id="chatbox"+buddies[fromAccount+delimiter+protocol+delimiter+accountName]["id"];
                                    sendMessage(id,fromAccount,protocol,accountName, message);

                                });
                           
                            }else if(key=="friendRequests"){
                                $.each(val,function(key,val){

                                    var fromAccount="";
                                    $.each(val,function(key,val){
                                        var strs=val.toString().split("@");
                                        fromAccount=strs[0];
                                    });

                                    receiveBuddyRequestFromServer(accountName,fromAccount,protocol);
                                });
                            }else if(key=="error"){
                                alert(accountName + " has been disconnected.");
                                //do thign herero
                                removeBuddiesOfAccount(accountName, protocol);
                                // stop long polling only if no account is online
                                if (accounts.length == 0) {
                                    stopLongPolling();
                                }
                            }
                        });
                    });
                }
            });
               

            //long pulling...
            setTimeout('updateBuddy()',1000);


        }
    });
}

function isValidImageUrl(url) {
    $("<img>", {
        src: url,
        error: function() {
            return false;
        },
        load: function() {
            return true;
        }
    });
}

function updateBuddyRow(buddy,oldStatus){
    var username=buddy['username'];
    var protocol=buddy['protocol'];
    var accountName=buddy['ofAccount'];
    var group=buddy['group'];
    buddyRows[username+delimiter+protocol+delimiter+accountName].remove();
    delete buddyRows[username+delimiter+protocol+delimiter+accountName];
    groups[oldStatus+delimiter+group+delimiter+protocol+delimiter+accountName+delimiter+"n"]-=1;
    if(groups[oldStatus+delimiter+group+delimiter+protocol+delimiter+accountName+delimiter+"n"]==0){
        groups[oldStatus+delimiter+group+delimiter+protocol+delimiter+accountName].remove();
        delete groups[oldStatus+delimiter+group+delimiter+protocol+delimiter+accountName];
        delete groups[oldStatus+delimiter+group+delimiter+protocol+delimiter+accountName+delimiter+"n"];

    }

    
}

function addBuddyRow(buddy){
    var accountName=buddy['ofAccount'];
    var protocol=buddy['protocol'];
    var username=buddy['username'];
    var alias=buddy['alias'];
    var avatar=buddy['avatar'];
    var message=buddy['message'];
    var group=buddy['group'];
    var status=buddy['status'];


    //cut string
    var displayMessage=message;

    
    var displayName=username;
    if(alias.length!=0){
        displayName=alias;
    }
    var displayStr=displayName+displayMessage;
    if(displayStr.length>maxStringLength){
        if(displayName.length>maxStringLength){

            displayName=displayName.substring(0,maxStringLength)+"...";
            displayMessage="";
        }else{
            displayMessage=displayMessage.substring(0,maxStringLength-5-displayName.length)+"...";
        }

    }

    var buddyRow=$('<div class="buddyRow"></div>');
    //window.alert(username);
    buddyRow.append('<div><span class="avatar"><img src="' + avatar+'" alt="'+status+'" width="24px" height="24px" onerror="imageError(this)"/></span><span class="imgStatus"><img src="/images/'+protocol+'_'+status+'.png" alt="'+status+'" width="10px" height="10px"/></span><span class="displayName">'+displayName+'</span><span class="status">'+displayMessage+'</span></div>');
    
    if(groups[status+delimiter+group+delimiter+protocol+delimiter+accountName]==null){
        var id=getNextGroupId();
        var groupRow=$('<div class="buddyGroup" id="group'+id+'"></div>');
        groupRow.append('<div class="groupName"><span class="ui-icon ui-icon-circle-triangle-s"></span><span class="groupNameText">'+group+' of '+accountName+'</span></div>');
        groupRow.append('<div class="groupContent"></div>')
        groupRow.children('div.groupName').bind('click',function(){
            toggleGroup(groupRow);
        });
        $('#'+status).append(groupRow);
        groups[status+delimiter+group+delimiter+protocol+delimiter+accountName]=groupRow;
        groups[status+delimiter+group+delimiter+protocol+delimiter+accountName+delimiter+"n"]=0;
        groups[status+delimiter+group+delimiter+protocol+delimiter+accountName+delimiter+"id"]=id;
        if(accounts[accountName+delimiter+protocol]['groups']==null){
            accounts[accountName+delimiter+protocol]['groups']=new Object();
        }
        accounts[accountName+delimiter+protocol]['groups'][group]=true;
        
    }
    groups[status+delimiter+group+delimiter+protocol+delimiter+accountName].children('.groupContent').append(buddyRow);
    groups[status+delimiter+group+delimiter+protocol+delimiter+accountName+delimiter+"n"]+=1;

    // double click event
    buddyRow.bind('dblclick', function(){
        popupDialog(username, protocol, accountName);
    });
    
    // right click event
    buddyRow.contextPopup({
        title: displayName,
        items: [
        {
            label:'Open chat dialog',
            icon:'icons/shopping-basket.png',
            action:function() {
                popupDialog(username, protocol, accountName);
            }
        },

        {
            label:'Delete',
            icon:'icons/receipt-text.png',
            action:function() {
                popupBuddyDeleteConfirm(username, protocol, accountName);
            }
        }
        ]
    });
    hoverTooltip(buddyRow,buddy);
    buddyRows[username+delimiter+protocol+delimiter+accountName]=buddyRow;
}


function toggleGroup(groupRow){
    var divGroupName=groupRow.children('.groupName');
    if(divGroupName.children('span').attr('class')=='ui-icon ui-icon-circle-triangle-s'){
        divGroupName.children('span.ui-icon-circle-triangle-s').switchClass('ui-icon-circle-triangle-s','ui-icon-circle-triangle-e');
    }else{
        divGroupName.children('span.ui-icon-circle-triangle-e').switchClass('ui-icon-circle-triangle-e','ui-icon-circle-triangle-s');
    }
    groupRow.children('.groupContent').toggle();

        
}

function imageError(img){
    img.src="images/no_avatar.png";
}

function popupDialog(username,protocol,accountName){
    
    var id="chatbox"+buddies[username+delimiter+protocol+delimiter+accountName]["id"];
    if(dialogBoxList[username+delimiter+protocol+delimiter+accountName]==null){
        
        createDialogBox(id,username,protocol,accountName);
            
        
    }else{
        $("#"+id+" div textarea").focus();
        $("#"+id).dialog('moveToTop');
    }

}

function popupBuddyDeleteConfirm(username, protocol, accountName) {
    var confirmBox = '<div id="delete-buddy-dialog-confirm" title="Delete ' + username +'?">' 
    + '<p><span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 20px 0;"></span>'
    + 'Do you want to delete this buddy ?</p></div>';
    $('#dashBoardView').append(confirmBox);
    $( "#delete-buddy-dialog-confirm" ).wijdialog({
        captionButtons: {
            pin: {
                visible: false
            },
            refresh: {
                visible: false
            },
            toggle: {
                visible: false
            },
            minimize: {
                visible: false
            },
            maximize: {
                visible: false
            }
        },
        resizable: false,
        height:140,
        modal: true,
        buttons: {
            Yes: function() {
                sendDeleteToServer($( this ), username, protocol, accountName);
            },
            No: function() {
                $( this ).wijdialog( "close" );
            }
        }
    });
}

function hoverTooltip(buddyRow,buddy){
    buddyRow.hover(function(){

        $('#tooltip').empty();
        
        
        $('#tooltip').append('<img id="avatarTooltip" src="'+buddy['avatar']+'" alt="avatar" width="100px" height="100px" onerror="imageError(this)"/>');


        var name=buddy['username'];
        if(buddy['alias'].length!=0){
            name=buddy['alias'];
        }
        var displayName=name;
        if(displayName.length>maxStringLength){
            displayName=displayName.substring(0,maxStringTooltipLength)+"...";

        }
        var displayMessage=buddy['message'];
        if(displayMessage.length>maxStringLength+20){
            displayMessage=displayMessage.substring(0,maxStringTooltipLength+20)+"...";
        }


        $('#tooltip').append('<p id="displayName" title="'+name+'">'+displayName+'</p>');
        $('#tooltip').append('<p id="tooltip_username">'+buddy['username']+'</p>');
        

        $('#tooltip').append('<p id="tooltip_status"><img src="images/'+buddy['protocol']+'_'+buddy['status']+'.png" alt="'+buddy['status']+'" width="9px" height="9px" />'+buddy['status']+'</p>');
        $('#tooltip').append('<p id="tooltip_group">Group :'+buddy['group']+'(account: '+buddy['ofAccount']+')</p>');
        $('#tooltip').append('<p id="tooltip_message" title="'+buddy['message']+'">'+displayMessage+'</p>');
        //$('#tooltip').append('<button>Delete</button>');

        //        $('#tooltip button').bind('click',function(){
        //            if(confirm("Do you want to delete buddy: "+buddy['alias']+"("+buddy['username']+")")){
        //                sendDeleteToServer(buddy['protocol'],buddy['ofAccount'],buddy['username']);
        //            }
        //        });


        var left=buddyRow.offset().left-398;
        var top=buddyRow.offset().top-48;
        $('#tooltip').css({
            'position':'absolute',
            'top':top,
            'left':left
        });
        $('#tooltip').show();

    },function(){
        
        $('#tooltip').hide();
    });
}








function removeBuddiesOfAccount(accountName,protocol){
    var accountId=accounts[accountName+delimiter+protocol]["id"];

    $('#addBuddy'+accountId).remove();
    $('#addGroup'+accountId).remove();
    
    removeAccountView(accountName, protocol);

    accounts[accountName+delimiter+protocol]=null;
    for(id in buddies){
        var buddy=buddies[id];
        if(buddy!=null&&buddy['ofAccount']==accountName&&buddy['protocol']==protocol){
            
            buddyRows[id].remove();
            delete buddyRows[id];
            var group=buddy['group'];
            var status=buddy['status'];

            groups[status+delimiter+group+delimiter+protocol+delimiter+accountName+delimiter+"n"]-=1;
            if(groups[status+delimiter+group+delimiter+protocol+delimiter+accountName+delimiter+"n"]==0){
                groups[status+delimiter+group+delimiter+protocol+delimiter+accountName].remove();
                delete groups[status+delimiter+group+delimiter+protocol+delimiter+accountName];
                delete groups[status+delimiter+group+delimiter+protocol+delimiter+accountName+delimiter+"n"];

            }
            delete buddies[id];

        }
    }


    
}




function toggleStatusDropdownList(){
    var left=$('#account_status').offset().left;
    var top=$('#account_status').offset().top-60;
    $('#status_drop_list').css({
        'position':'relative',
        'left':left,
        'top':top
    });
    $('#status_drop_list').toggle();



    $('#status_drop_list').mouseleave(function(){
        $('#status_drop_list').hide();
    });
    $('#status_drop_list span').hover(function(){
        $(this).css({
            'background-color':'white'
        })
    },function(){
        $(this).css({
            'background-color':'transparent'
        })
    })

}

function toggleAccountDropdownList(){
    var left=$('#accountbox div').offset().left-30;
    $('#account_drop_list').css({
        'position':'relative',
        'left':left
        
    });
    $('#account_drop_list').mouseleave(function(){
        $('#account_drop_list').hide();
    });
    $('#account_drop_list').toggle();
}


function changeStatus(status){
    $('#account_status').empty();
    $('#account_status').append('<img src="/images/'+status+'-bt.png" alt="'+status+'"/>'+status+'<img id="status_dropdown" src="/images/blackArrowDown.png" alt="dropdown" onclick="initStatusDropdownList()"/>');
    changeModelStatus(status);
}




function setupUI(){
    //$('#add-buddy-dialog form input.add-buddy-button').button();
    //$('#add-group-dialog form input.add-group-button').button();
    //$('#login-chatab-dialog form input.login-chatab-button').button();
    //$('#add-account-dialog form input.add-account-button').button();
    //$('#register-dialog form input.register-button').button();
    //$('#acceptedRequest').button();
    //$('#acceptedAndAddRequest').button();
    //$('#declineRequest').button();

    

    //    $('#your-account').wijmenu({
    //        triggerEvent:'click'
    //    });
    $('#your-account').dropmenu({
        effect  : 'fade',
        speed   : 250,
        timeout : 500
    });

}


function enterPress(id,fromAccount,protocol,accountName,event){
    if(event.keyCode==13){
        var text=$('#'+id+' div textarea').val();
        var message=applyEmoticon(text);
        $('#'+id+' div.dialog-chat-content').append("<div class='text-line'><span class='sender-text'>"+accountName+":</span><span class='text'>"+message+"</span>");
        //alert($('#'+id+' div.dialog-chat-content').html());
        //alert($('#'+id+' div.dialog-chat-content').attr("scrollTop"));
        
        $('#'+id+' div.dialog-chat-content').scrollTop($('#'+id+' div.dialog-chat-content').get(0).scrollHeight);

        $('#'+id+' div textarea').val("");
        sendMessageToServer(protocol,accountName,fromAccount,text);
    }
}

function sendMessage(id,fromAccount,protocol,accountName,message){
    var alias=buddies[fromAccount+delimiter+protocol+delimiter+accountName]['alias'];
    if(dialogBoxList[fromAccount+delimiter+protocol+delimiter+accountName]==null){
        createDialogBox(id,fromAccount,protocol,accountName);
    }
    //    message=message.replace(/&lt;/g, "<");
    //    message=message.replace(/&gt;/g, ">");
    //    while(message.indexOf("\\/") != -1){
    //        message=message.replace("\\/", "/")
    //    }
    message=processMessage(message);

    //alert(message);
    $('#'+id+' div.dialog-chat-content').append("<div class='text-line'><span class='sender-text'>"+alias+":</span><span class='text'>"+message+"</span>");
    $('#'+id+' div.dialog-chat-content').scrollTop($('#'+id+' div.dialog-chat-content').get(0).scrollHeight);


}



function createDialogBox(id,fromAccount,protocol,accountName){

    var dialogBox=$('<div class="dialog-box" id="'+id+'" style="overflow:hidden;">'
        +'<div class="dialog-chat-content"></div>'
        +'<div class="button-bar"><img src="images/smiley/01.gif" alt="emoticon" onclick="showEmoticons(this,\''+id+'\')"></div>'
        +'<div class="input-box">'
        +'<textarea onfocus="this.value = this.value;" onkeyup=enterPress("'+id+'","'+fromAccount+'","'+protocol+'","'+accountName+'",event) rows="2" cols="33"></textarea>'
        +'<button onclick=sendClick("'+id+'","'+fromAccount+'","'+protocol+'","'+accountName+'")>Send</button></div></div>');

    $('#dashBoardView').append(dialogBox);
    $('#'+id+' div.input-box button').button();
    if(chatContents[fromAccount+delimiter+protocol+delimiter+accountName]!=null){
        $('#'+id+' div.dialog-chat-content').append(chatContents[fromAccount+delimiter+protocol+delimiter+accountName]);
        $('#'+id+' div.dialog-chat-content').attr({
            scrollTop: $('#'+id+' div.dialog-chat-content').attr("scrollHeight")
        });
    }

    var buddy=buddies[fromAccount+delimiter+protocol+delimiter+accountName];
    var alias=buddy['alias'];
    var displayName=buddy['usename'];
    if(alias.length!=0){
        displayName=buddy['alias'];
    }
    
    if(displayName.length>maxStringLength){
        displayName=displayName.substring(0,maxStringTooltipLength)+"...";

    }
    $('#'+id).wijdialog({
        modal: false,
        captionButtons: {
            pin: {
                visible: false
            },
            refresh: {
                visible: false
            },
            toggle: {
                visible: false
            },
            minimize: {
                visible: true
            },
            maximize: {
                visible: true
            }
        },
        title: '<img src="/images/'+buddy['protocol']+'_'+buddy['status']+'.png" alt="'+buddy['status']+'" width="10px" height="10px"/> '+displayName,
        width:'300px',
        resizable:true,
        resize: function(event, ui) {
            $('#'+id+' div.dialog-chat-content').height($("#"+id).height()-58);
            $('#'+id+' div.dialog-chat-content').width($("#"+id).width()-2);
            $('#'+id+' div.input-box textarea').width($('#'+id).width()-67);

        },
        position: [leftPositionDialog,topPositionDialog],
        close: function() {
            chatContents[fromAccount+delimiter+protocol+delimiter+accountName]=$('#'+id+' div.dialog-chat-content').children();
            $('#emoticon').hide();
            $("#"+id).wijdialog('destroy');
            $("#"+id).remove();
            delete dialogBoxList[fromAccount+delimiter+protocol+delimiter+accountName];
        }
    //    }).dialogExtend({
    //        "minimize" : true,
    //        "dblclick" : "minimize"
    //
    //    });
    });

    //restore old dialog
    $("div[aria-labelledby='ui-dialog-title-"+id+"']").dblclick(function(){
        $('#'+id).wijdialog("restore");
    });


    leftPositionDialog += 310;
    if(leftPositionDialog >900){
        leftPositionDialog=5;
        topPositionDialog+=273;
        if(topPositionDialog>650){
            leftPositionDialog=5;
            topPositionDialog=78;

        }
    }


    dialogBoxList[fromAccount+delimiter+protocol+delimiter+accountName]=dialogBox;

}

function sendClick(id,fromAccount,protocol,accountName){
    var text=$('#'+id+' div textarea').val();
    var message=applyEmoticon(text);
    $('#'+id+' div.dialog-chat-content').append("<div class='text-line'><span class='sender-text'>"+accountName+":</span><span class='text'>"+message+"</span>");
    $('#'+id+' div.dialog-chat-content').scrollTop($('#'+id+' div.dialog-chat-content').get(0).scrollHeight);

    $('#'+id+' div textarea').val("");
    sendMessageToServer(protocol,accountName,fromAccount,text);
}

function stopLongPolling() {
    longPollingReq.abort();
}

function startLongPolling() {
    updateBuddy();
}

function addBuddy(){
    var val=$('#add-buddy-dialog form select.account-list').val();
    var strs=val.split('(');
    var account=strs[0];
    var protocol=strs[1];
    protocol=protocol.substr(0,protocol.length-1);

    for(id in accounts[account+delimiter+protocol]['groups']){
        $('#add-buddy-dialog form select.group-list').append('<option>'+id+'</option>')
    }
    $('#add-buddy-dialog form select.account-list').change( function(){
        $('#add-buddy-dialog form select.group-list').empty();
        val=$('#add-buddy-dialog form select.account-list').val();
        strs=val.split('(');
        account=strs[0];
        protocol=strs[1];
        protocol=protocol.substr(0,protocol.length-1);

        for(id in accounts[account+delimiter+protocol]['groups']){
            $('#add-buddy-dialog form select.group-list').append('<option>'+id+'</option>')
        }
    });


    $('#add-buddy-dialog').wijdialog({
        modal: true,
        captionButtons: {
            pin: {
                visible: false
            },
            refresh: {
                visible: false
            },
            toggle: {
                visible: false
            },
            minimize: {
                visible: false
            },
            maximize: {
                visible: false
            }
        },
        title: 'Add Buddy',
        height:400,
        width:350,
        resizable:false,
        close: function() {
            $('#add-buddy-dialog form p.error').hide();
            $('#add-buddy-dialog form input.buddyName').val('');
            $('#add-buddy-dialog form input.buddyAlias').val('');
        },
        buttons : {
            Add : function() {
                var val=$('#add-buddy-dialog form select.account-list').val();
                var strs=val.split('(');
                var username=strs[0];
                var protocol=strs[1];
                protocol=protocol.substr(0,protocol.length-1);

                var accountToAdd=$('#add-buddy-dialog form input.buddyName').val();
                var alias=$('#add-buddy-dialog form input.buddyAlias').val();
                var group=$('#add-buddy-dialog form select.group-list').val();
                var regex=/^[a-zA-Z0-9\.-_]{4,32}$/;

                if(!regex.test(accountToAdd)){
                    $('#add-buddy-dialog form p.error').show();
                }else{
                    if(buddies[accountToAdd+delimiter+protocol+username]!=null){
                        $('#add-buddy-dialog form p.error').show();
                    }else{
                        $('#add-buddy-dialog form p.error').hide();
                        addBuddyToServer();
                    }
                }
            }
        }
    }).wijdialog('open');

//    $('#add-buddy-dialog form input.add-buddy-button').bind('click',function(){
//
//
//    });
}

function addGroup(){
    $('#add-group-dialog').wijdialog({
        modal: true,
        captionButtons: {
            pin: {
                visible: false
            },
            refresh: {
                visible: false
            },
            toggle: {
                visible: false
            },
            minimize: {
                visible: false
            },
            maximize: {
                visible: false
            }
        },
        title: 'Add Group',
        height: 350,
        width:350,
        resizable:false,
        close: function() {
            $('#add-group-dialog form p.error').hide();
            $('#add-group-dialog form input.add-group-input').val('');
        },
        buttons : {
            Add : function () {
                var val=$('#add-group-dialog form select.account-list').val();
                var strs=val.split('(');
                var username=strs[0];
                var protocol=strs[1];
                protocol=protocol.substr(0,protocol.length-1);

                var group=$('#add-group-dialog form input.add-group-input').val();
  
                if(group.length>=1&&group.length<=255){
                    $('#add-group-dialog form p.error').hide();
                    addGroupToServer();
                }else{
                    $('#add-group-dialog form p.error').show();
                }
            }
        }
    }).wijdialog('open');
//    $('#add-group-dialog form input.add-group-button').bind('click',function(){
//
//    });
}
function addAccount(){
    $('#add-account-dialog').wijdialog({
        modal: true,
        captionButtons: {
            pin: {
                visible: false
            },
            refresh: {
                visible: false
            },
            toggle: {
                visible: false
            },
            minimize: {
                visible: false
            },
            maximize: {
                visible: false
            }
        },
        title: 'Add Account',
        height:350,
        width:350,
        resizable:false,
        close: function() {
            $('#add-account-dialog form p.error').hide();
            $('#add-account-dialog form input.add-account-password').val('');
            $('#add-account-dialog form input.add-account-username').val('');
        },
        buttons : {
            Add : function() {
                var protocol=$('#add-account-dialog form select.protocol-list').val();
                protocol=protocol.toLowerCase();
                var username=$('#add-account-dialog form input.add-account-username').val();
                var password=$('#add-account-dialog form input.add-account-password').val();

                addAccountToServer($('#add-account-dialog'), username,password,protocol);
            }
        }
    }).wijdialog('open');
//    $('#add-account-dialog form input.add-account-button').bind('click',function(){
//
//        });
}
function initRequestDialog(toAccount,byBuddy,protocol){
    
    for(id in accounts[toAccount+delimiter+protocol]['groups']){
        $('#friend-request-dialog select.group-list').append('<option>'+id+'</option>')
    }
    $('#friend-request-dialog p.request-from-account').html('<div class="label">From: </div>'
        +'<img src="/images/'+protocol+'_online.png" alt="protocol" width="10px" height="10px"/>'
        +byBuddy);
    $('#friend-request-dialog p.request-to').html('<div class="label">To account: </div><img src="/images/'+protocol+'_online.png" alt="protocol" width="10px" height="10px"/>'+toAccount);
    $('#friend-request-dialog').wijdialog({
        modal: true,
        captionButtons: {
            pin: {
                visible: false
            },
            refresh: {
                visible: false
            },
            toggle: {
                visible: false
            },
            minimize: {
                visible: false
            },
            maximize: {
                visible: false
            }
        },
        title: 'Request To <img src="/images/'+protocol+'_online.png" alt="protocol" width="10px" height="10px"/> '+toAccount,
        width:'330px',
        resizable:false,
        close: function() {
            $('#friend-request-dialog select.group-list').empty();
        },
        buttons : {
            Accept : function () {
                acceptRequestToServer( $('#friend-request-dialog'),toAccount,byBuddy,protocol);
            },
            'Accept and Add' : function() {
                var alias=$('#friend-request-dialog input.buddyAlias').val();
                var group=$('#friend-request-dialog select.group-list').val();
                acceptAndAddRequestToServer( $('#friend-request-dialog'), toAccount,byBuddy,protocol,alias,group);
            },
            Decline : function() {
                declineRequestToServer($('#friend-request-dialog'), toAccount,byBuddy,protocol);
            }
        }
    }).dialog('open');

    if(buddies[byBuddy+delimiter+protocol+toAccount]!=null){
        $('#acceptedAndAddRequest').hide();
    }else{
        $('#acceptedAndAddRequest').show();
    }

//    $('#acceptedRequest').bind('click',function(){
//
//    });

//    $('#acceptedAndAddRequest').bind('click',function(){
//
//    });
//
//    $('#declineRequest').bind('click',function(){
//
//    });
}


function decode(value) {
    var encoded = value;
    return decodeURIComponent(encoded.replace(/\+/g,  " "));
}

function processMessage(message){
    message=decode(message);
    message=replaceURLWithHTMLLinks(message);
    message=applyEmoticon(message);
    return message;
}

function replaceURLWithHTMLLinks(text) {
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
    return text.replace(exp,"<a href='$1' target='_blank'>$1</a>");
}

function getNextBuddyId(){
    buddyIdCounter++;
    return buddyIdCounter;
}
function getNextAccountId(){
    accountIdCounter++;
    return accountIdCounter;
}
function getNextGroupId(){
    groupIdCounter++;
    return groupIdCounter;
}


function registerChatab(){
    

    $('#register-dialog').wijdialog({
        modal: true,
        captionButtons: {
            pin: {
                visible: false
            },
            refresh: {
                visible: false
            },
            toggle: {
                visible: false
            },
            minimize: {
                visible: false
            },
            maximize: {
                visible: false
            }
        },
        title: 'Register',
        height: 350,
        width:550,
        resizable:false,
        close: function() {
            $('#register-dialog form p.error').hide();
            $('#register-dialog form p#failRegister').hide();
            $(':input','#register-dialog form')
            .not(':button, :submit, :reset, :hidden')
            .val('')
            .removeAttr('checked')
            .removeAttr('selected');
        },
        buttons : {
            Register : function() {
                var username=$('#register-dialog form input.register-account-username').val();
                var password=$('#register-dialog form input.register-account-password').val();
                var confirm=$('#register-dialog form input.register-account-confirm-password').val();
                if(password!=confirm){
                    $('#register-dialog form p.error').show();
                }else{
                    processChatabRegister($('#register-dialog'), username, password);
                }
            }
        }
    }).wijdialog('open');
//    $('#register-dialog form input.register-button').bind('click',function(){
//
//    });
}

function loginChatab(){
    $('#login-chatab-dialog').wijdialog({
        modal: true,
        captionButtons: {
            pin: {
                visible: false
            },
            refresh: {
                visible: false
            },
            toggle: {
                visible: false
            },
            minimize: {
                visible: false
            },
            maximize: {
                visible: false
            }
        },
        title: 'Login Chatab',
        height:250,
        width:350,
        resizable:false,
        close: function() {
            $('#login-chatab-dialog form p.error').hide();
            $('#login-chatab-dialog form input.login-chatab-password').val('');
            $('#login-chatab-dialog form input.login-chatab-username').val('');
        }, 
        buttons : {
            Login : function() {
                var username=$('#login-chatab-dialog form input.add-account-username').val();
                var password=$('#login-chatab-dialog form input.add-account-password').val();

                processChatabLogin($('#login-chatab-dialog'), username,password);
            }
        }
    }).wijdialog('open');
//    $('#login-chatab-dialog form input.login-chatab-button').bind('click',function(){
//
//    });


}

/**
 * This function is used to render the submenu Register and Login in the menu Chatab
 * This function is called from the controller to render the menu based on the current status of users
 */
function showChatabGuestMenu() {
    $('.logoutChatabMenu').remove();
    $('.chatClients').remove();
		
    $('ul#your-account li ul:first').append('<li class="registerChatabMenu"><a onclick="registerChatab()">Register</a></li>' +
        '<li class="loginChatabMenu"><a onclick="loginChatab()">Login</a></li>');
    //test if after adding things into the menu you do not have to refresh it then remove the dropmenu function, else keep it
    $('#your-account').dropmenu({
        effect  : 'fade',
        speed   : 250,
        timeout : 500
    });
	
}

/**
 * This function is called from the controller to render the menu based on the current status of users
 * When the function is called Register and Login menus must be removed (if it is existed at the moment)
 */
function showChatabMemberUserMenu() {	
    $('.registerChatabMenu').remove();
    $('.loginChatabMenu').remove();

    
    $('ul#your-account li ul:first').append('<li class="chatClient">'
        +'<a onclick="showChatClientDialog()">Chat Client(s)</a>'
        +'</li>');
    $('ul#your-account li ul:first').html();
    $('#your-account').dropmenu({
        effect  : 'fade',
        speed   : 250,
        timeout : 500
    });
  
	
}

// This method will create a dialog for users to change information of a particular
// purple chat account associated with their account.
// There will be 4 input fields and 1 select box.
// 4 input fields are Username, current password, new password, confirm password
// 1 select box is for choosing the new protocol
// at the end of this function, call processChatabUpdateChatClient to send data to server-side
function showChatClientUpdateDialog(username, protocol) {

    var updateChatClient= "/abcd can you put it in";
    var dialog= $('#chatab-client-update-dialog');

    $('#chatab-client-update-dialog form input.update-account-username').attr('value',username);


    dialog.wijdialog({
        modal: true,
        captionButtons: {
            pin: {
                visible: false
            },
            refresh: {
                visible: false
            },
            toggle: {
                visible: false
            },
            minimize: {
                visible: false
            },
            maximize: {
                visible: false
            }
        },
        title: 'Update chat clients',
        height:500,
        width:400,
        resizable:false,
        close: function() {
            $('#chatab-client-update-dialog form p.error').hide();
            $(':input','#chatab-client-update-dialog form')
            .not(':button, :submit, :reset, :hidden')
            .val('')
            .removeAttr('checked')
            .removeAttr('selected');
        },
        buttons : {
            Update : function() {
                var confirm=$('#chatab-client-update-dialog form input.update-account-confirm-password').val();


                var newUsername=$('#chatab-client-update-dialog form input.update-account-username').val();
                var oldPassword=$('#chatab-client-update-dialog form input.update-account-current-password').val();
                var newPassword=$('#chatab-client-update-dialog form input.update-account-new-password').val();
                var newProtocol=$('#chatab-client-update-dialog form select.protocol-list').val();

                if(confirm==newPassword){
                    processChatabUpdateChatClient(dialog, username, protocol, oldPassword, newUsername, newPassword, newProtocol);
                }else{
                    $('#chatab-client-update-dialog form p.error').show();
                }
            }
        }
    });



    
}

function showChatClientDialog() {
    var updateAccountStatusUrl = "/chatab/account-status";
    var outerDiv = '<div id="chat-clients-dialog"></div>';
    $('body').append(outerDiv);
    var chatClientsDialog = $('#chat-clients-dialog');
    // create the dialog
    chatClientsDialog.wijdialog({
        modal: true,
        captionButtons: {
            pin: {
                visible: false
            },
            refresh: {
                visible: false
            },
            toggle: {
                visible: false
            },
            minimize: {
                visible: false
            },
            maximize: {
                visible: false
            }
        },
        title: 'Chat clients',
        height:250,
        width:400,
        resizable:false,
        close: function() {
            
        }, 
        buttons : {
            Refresh : function() {
                getChatClientStatus(updateAccountStatusUrl, chatClientsDialog);
            },
            Edit : function () {
                var val = $('input[name=purpleChatClients]').val();
                var temp = val.split('|');
                var username = temp[0];
                var protocol = temp[1];
                showChatClientUpdateDialog(username, protocol);
            },
            Remove : function () {
                var val = $('input[name=purpleChatClients]').val();
                var temp = val.split('|');
                var username = temp[0];
                var protocol = temp[1];
                processChatabRemoveAccount(chatClientsDialog, username, protocol);
            }
        }
    });
   
    getChatClientStatus(updateAccountStatusUrl, chatClientsDialog);
}

function getChatClientStatus(updateAccountStatusUrl, chatClientsDialog) {
    $.ajax({
        url : updateAccountStatusUrl,
        dataType : 'json',
        beforeSend : function() {
            chatClientsDialog.wijdialog('open');
            chatClientsDialog.parent().block();
        },
        success : function(data) {
            if (data.error) {
                alert ("Application error, please try again later");
            } else {
                var content = '';
                var checked = '';
                for (var index in data) {
                    if (index == 0) {
                        checked = 'checked';
                    }
                    var account = data[index];
                    var html = '<input type="radio" name="purpleChatClients" value="' 
                    + account.username + "|" + account.protocol + '" ' + checked +'>'
                    + '( ' + account.protocol + ' ) ' + account.username + ' [ ' + account.status + ' ]<br/>';
                    content += html;
                }
                chatClientsDialog.html(content);
            }
        },
        error : function(xhr, ajaxOptions, thrownError) {
            
        },
        complete : function() {
            chatClientsDialog.parent().unblock();
        }
    });
}

