
var chat = {
    account: {},
    metaChannel: null,
    server: '.pidelorapido.com',
    bi: '/live/bi.html',
    version: '0.0.1',
    connection: false,
    timer: false,
    channels: [],
    requests: [],
    requesters: [],
    friends: null,
    current: false,
    status: false,
    itimer: 0,
    token: '',
    page: '',
    context: '',
    playSound: false,
    supportOnline: false,
    connected: false,
    support: false,
    to: '',
    oldTitle: '',
    next: 0,
    hasConsole: function() { return (typeof console != 'undefined' && typeof console.log != 'undefined'); },
    debug: function(a) { if (chat.hasConsole()) { console.log(a); } else alert(a); },

    restoreTitle: function() {
        window.setTimeout("document.title = '" + chat.oldTitle + "';", 500);
    },

    initialize: function(u) {
        // window.onError = null;
        var domainparts = document.domain.split(".");
        if (domainparts.length >= 2) {
            document.domain = domainparts[domainparts.length - 2] + "." + domainparts[domainparts.length - 1];
        }
        chat.oldTile = document.title;
        chat.account = u;
        chat.friends = new chatFriends(u.friends);
        chat.server = window.location.protocol + "//" + Math.abs(chat.account.T) % 17 + "." + document.domain;
        chat.initializeIframe();
    },

    mute: function(e) {
        if (chat.playSound) {
            e.style.marginLeft = "-22px";
        } else
            e.style.marginLeft = "0px";

        chat.playSound = !chat.playSound;
    },

    success: function(message) {
        if (message.n == "s") {
            eval(message.c);
        } else if (message.n == "msg") {
            chat.onMessage(message.c.f, message.ci, message.c.m);
        }
    },

    FailureHandler: function(privateToken, alias, error) {
        //alert(error);
    },

    TimeoutHandler: function(privateToken, alias) {
        // pass this.
    },

    toArray: function(obj) {
        if (!obj.length) { return []; } // length must be set on the object,or it is not iterable
        var a = [];

        try {
            a = Array.prototype.slice.call(obj, 0);
        } catch (e) {
            Core.batch(obj, function(o, i) {
                if (0 <= i) {
                    a[i] = o;
                }
            });
        }
        return a;
    },

    showSupport: function() {
        if (!chat.support)
            chat.support = new chatSupport('chatsupprot', { width: 350, height: 200 });
    },

    noAgent: function() {
        chat.support.noAgent();
    },

    removeMember: function(grp, id) {
        for (var i = 0; i < this.friends.length; i++) {
            if (this.friends[i].G == grp) {
                for (j = 0; j < this.friends[i].M.length; j++) {
                    if (this.friends[i].M[j].UserID == id) {
                        this.friends[i].M[j].splice(j, 1);
                        return;
                    }
                }
            }
        }
    },

    addRequest: function(to, name) {
        if (chat.requester(to) != undefined) return;

        for (var i = 0; i < chat.channels.length; i++) {
            for (var j = 0; j < chat.channels[i].members.length; j++) {
                if (chat.channels[i].members[j].UserID == to)
                    return false;
            }
        }
        var tmp;
        if (name == null)
            tmp = new chatRequester({ to: to, width: 280, height: 150 });
        else
            tmp = new chatRequester({ to: to, width: 280, height: 150 });
        chat.requesters.push(tmp);
    },

    closeRequest: function(to) {
        if (chat.requester(to) == undefined) return false;

        chat.requester(to).close();
    },

    addChannel: function(channel, members, messages) {
        if (chat.requesters.length > 0) chat.requesters[0].close();
        if (chat.request(channel) != undefined) {
            chat.request(channel).close();
        }
        if (chat.channel(channel) == undefined) {
            var tmp = new chatChannel({ ci: channel, members: members });
            chat.channels.push(tmp);
        } else {
            chat.channel(channel).show();
        }

        var c = chat.channel(channel);
        var admin = members[0];
        
        if (admin.Role != "support") admin = members[1];
        chat.onMessage(admin.Name, channel, 'Hola, mi nombre es ' + admin.Name + ', en que puedo ayudarte?');
        for (var i = 0; i < messages.length; i++) {
            chat.onMessage(messages[i].f, channel, messages[i].m);
        }
        chat.playSound = true;
    },

    removeChannel: function(channel) {
        if (chat.channel(channel) != undefined) {
            chat.channels.splice(chat.indexOfChannel(channel), 1);
        }
    },

    channel: function(channel) {
        for (i = 0; i < chat.channels.length; i++) if (chat.channels[i].channel == channel) return chat.channels[i];
        return undefined;
    },

    indexOfChannel: function(channel) {
        for (i = 0; i < chat.channels.length; i++) if (chat.channels[i].channel == channel) return i;
        return -1;
    },

    request: function(channel) {
        for (i = 0; i < chat.requests.length; i++) {
            if (chat.requests[i].id == channel)
                return chat.requests[i];
        }
        return undefined;
    },

    requester: function(to) {
        for (i = 0; i < chat.requesters.length; i++)
            if (chat.requesters[i].to == to) return chat.requesters[i];

        return undefined;
    },

    indexOfRequester: function(channel) {
        for (i = 0; i < chat.channels.length; i++) if (chat.channels[i].channel == channel) return i;
        return -1;
    },

    removeRequester: function(to) {
        if (chat.requester(to) != undefined) {
            chat.requesters.splice(chat.indexOfRequester(to), 1);
        }
    },

    channelData: function(channel) {
        for (i = 0; i < chat.channelDatas.length; i++) if (chat.channelDatas[i].channel == channel) return chat.channelDatas[i];
        return undefined;
    },


    add: function(channel, message) {
        if (chat.channel(channel) == undefined) {
            return;
        }
        chat.channel(channel).add(message);
    },

    sortNames: function(channel) {
        if (chat.channel(channel) != undefined) {
            chat.channel(channel).sortNames();
        }
    },

    onConnecting: function() {
        chat.add('info', '<span class="notice"></span>');
    },

    onLeft: function(channel, userId) {
        if (chat.channel(channel) != undefined) {
            chat.onNotice(channel, chat.channel(channel).member(userId).Name + " left.");
            chat.channel(channel).onLeft(userId);
        }
    },

    onRequest: function(ticket) {
        var from = ticket.from;
        var context = ticket.context;
        if (chat.requester(from) != undefined) {
            chat.requester(from).show();
            chat.requester(from).wait(context.ID);
            return;
        } else {
            if (from.UserID == chat.account.Token) return;
            var req = chat.request(from.UserID);
            if (req == undefined) {
                var tmp = new chatRequest(ticket, { width: 315, height: 330 });
                chat.requests.push(tmp);
            }
        }
    },

    onApproved: function(from, channel) {
        chat.addChannel(channel);
    },

    onResume: function(from, channel) {
        if (chat.requester(from)) {
            chat.requester(from).close();
        }
        chat.addChannel(channel, null, false);
    },

    onRejected: function(by) {
        if (chat.requester(by) != undefined) chat.requester(by).onRejected();
        else if (chat.support) chat.support.onRejected();
    },

    onFriendSignOn: function(f) {
        return;
    },

    onFriendSignOff: function(friendId) {
        return;
    },

    signOff: function() {
        chat.friends.disable();
    },

    onTyping: function(channel, from) {
        if (chat.channel(channel) != undefined)
            chat.channel(channel).onTyping(from);
    },

    onChannelClosed: function(channel) {
        if (chat.channel(channel) != undefined) {
            alert('Your room has been closed, please try again later.');
            chat.channel(channel).disable();
        }
    },

    onFriendStatus: function(friendId, status) {
        chat.friends.changeStatus(friendId, status);
        if (chat.channel(friendId) != undefined) chat.channel(friendId).changeStatus(status);
    },

    onMessage: function(from, channel, msg) {
        msg = unescape(msg);
        msg = chat.translateTags(msg);
        
        document.title = from + ": " + msg;
        if (from == chat.account.Name)
            chat.add(channel, '<span class="me">Yo:</span> <span class="message">' + msg + '</span>&nbsp;');
        else chat.add(channel, '<span class="from">' + from + ':</span> <span class="message">' + msg + '</span>&nbsp;');
        if (chat.playSound) player.play();
    },

    onMessageSent: function(res) {
        var mt = res.msg;
        mt.Message = unescape(mt.Message);
        mt.Message = chat.translateTags(mt.Message);
        chat.add(mt.Channel, '<div class="me">Me:</div> <span class="message">' + mt.Message + '</span>&nbsp;');
    },

    translateTags: function(str) {
        var RegExpCode = [['<spc>1<spc>', '\''],['(http://[^\s]+)','<a href="$1">$1</a>'], ['<spc>2<spc>', '?'], ['<spc>3<spc>', '#'], ['<spc>4<spc>', '=']];
        jQuery(RegExpCode).each(function($) {
            var code = new RegExp(this[0], 'igm');
            str = str.replace(code, this[1]);
        });
        return str;
    },

    onJoin: function(channel, member) {
        if (chat.channel(channel) != undefined) {
            if (chat.channel(channel).member(member.UserID) == undefined) {
                chat.channel(channel).onJoin(member);
                chat.onNotice(channel, member.Name + " joined.");
            }
        }
    },

    onNotice: function(channel, msg) {
        chat.add(channel, '<span class="notice">Notice : ' + msg + '</span>');
    },

    onAction: function(from, msg) {
        chat.add(channel, '<span class="notice">' + from + ' <span class="message">' + msg + '</span></span>')
    },

    onSupportOnline: function() {
        chat.supportOnline = true;
        for (var i = 0; i < chat.channels.length; i++) {
            chat.channels[i].updateSupport();
        }

        $('cs_support_image').src = '/live/images/online-support.gif';
    },

    onSupportOffline: function() {
        chat.supportOnline = false;
        for (var i = 0; i < chat.channels.length; i++) {
            chat.channels[i].updateSupport();
        }
        $('cs_support_image').src = '/im/images/offline-support.gif';
    },

    onServerNotice: function(notice) {
        chat.add('info', '<span class="notice">Server notice: ' + notice + '</span>');
    },

    onError: function(error) {
        chat.add('info', '<span class="kick">Error: ' + error + '</span>');
        if (chat.current != 'info') {
            chat.add(chat.current, '<span class="kick">Error: ' + error + '</span>');
        }
    },

    addMember: function(channel, who, operator, voice) {
        if (chat.channel(channel) != undefined) {
            chat.channel(channel).members.add(who, operator, voice);
        }
    },

    renderMembers: function(channel) {
        if (chat.channel(channel) != undefined) {
            chat.channel(channel).members.render();
        }
    },
    initializeIframe: function() {
        if (navigator.appVersion.indexOf("MSIE") != -1) {
            chat.connection = document.createElement('iframe');
            chat.connection.setAttribute('id', 'comet_iframe');
            chat.connection.setAttribute('name', 'comet_iframe_name');
            chat.connection.setAttribute('src', chat.server + chat.bi);
            with (chat.connection.style) {
                left = top = "-100px";
                height = width = "1px";
                visibility = "hidden";
                display = "none";
                position = "absolute";
            }
            document.body.appendChild(chat.connection);
        } else if (navigator.appVersion.indexOf("KHTML") != -1) {
            chat.connection = document.createElement('iframe');
            chat.connection.setAttribute('id', 'comet_iframe');
            chat.connection.setAttribute('name', 'comet_iframe_name');
            chat.connection.setAttribute('src', chat.server + chat.bi);
            with (chat.connection.style) {
                left = top = "-100px";
                height = width = "1px";
                visibility = "hidden";
                display = "none";
                position = "absolute";
            }
            document.body.appendChild(chat.connection);
            // for KHTML browsers
        } else {
            // For other browser (Firefox...)
            chat.connection = document.createElement('iframe');
            chat.connection.setAttribute('id', 'comet_iframe');
            with (chat.connection.style) {
                left = top = "-100px";
                height = width = "1px";
                visibility = "hidden";
                display = 'none';
            }
            chat.iframediv = document.createElement('iframe');
            chat.iframediv.setAttribute('src', chat.server + chat.bi);
            chat.connection.appendChild(chat.iframediv);
            document.body.appendChild(chat.connection);
        }
    }
}


// Used in chatConnectionWindow, array.random(), returns a random element from the array
Array.prototype.random = function(r) {
    var i = 0, l = this.length;
    if (!r) { r = this.length; }
    else if (r > 0) { r = r % l; }
    else { i = r; r = l + r % l; }
    return this[Math.floor(r * Math.random() - i)];
};

// String.trim prototype, used in chatEdtitor.js (and others)
String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, "");
};

function setCookie(name, value) {
    var date = new Date();
    date.setTime(date.getTime() + (90 * 24 * 60 * 60 * 1000));
    var curCookie = name + "=" + escape(value) + "; expires=" + date.toGMTString() + "; path=/; domain=" + LTConfig.domain;
    document.cookie = curCookie;
}

function deleteCookie(name) {
    var cookie_date = new Date();  // current date & time
    cookie_date.setTime(cookie_date.getTime() - 1);
    document.cookie = name += "=; expires=" + cookie_date.toGMTString();
}

function getCookie(name) {
    var results = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');

    if (results)
        return (unescape(results[2]));
    else
        return null;
}

jQuery(document).ready(function($) {

    $("a.livesupport").click(function() {
        chat.addRequest(chat.account.Token, chat.account.Name);
    });
});

