chatDialog = function() {

    /// Public Properties
    var _open = false;

    /// Variables
    var _sendBtnClickHandler = null;
    var _chatTabClickHandler = null;
    var _enableScrollHandler = null;
    var _disableScrollHandler = null;
    var _textOfTabs = [];
    var _noTabs = true;

    /// Public Methods
    function init() {
        _sendBtnClickHandler = sendMessage;
        _chatTabClickHandler = chatTabOnClick;
        _enableScrollHandler = scrollOn;
        _disableScrollHandler = scrollOff;

        /// Add event handlers
        $('#buddy_chat_btn').bind('click', openIfTabs);
        $('#chatDialogSendBtn').bind('click', _sendBtnClickHandler);
        $('#chatDialog .popup_close_blue').bind('click', closeWindow);
        $('#chatDialog .minimize_btn').bind('click', minimizeWindow);
    }

    function tabsOpen() {
      return !_noTabs;
    }

    function openIfTabs() {
        if(tabsOpen()) {
            openWindow();
        } else {
            if (buddyListDialog.messages.length == 0) return;
            var userid = buddyListDialog.messages[buddyListDialog.messages.length - 1].userId; 
            buddyListDialog.pushMessages(userid);
            $('#chatDialog').show();
        }
    }

    function openWindow() {
        /// Open chat window. #chatDialog - ID of HTML element of chat window
        _open = true;
        $('#chatDialog').show();
    }

    function closeWindow() {
        /// Close chat window and clear tabs and clear contents
        $('#chatDialog').hide();
        _open = false;
        //$("#chatTabs").empty();
        //$("#chatContent").empty();
    }

    function minimizeWindow() {
        /// Close chat window without clening tabs & content
        $('#chatDialog').hide();
    }

    function addChatTab(name, id) {

      _noTabs = false;
        if (!_open) {
            openWindow();
        } else {
            openWindow();
        }

  
        // close Alert window
        $('#chatAlerts').hide();
        $('#chatRemoveBuddyDialog').hide();  
        $('#chatToBuddyDialog').hide();
  
        /// Create chat tab if it does not exist
        /// Result HTML:
        /// <div class="chat_active_tab" id="chatTab{id}" onclick="setActiveTab">
        ///    <span class="chat_tab_left"></span>
        ///    <span class="chat_tab_name">
        ///        {text node: tab name}
        ///        <span class="chat_tab_close" onclick="closeTab"></span>
        ////   </span>
        ///    <span class="chat_tab_right"></span>
        /// </div>
        /// Create messages panel
        /// Result HTML: <div class="scroll-pane" id="chatMess{id}"></div>
        if (!$("#chatTab" + id).length) {

            $('<div/>')
                .addClass('chat_active_tab')
                .attr('id', 'chatTab' + id)
                .append(
                    $('<div/>')
                        .addClass('chat_tab_left')
                )
                .append(
                    $('<div/>')
                        .addClass('chat_tab_name')
                        .text(' '+ name +' ')
                        .append(
                            $('<div/>')
                                .addClass('chat_tab_close')
                                .text('x')
                                .attr('title', 'Close this tab')
                                .bind('click', closeTab)
                        )
                )
                .append(
                    $('<div/>')
                        .addClass('chat_tab_right')
                )
                .appendTo("#chatTabs")
                .bind('click', _chatTabClickHandler);

            $('<div/>')
                .addClass('scroll-pane')
                .attr('id', 'chatMess' + id)
                .appendTo('#chatContent')
        }

        /// Visible tab if it exists and hidden (css: display=none)
        $("#chatTab" + id + ":hidden").show();
        $("#chatDialogMessage > textarea").unbind('keypress');
        $("#chatDialogMessage > textarea").keypress(function(evt) {
            switch(evt.which) {
                case 13: 
                  _sendBtnClickHandler();
                break;
            }
        });
        setActiveTab($("#chatTab" + id));
    }

    function getChatTabs() {
        var items = new Array(), jItems = $("#chatTabs > div").get();
        for (var i = 0; i < jItems.length; i++) {
            items[parseInt(jItems[i].id.substr(7))] = '';
        }
        return items;
    }

    function getActiveTab() {
        if ($("#chatTabs > div.chat_active_tab").length > 0)
            return parseInt($("#chatTabs > div.chat_active_tab").attr('id').substr(7));
        else
            return -1;
    }

    function closeTab(h) {
        var tabs = $("div.chat_active_tab:visible, div.chat_tab:visible");
        var target = $(h.target).parent().parent();
        var index = -1;

        target.hide();

        /// To define index this tab
        for (var i = 0; i < tabs.length; i++) {
            if (tabs[i].id == target.attr('id')) { index = i; break; }
        }
        /// To define index next active tab
        index = (index > 0 ? index - 1 : tabs.length > 1 ? 1 : -1);

        if (index == -1) {
            chatDialog.closeWindow();
            _noTabs = true;
        } else {
            setActiveTab($(tabs[index]));
        }

        return false;
    }

    function setActiveTab(el) {
        /// tabs: collection of all tabs (visible and hidden)
        /// width: width of one tab

        var elId = el.attr('id');
        var tabs = $("div.chat_active_tab:visible, div.chat_tab:visible");
        var width = 0;
        var textOldKey = $("#chatTabs > div.chat_active_tab").not(el).attr('id');

        /// Find current active tab, set it NoActive and hidden close button
        /// Save message text from textbox
        if (textOldKey != undefined && textOldKey != null) {
            _textOfTabs[textOldKey] = $("#chatDialogMessage > textarea").attr('value');
        }
        $("#chatTabs > div.chat_active_tab").not(el).attr('class', 'chat_tab').find('.chat_tab_close').hide();
        /// Set Active to new tab and visible close button
        el.attr('class', 'chat_active_tab').find('.chat_tab_close').show();

        /// If quantity of a tab stops more than 3 we calculate offset
        if (tabs.length > 3) {
            width = $(tabs[1]).attr('offsetLeft');
            offset = (el.attr('offsetLeft') - el.attr('offsetWidth'));
            offset = (offset < 0 ? 0 : offset > (width * (tabs.length - 3)) ? (width * (tabs.length - 3)) : offset);
            $("#chatTabs").css({ 'left': -offset + 'px' });
        }
        else {
            $("#chatTabs").css({ 'left': '0px' });
        }
        $("#chatDialogMessage > textarea").attr('value', (_textOfTabs[elId] != undefined ? _textOfTabs[elId] : ""));
        $("#chatContent > div:visible").hide();
        $('#chatMess' + elId.substr(7)).show();
        $('#chatContent').slideScroll({ value: 0, onCallback: _enableScrollHandler, offCallback: _disableScrollHandler });
        $("#chatDialogMessage > textarea").focus();
    }

    function setMessage(messObj, my) {
        /// Exit if exists this message
        if ($('#message' + messObj.messId).length)
            return;

        /// Open chat window if it closed and create chat tab if it not open
        var name = $('#buddyItem' + messObj.userId + ' .buddy_item_user_name').text();
        if (!_open) {
            addChatTab(name, messObj.userId);
        } else {
            openWindow();
            var activeTabId = 0;
            activeTabId = getActiveTab();
            if (activeTabId !=  messObj['userId'])  {
                setActiveTab($("#chatTab" + messObj['userId']));
            }
        }
  
        if (messObj.sendername == null) {
            if (buddyListDialog.messages.length == 0) {
  
                // play sound
                PlaySound('cc_chat_alert');
            }
        }
        /// Build message
        /// Result HTML:
        /// <span class="chat_message" id="message{id}">
        ///    <span class="chat_message_title">
        ///        <span class="chat_message_date"></span>
        ///        <span class="chat_message_name{_my}"></span>
        ///    </span>
        ///    <span class="chat_message_text">{text node: message}</span>
        /// </span>
        messObj.text = messObj.text.toString().replace(/\n/gi, '<br />');
        $('#chatMess' + messObj.userId)
            .append(
                $('<span/>')
                    .addClass('chat_message')
                    .append(
                        $('<span/>')
                        .addClass('chat_message_title')
                        .append(
                            $('<span/>')
                            .addClass('chat_message_date')
                            .html(messObj.localDate)
                        )
                        .append(
                            $('<span/>')
                            .addClass('chat_message_name' + (my ? '_my' : ''))
                            .html(my ? messObj.sendername : name)
                        )
                    )
                    .append(
                        $('<span/>')
                        .addClass('chat_message_text')
                        .html(messObj.text)
                    )
                    .attr('id', 'message' + messObj.messId)
            );
        $('#chatContent').slideScroll({ value: 0, onCallback: _enableScrollHandler, offCallback: _disableScrollHandler });
    }

    /// Private Methods
    function sendMessage() {

        var messageText = '';
        var to = getActiveTab();

        if ((messageText = $('#chatDialogMessage > textarea').attr('value')) == '') return;

        /// Disabled form elements
        $('#chatArea').css("color","#666666");

  
        /// Send message with ajax
        $.ajax({
            type: "POST",
            url: '/chat/TakeATourByRequest.php',
            datatype: 'xml',
            data: { REQ_ID: 'SEND_CHAT_MSG', to: to, msg: messageText },
            success: function(data) {
                /// Add message to your chat tab
                var id = parseInt($('message', data).attr('id'));
                var d = new Date();
                var t = $('message', data).attr('date');
                var hms = t.substr(11, 8).split(':');
                var d2 = new Date(d.getFullYear(), d.getMonth(), d.getDate(), hms[0], hms[1], hms[2], 0);
                d2.setTime(d2.getTime() - d.getTimezoneOffset() * 60 * 1000);
                var message = { "messId": id, "userId": getActiveTab(), "sendername": $('message', data).attr('sendername'), "text": messageText, "serverDate": $('message', data).attr('date'), "localDate": (d2.getHours() < 10 ? "0" + d2.getHours() : d2.getHours()) + ":" + (d2.getMinutes() < 10 ? "0" + d2.getMinutes() : d2.getMinutes()) + ":" + (d2.getSeconds() < 10 ? "0" + d2.getSeconds() : d2.getSeconds()) };
                setMessage(message, true);
                _textOfTabs["chatTab" + to] = null;
                $("#chatDialogMessage > textarea").attr('value', '');
                /// Enable form elements
                 $('#chatArea').css("color","#333");

            },
            error: function(xhr, ajaxOptions, thrownError) {
                alert('jQuery Ajax error! xhr: ' + xhr + '; ajaxOptions: ' + ajaxOptions);
                $('#chatDialog .chat_dialog_send_form *').attr('disabled', false);
            }
        });
    }

    function chatTabOnClick(h) {
        setActiveTab($(h.currentTarget));
        if (buddyListDialog.messages.length == 0) return;
        var userid = buddyListDialog.messages[buddyListDialog.messages.length - 1].userId; buddyListDialog.pushMessages(userid);  
    }

    function scrollOn() {

        $('#chatView').attr('class', 'chat_dialog_view_scroll_on');
    }

    function scrollOff() {
        $('#chatView').attr('class', 'chat_dialog_view_scroll_off');
    }

    function checkOpen() {
      return _open;
    }

    return {
        init: init,
        open: checkOpen,
        tabsOpen: tabsOpen,
        openWindow: openWindow,
        closeWindow: closeWindow,
        monomizeWindow: minimizeWindow,
        addChatTab: addChatTab,
        getChatTabs: getChatTabs,
        getActiveTab: getActiveTab,
        setMessage: setMessage
    }
} ();

  
function EvalSound(soundobj) {
  var thissound=document.getElementById(soundobj);
  thissound.Play();
}

function PlaySound(soundobj) {
    if (navigator.appVersion.indexOf("Win")!=-1) {
        EvalSound(soundobj);
    } else {
        $("#dummysoundspan1").html("<embed src='/images/"+soundobj+".wav' hidden=true autostart=true loop=false />");  
    }  
}
