var SHA1 = (function() {
    var rotate_left = function(n,s) {
        return (n << s) | (n >>> (32 - s));
    };

    var cvt_hex = function(val) {
        var str="";
        var v;

        for(var i = 7; i >= 0; i--) {
            v = (val >>> (i * 4)) & 0x0f;
            str += v.toString(16);
        }

        return str;
    };

    var UTF8Encode = function(string) {
        string = string.replace(/\r\n/g, "\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {
            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            } else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            } else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }
        }

        return utftext;
    };

    return function(value) {
        var i, j;
        var W = new Array(80);
        var H0 = 0x67452301;
        var H1 = 0xEFCDAB89;
        var H2 = 0x98BADCFE;
        var H3 = 0x10325476;
        var H4 = 0xC3D2E1F0;
        var A, B, C, D, E;
        var temp;

        var msg = UTF8Encode(value);

        var msg_len = msg.length;

        var word_array = [];
        for(i = 0; i < (msg_len - 3); i += 4) {
            j = msg.charCodeAt(i) << 24 | msg.charCodeAt(i + 1) << 16 | msg.charCodeAt(i + 2) << 8 | msg.charCodeAt(i + 3);
            word_array.push(j);
        }

        switch(msg_len % 4) {
            case 0:
                i = 0x080000000;
                break;
            case 1:
                i = msg.charCodeAt(msg_len - 1) << 24 | 0x0800000;
                break;
            case 2:
                i = msg.charCodeAt(msg_len - 2) << 24 | msg.charCodeAt(msg_len - 1) << 16 | 0x08000;
                break;
            case 3:
                i = msg.charCodeAt(msg_len - 3) << 24 | msg.charCodeAt(msg_len - 2) << 16 | msg.charCodeAt(msg_len - 1) << 8 | 0x80;
                break;
        }

        word_array.push(i);

        while((word_array.length % 16) != 14) {
            word_array.push(0);
        }

        word_array.push(msg_len >>> 29);
        word_array.push((msg_len << 3) & 0x0ffffffff);

        for (var blockstart = 0; blockstart < word_array.length; blockstart += 16) {
            for(i = 0; i < 16; i++) {
                W[i] = word_array[blockstart + i];
            }

            for(i = 16; i <= 79; i++){
                W[i] = rotate_left(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
            }

            A = H0;
            B = H1;
            C = H2;
            D = H3;
            E = H4;

            for(i = 0; i <= 19; i++) {
                temp = (rotate_left(A,5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
                E = D;
                D = C;
                C = rotate_left(B, 30);
                B = A;
                A = temp;
            }

            for(i = 20; i <= 39; i++) {
                temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
                E = D;
                D = C;
                C = rotate_left(B, 30);
                B = A;
                A = temp;
            }

            for(i = 40; i <= 59; i++) {
                temp = (rotate_left(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
                E = D;
                D = C;
                C = rotate_left(B, 30);
                B = A;
                A = temp;
            }

            for(i = 60; i <= 79; i++) {
                temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
                E = D;
                D = C;
                C = rotate_left(B, 30);
                B = A;
                A = temp;
            }

            H0 = (H0 + A) & 0x0ffffffff;
            H1 = (H1 + B) & 0x0ffffffff;
            H2 = (H2 + C) & 0x0ffffffff;
            H3 = (H3 + D) & 0x0ffffffff;
            H4 = (H4 + E) & 0x0ffffffff;
        }

        temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4);

        return temp.toLowerCase();
    };
})();

String.prototype.trim = function() {
    return $j.trim(this);
};

String.prototype.contains = function(subString) {
    return this.indexOf(subString) !== -1;
};

String.prototype.format = function() {
    var result = "";
    var sym, nextSym;
    
    var argsCnt = 0;
    for (var i = 0, len = this.length; i < len; i++) {
        sym = this.charAt(i);
        
        if (sym == '%') {
            nextSym = this.charAt(++i);
            if (nextSym == '%') {
                result += '%';
                continue;
            }
            
            if (argsCnt >= arguments.length) {
                continue;
            }
            
            if (nextSym == 's' || nextSym == 'f') {
                result += arguments[argsCnt++];
            } else if (nextSym == 'd') {
                result += new Number(arguments[argsCnt++]).toFixed(0);
            }
        } else {
            result += sym;
        }
    }
    
    return result;
};

var evalJSON = function(data) {
    return eval("(" + data + ")");
};

var JSON_MIME_TYPE = "application/json";

var isResponseJSON = function(req) {
    var contentType = req.getResponseHeader("Content-Type");
    
    return contentType != null && contentType.contains(JSON_MIME_TYPE);
};

var lock = function(func) {
    var active = false;
    
    return function() {
        if (active) {
            return;
        }
        active = true;
        
        var args = Array.prototype.slice.call(arguments);
        args.unshift(function() {
            active = false;
        });
        
        try {
            return func.apply(func, args);
        } catch (e) {
            active = false;
            throw e;
        }
    };
};

var Lock = function() {
    this.locked = false;
};
Lock.prototype = {
    acquire: function() {
        return (this.locked ? false : this.locked = true);
    },
    release: function() {
        this.locked = false;
    },
    isLocked: function() {
        return this.locked;
    }
};

jQuery.fn.extend({
    hiddenValue: function(name, base) {
        var value = this.find("[@name='" + name + "']:hidden").val();
        
        if (base !== undefined) {
            return parseInt(value, base);
        }
        
        return value;
    },
    defineOnce: function(uid, func) {
        if (!this.data(uid)) {
            this.data(uid, true);
            
            func.apply(this);
        }
    },
    offsetTop: function() {
        return this.offset().top;
    },
    offsetLeft: function() {
        return this.offset().left;
    },
    visible: function(pred) {
        return this.css("visibility", (pred ? "visible" : "hidden"));
    }
});

jQuery.extend({
    text: function(elem) {
        if (elem.nodeValue !== undefined) {
            return elem.nodeValue;
        } else if (elem.textContent !== undefined) {
            return elem.textContent;
        } else {
            throw new Error("Couldn't detemine attribute for text");
        }
    },
    scroll: function() {
        var offsetX = 0;
        var offsetY = 0;
        
        if (typeof(window.pageYOffset) === 'number') {
            offsetX = window.pageXOffset;
            offsetY = window.pageYOffset;
        } else if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
            offsetX = document.body.scrollLeft;
            offsetY = document.body.scrollTop;
        } else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
            offsetX = document.documentElement.scrollLeft;
            offsetY = document.documentElement.scrollTop;
        }
        
        return {top: offsetY, left: offsetX};
    },
    scrollTop: function() {
        return this.scroll().top;
    },
    scrollLeft: function() {
        return this.scroll().left;
    },
    macFirefox2: function() {
        var userAgent = navigator.userAgent.toLowerCase();
        if (/firefox[\/\s](\d+\.\d+)/.test(userAgent)) {
            var ffversion = new Number(RegExp.$1);
            if (ffversion < 3 && userAgent.indexOf('mac') != -1) {
                return true;
            }
        }

        return false;
    }
});

window.size = function() {
    var w = 0;
    var h = 0;

    if (!window.innerWidth) {
        if (!(document.documentElement.clientWidth === 0)) {
            w = document.documentElement.clientWidth;
            h = document.documentElement.clientHeight;
        } else {
            w = document.body.clientWidth;
            h = document.body.clientHeight;
        }
    } else {
        w = window.innerWidth;
        h = window.innerHeight;
    }

    return {width:w, height:h};
};

var common = (function() {
    var data = {};
    
    $j(function() {
        var sessionId = $j("#jsessionid").val();
        
        $j.extend(data, {
            sessionId: (sessionId.length > 1 ? sessionId.slice(1) : ""), 
            deployVersion: $j("#dVersion").val(), 
            webCallsMuted: $j("#webCallsMuted").val() === "true"
        });
    });
    
    return data;
})();

var getSessionId = function() {
    var value = $j("#jsessionid").val();
    
    return (value.length > 1 ? value.slice(1) : "");
};

var getDeployVersion = function() {
    return value = $j("#dVersion").val();
}

var getFlashMovie = function(movieName) {
    var movie = null;
    
    if (navigator.appName.indexOf("Microsoft") != -1) {
        movie = window[movieName];
    } else {
        movie = document[movieName];
    }
    
    return movie;
};

var FlashContainer = function() {
    this.hiddenFlash = [];
};

FlashContainer.prototype = {
    hide: function($embeds) {
        this.hiddenFlash = [];
        var self = this;
        
        Trigger.allowFlashSizeChange(false);
        
        $embeds.each(function() {
            var $embed = $j(this);
            self.hiddenFlash.push({
                $embed: $embed, 
                height: $embed.height()
            });
            
            if ($j.browser.opera) {
                $embed.parent().visible(false);
            } else {
                $embed.height("0");
            }
        });
    },
    show: function() {
        $j(this.hiddenFlash).each(function() {
            if ($j.browser.opera) {
                this.$embed.parent().visible(true);
            } else {
                this.$embed.height(this.height + "px");
            }
        });
        this.hiddenFlash = [];
        
        Trigger.allowFlashSizeChange(true);
    },
    length: function() {
        return this.hiddenFlash.length;
    }
};

$j(function() {
    attachTopMouseover();
    initButtonEffect();

    var $back = $j("#overContainerBase");
    if ($j.macFirefox2()) {
        $back.css({
            backgroundImage: "url(/res/images/75prs.png)",
            backgroundRepeat: "repeat"
        });
    } else {
        $back.css({
            backgroundColor: "#000",
            opacity: ".75",
            filter: "alpha(opacity=75)"
        });
    }

    $j("#topMiniNav > li > a").each(function() {
        var $a = $j(this);

        $a.hover(
            function() {
                if (!$a.hasClass("nul")) {
                    $a.addClass("btnlog");
                }
            },
            function() {
                $a.removeClass("btnlog");
            }
        );
    });

    $j("#quickTourButton").click(function() {
        quickTour.show();

        return false;
    });

    $j("#langClosed").click(function() {
        languagePopup.show();

        return false;
    });
    
    $j(window).unload(function() {
        var statusMovie = getFlashMovie("statusMovie");
        if (statusMovie && statusMovie.clearAll) {
            statusMovie.clearAll();
        }
    });

    var timeZoneOffset = $j("#timeZoneOffset:hidden").val();
    var tzOffset = new Date().getTimezoneOffset();

    if (tzOffset && -tzOffset != timeZoneOffset) {
        $j.post("/service/member/time-zone/update" + getSessionId(), {offset: -tzOffset});
    }

    var ajaxTimer = null;
    $j(window).bind('activityStart', function(event, type, time) {
        if (type != null) {
            if (ajaxTimer) {
                window.clearTimeout(ajaxTimer);
            }

            ajaxTimer = window.setTimeout(function() {
                $j("img[id^='activityIndicator_']").visible(false);
                $j("#activityIndicator_"+type).visible(true);
            }, time);
        }
    });

    $j(window).bind('activityEnd', function() {
        if (ajaxTimer) {
            window.clearTimeout(ajaxTimer);
        }
        $j("img[id^='activityIndicator_']").visible(false);
    });
});

var channelOverInit = function($baseCont) {
    var Region = {
        NORMAL: 0,
        RIGHT: 1,
        BOTTOM: 2,
        CORNER: 3
    };

    var timerId = null;
    var $activeCont = {length: 0};

    var query = "div.__channelOver";

    ($baseCont ? $baseCont.find(query) : $j(query)).each(function() {
        var $root = $j(this);
        var rootId = $root.attr("id");

        var getRootHiddenValue = function(name) {
            return Number($root.children("input[id$='_" + name + "']").val());
        };

        var columns = getRootHiddenValue("columns");

        var getChannelConts = function() {
            return $root.find("div[id^='" + rootId + "_']");            
        };

        getChannelConts().each(function() {
            var $channelCont = $j(this);
            var $infoBtn = $channelCont.find(".infoLnk");

            var getHiddenValue = function(name, base) {
                var val = $channelCont.children("input[id^='" + name + "_']").val();

                return (base !== undefined ? parseInt(val, 10) : val);
            };

            var index = Number($channelCont.attr("id").split("_", 2)[1]);
            var currentCol = index % columns;
            var lastColumn = Math.max(0, columns - 1);

            var leftClass = getHiddenValue("leftClass");
            var rightClass = getHiddenValue("rightClass");
            var pullHoriz = getHiddenValue("pullHorizontal", 10);
            var hspacer = getHiddenValue("hspacer", 10);

            $channelCont.find("div.__moverRoot").each(function() {
                var $relCont = $j(this);

                var findCont = function(name) {
                    return $relCont.find("div.__" + name);
                };

                var $leftCont = findCont("left");
                var $rightCont = findCont("right");
                var $vspacerCont = findCont("vspacer");
                var $hspacerCont = findCont("hspacer");
                var $absCont = $leftCont.parent();

                $leftCont.children(":first").removeClass("icons");

                var determineRegion = function(lastRow, rows) {
                    if (currentCol === lastColumn || currentCol === (lastColumn - 1)) {
                        return Region.RIGHT;
                    } else {
                        return Region.NORMAL;
                    }
                };

                $infoBtn.bind("mouseenter", function() {
                    if (timerId) {
                        window.clearTimeout(timerId);
                    }
                    if ($activeCont.length) {
                        $activeCont.hide();
                    }

                    timerId = window.setTimeout(function() {
                        var rows = Math.floor($root.height() / $channelCont.height());
                        var lastRow = Math.max(0, rows - 1);
                        var region = determineRegion(lastRow, rows);

                        var toggleFloat = function($cont, right) {
                            if (!right) {
                                $cont.addClass(leftClass);
                                $cont.removeClass(rightClass);
                            } else {
                                $cont.removeClass(leftClass);
                                $cont.addClass(rightClass);
                            }
                        };

                        var left = 0;
                        var top = 0;
                        var hspacerHeight = hspacer;
                        var containers = [];
                        switch (region) {
                            case Region.RIGHT:
                                containers = [$leftCont, $vspacerCont, $rightCont, $hspacerCont];

                                toggleFloat($leftCont, true);
                                toggleFloat($rightCont, false);
                                toggleFloat($vspacerCont, true);

                                left = -pullHoriz;
                                break;
                            default:
                                containers = [$leftCont, $vspacerCont, $rightCont, $hspacerCont];

                                toggleFloat($leftCont, false);
                                toggleFloat($rightCont, true);
                                toggleFloat($vspacerCont, false);
                                break;
                        }

                        $hspacerCont.height(hspacerHeight);

                        $relCont.css({
                            left: (left + "px"),
                            top: (top + "px")
                        });

                        var $bgCont = $relCont.find("div.bg");

                        if (!$bgCont.length) {
                            $bgCont = $j("<div class='bg'></div>");
                        } else {
                            $bgCont.css("display", "block");
                        }

                        $bgCont.appendTo($absCont);

                        $j(containers).each(function() {
                            $j(this).appendTo($absCont);
                        });

                        $activeCont = $relCont;
                        $relCont.show();
                        timerId = null;
                    }, 200);
                });
                
                $relCont.parent().bind("mouseleave", function() {
                    window.clearTimeout(timerId);
                    $relCont.hide();

                    if ($j.browser.msie) {
                        $relCont.find("div.bg").remove();
                    }
                });
            });
        });
    });
};

var initStreamDesc = function(text) {   
    if (text != "" && text != null) {
        $j("#chDescBlock").show();
        $j("#descFull").text(text);
        
        attachTextEffect("#postCont", "#descFull");
    } 
}

var attachTextEffect = function(linkCnt, fullCnt) {
    var $fullCnt = $j(fullCnt); 

    var compact = true;
    var running = false;
        
    var getShortDescription = function(fullDescription) {
        var index = fullDescription.indexOf(" ", 240);
        if (index != -1) {
            $j(linkCnt).show();
            return fullDescription.substr(0, index) + "...";
        } else {
            $j(linkCnt).hide();
            return fullDescription;
        }
    }
        
    var $fullDesc = $j(fullCnt).text();
    var $shortDesc = getShortDescription($fullDesc);      

    $fullCnt.show();
    $fullCnt.text($shortDesc);
        
    var compactHeight = $fullCnt.height();
    var fullHeight = compactHeight;
        
    $j(linkCnt + " > a").unbind('click');
    $j(linkCnt + " > a").click(function() {
        if (running) {
            return false;
        }
            
        running = true;

        if (!compact) {
            $fullCnt.animate({height: compactHeight != 0 ? compactHeight + "px" : "100%"}, "normal", "linear", function() {
                $fullCnt.text(getShortDescription($fullDesc)); 
                
                $fullCnt.css({
                    overflow: "visible", 
                    height: compactHeight != 0 ? compactHeight + "px" : "100%"
                });
                    
                compactHeight = $fullCnt.height();
                running = false;
            });           
        } else {
            $fullCnt.text($fullDesc); 
                                
            $fullCnt.animate({height: fullHeight != compactHeight ? fullHeight + "px" : "100%"}, "normal", "linear", function(){  
                $fullCnt.css({
                    overflow: "visible", 
                    height: "100%"
                });
                    
                fullHeight = $fullCnt.height();
                running = false;  
            }); 
                
        }
        compact = !compact; 
            
        return false;
    });
}

var attachSlider = function(link, cont) {
    var $cont = $j(cont), 
        $hiddenRows = $cont.children("div:hidden"), 
        height = $cont.children("div:eq(0)").height(), 
        compactHeight = $cont.height(), 
        fullHeight = compactHeight + ($hiddenRows.length * height), 
        compact = true, 
        running = false;
    
    if ($j.browser.msie) {
        var $hiddenInfos = $j("div.infoLnk", $hiddenRows);
    }

    $j(link).click(function() {
        if (running) {
            return false;
        }
        running = true;

        if (compact) {
            if ($j.browser.msie) {
                $hiddenInfos.hide();
            }
            
            $cont.css({
                overflow: "hidden", 
                height: compactHeight + "px"
            });

            $hiddenRows.css("display", "block");

            $cont.animate({height: fullHeight + "px"}, "normal", "linear", function() {
                if ($j.browser.msie) {
                    $hiddenInfos.show();
                }
                
                $cont.css({
                    overflow: "visible",
                    height: "auto"
                });
                running = false;
                compact = false;
            });
        } else {
            $cont.css("overflow", "hidden");
            
            if ($j.browser.msie) {
                $hiddenInfos.hide();
            }
            
            $cont.animate({height: compactHeight + "px"}, "normal", "linear", function() {
                $hiddenRows.css("display", "none");
                $cont.css({
                    overflow: "visible", 
                    height: "auto"
                });
                running = false;
                compact = true;
            });
        }

        return false;
    });
};

var editTags = function() {
    var deleteTag = function($img, cid, tid) {
        $j.getJSON("/service/channel/tags/delete" + getSessionId(), {cid: cid, tid: tid}, 
        function (data) {
            if (data.result) {
                $img.parent().remove();
                
                if (!$j("#tagsCont > a").length) {
                    $j("#tagsCont > div.hr").hide();
                }
            }
                
            var displayStyle = (data.showAddCont ? 'block' : 'none');
            $j("#tagsAddCont").css("display", displayStyle);
        }
    );
    };
    
    var attachDeleteHandlers = function() {
        $j("#tagsCont img[id^='del_']").each(function() {
            var parts = $j(this).attr("id").split("_", 3);
            var cid = parts[1];
            var tid = parts[2];

            $j(this).click(function() {
                deleteTag($j(this), cid, tid);
                return false;
            });
        });
    };
    
    var attachAddHandler = function() {
        $j("#addTag").click(function() {
            var $textarea = $j("textarea[id^='tagsTextarea_']");
            var parts = $textarea.attr("id").split("_", 2);
            var cid = parts[1];

            var value = $textarea.val().trim();

            if (!value.length) {
                return false;
            }
            
            var req = $j.post("/service/channel/tags/add" + getSessionId(), {cid:cid, tags: value}, 
            function(data) {
                if (isResponseJSON(req)) {
                    blockedPopup.show();
                } else {
                    $j("#tagsContRoot").replaceWith(data);
                    attachDeleteHandlers();
                    attachAddHandler();
                    initButtonEffect();
                }
                
                $textarea.val("");
            }
        );
            
            return false;
        });
    };
    
    attachDeleteHandlers();
    attachAddHandler();
};

var editFavourites = (function() {
    var execute = function(add, $addButton, $removeButton, cid, accessDenied) {
        $j.getJSON("/service/favourites/" + (add ? "add" : "remove") + getSessionId(), {cid: cid}, 
        function(data) {
            if (data.response == "OK") {
                if (add) {
                    $addButton.css("display", "none");
                    $removeButton.css("display", "inline");
                } else {
                    $removeButton.css("display", "none");
                    if (accessDenied == "false") {
                        $addButton.css("display", "inline");
                    }
                }
            }
        }
    );
    };
    
    var query = "[favType='add']";
        
    return function($cont) {
        ($cont ? $cont.find(query) : $j(query)).each(function() {
            var $addButton = $j(this);
            var $removeButton = $addButton.next();

            var cid = $addButton.attr("cid");
            var accessDenied = $addButton.attr("access");

            $addButton.defineOnce("addToFavourites", function() {
                $addButton.click(function() {
                    if (accessDenied == "false") {
                        execute(true, $addButton, $removeButton, cid, accessDenied);
                    }

                    return false;
                });
            });
            
            $removeButton.defineOnce("removeFromFavourites", function() {
                $removeButton.click(function() {
                    execute(false, $addButton, $removeButton, cid, accessDenied);
                    return false;
                });
            });
        });
    };
})();

var SpyEvent = {
    BLOCK_MEMBER: "blockMember", 
    UNBLOCK_MEMBER: "unblockMember", 
    ADD_FRIEND: "addFriend", 
    REMOVE_FRIEND: "removeFriend",
    
    BLOCK_MEMBER_EXTERNAL: "blockMemberExternal", 
    UNBLOCK_MEMBER_EXTERNAL: "unblockMemberExternal", 
    ADD_FRIEND_EXTERNAL: "addFriendExternal", 
    REMOVE_FRIEND_EXTERNAL: "removeFriendExternal", 
    
    ALLOW_FLASH_SIZE_CHANGE: "allowFlashSizeChange"
};

var Trigger = {
    addFriend: function(uid) {
        $j(window).trigger(SpyEvent.ADD_FRIEND_EXTERNAL, [uid]);
    }, 
    removeFriend: function(uid) {
        $j(window).trigger(SpyEvent.REMOVE_FRIEND_EXTERNAL, [uid]);
    }, 
    blockMember: function(uid) {
        $j(window).trigger(SpyEvent.BLOCK_MEMBER_EXTERNAL, [uid]);
    }, 
    unblockMember: function(uid) {
        $j(window).trigger(SpyEvent.UNBLOCK_MEMBER_EXTERNAL, [uid]);
    }, 
    allowFlashSizeChange: function(yes) {
        $j(window).trigger(SpyEvent.ALLOW_FLASH_SIZE_CHANGE, [yes]);
    }
};

var editRelationships = (function() {
    var addToFriendsQuery = "a[@id^=addToFriends_]";
    var removeFromFriendsQuery = "a[@id^=removeFromFriends_]";
    var blockMemberQuery = "a[@id^=blockMember_]";
    var unblockMemberQuery = "a[@id^=unblockMember_]";
    
    var showAdd = function(show, uid) {
        $j("a[@id=addToFriends_" + uid + "]").css("display", (show ? 'inline' : 'none'));
        $j("a[@id=removeFromFriends_" + uid + "]").css("display", (show ? 'none' : 'inline'));
        
        if (!show) {
            showBlock(true, uid);
        }
    };
    
    var showBlock = function(show, uid) {
        $j("a[@id=blockMember_" + uid + "]").css("display", (show ? 'inline' : 'none'));
        $j("a[@id=unblockMember_" + uid + "]").css("display", (show ? 'none' : 'inline'));
        
        $j("img[@id=blockedIcon_" + uid + "]").css("display", (show ? 'none' : 'inline'));
    };
   
    var addToFriends = lock(function(unlock, uid) {
        showAdd(false, uid);
        
        $j.getJSON("/service/friends/add" + getSessionId(), {uid: uid}, 
        function() {
            $j(window).trigger(SpyEvent.ADD_FRIEND, [uid]);
            unlock();
        }
    );
    });
    
    var removeFromFriends = lock(function(unlock, uid) {
        showAdd(true, uid);
        
        $j.getJSON("/service/friends/remove" + getSessionId(), {uid: uid}, 
        function() {
            $j(window).trigger(SpyEvent.REMOVE_FRIEND, [uid]);
            unlock();
        }
    );
    });
    
    var blockMember = lock(function(unlock, uid) {
        showBlock(false, uid);
        
        $j.getJSON("/service/friends/block" + getSessionId(), {uid: uid}, 
        function() {
            $j(window).trigger(SpyEvent.BLOCK_MEMBER, [uid]);
            unlock();
        }
    );
    });
    
    var unblockMember = lock(function(unlock, uid) {
        showBlock(true, uid);

        $j.getJSON("/service/friends/unblock" + getSessionId(), {uid: uid}, 
        function() {
            $j(window).trigger(SpyEvent.UNBLOCK_MEMBER, [uid]);
            unlock();
        }
    );
    });
    
    var attachAction = function($cont, query, definedName, actionFunc) {
        ($cont ? $cont.find(query) : $j(query)).each(function() {
            $j(this).defineOnce(definedName, function() {
                $j(this).click(function() {
                    var uid = $j(this).attr("spy_uid");
                    
                    actionFunc(uid);
                    
                    return false;
                });
            });
        });
    };
    
    $j(window).bind(SpyEvent.ADD_FRIEND_EXTERNAL, function(event, uid) {
        showAdd(false, uid);
    });
    
    $j(window).bind(SpyEvent.REMOVE_FRIEND_EXTERNAL, function(event, uid) {
        showAdd(true, uid);
    });
    
    $j(window).bind(SpyEvent.BLOCK_MEMBER_EXTERNAL, function(event, uid) {
        showBlock(false, uid);
    });
    
    $j(window).bind(SpyEvent.UNBLOCK_MEMBER_EXTERNAL, function(event, uid) {
        showBlock(true, uid);
    });
    
    return function($cont) {
        attachAction($cont, addToFriendsQuery, "addToFriends", addToFriends);
        attachAction($cont, removeFromFriendsQuery, "removeFromFriends", removeFromFriends);
        attachAction($cont, blockMemberQuery, "blockMember", blockMember);
        attachAction($cont, unblockMemberQuery, "unblockMember", unblockMember);
    };
})();

var attachPeopleMouseOver = function($baseCont) {
    var timerId = null;
    var $activeCont = null;
    var query = "div[@id^=peopleOver_]";
    
    ($baseCont ? $baseCont.find(query) : $j(query)).each(function() {
        var $peopleOver = $j(this);
        var $avatar = $peopleOver.parent().children("a");
        
        $avatar.bind("mouseenter", function() {
            if (timerId) {
                window.clearTimeout(timerId);
            }
            if ($activeCont) {
                $activeCont.hide();
            }

            timerId = window.setTimeout(function() {
                $activeCont = $peopleOver;
                $peopleOver.show();
                timerId = null;
            }, 200);
        });
        
        var out = function() {
            if (timerId) {
                window.clearTimeout(timerId);
            }
            
            $peopleOver.hide();
        };
        
        $peopleOver.bind("mouseleave", out);
        $peopleOver.parent().bind("mouseleave", out);
    });
    
    editRelationships();
};

var initPersonMouseOver = function($root) {
    var Region = {
        TOP: 0, 
        BOTTOM: 1
    };
    
    var LEFT = -2;
    var TOP = -2;
    var AVATAR_HEIGHT = 31;
    
    var timerId = null;
    var $activeCont = null;
    var $containerBottom = $j("#containerBottom");
    
    var query = "div[@id^='memberMOver_']";
    
    ($root ? $root.find(query) : $j(query)).each(function() {
        var $cont = $j(this);
        
        $cont.defineOnce("personMouseOver", function() {
            var $avatarContHover = $cont.find("div[@id^='avatarContHover_']");
            
            if (!$avatarContHover.length) {
                return;
            }
            
            var hoverContId = $avatarContHover.attr("id");
            var id = hoverContId.slice(hoverContId.indexOf("_") + 1);
            var $absCont = $cont.children("div");
            var $avatarCont = $j("#avatarCont_" + id);

            

            var contId = $cont.hiddenValue("contId");
            var $masterCont = {length: 0};
            if (contId) {
                $masterCont = $j("#" + contId);
            }

            var getTopSpace = function() {
                if ($masterCont.length) {
                    return ($avatarCont.offset().top + AVATAR_HEIGHT) - $masterCont.offset().top;
                } else {
                    return $avatarCont.offset().top;
                }
            };

            var getBottomSpace = function() {
                if ($masterCont.length) {
                    return ($masterCont.offset().top + $masterCont.height()) - $avatarCont.offset().top;
                } else {
                    return $containerBottom.offset().top - 20 - $avatarCont.offset().top;
                }
            };

            var over = function() {
                var topSpace = getTopSpace();
                var bottomSpace = getBottomSpace();
                
                var absHeight = $absCont.height();
                var absTop = TOP;
                var regionVert = Region.TOP;

                if (!$masterCont.length) {
                    if (bottomSpace < absHeight) {
                        regionVert = Region.BOTTOM;
                    }
                } else {
                    if ((bottomSpace < absHeight) && (topSpace >= absHeight)) {
                        regionVert = Region.BOTTOM;
                    }
                }

                if (regionVert == Region.BOTTOM) {
                    absTop = -(absHeight - AVATAR_HEIGHT);
                }

                $absCont.css({
                    left: LEFT + "px",
                    top: absTop + "px"
                });
            };

            $cont.parent().hover(
            function() {
                if (timerId) {
                    window.clearTimeout(timerId);
                }
                if ($activeCont) {
                    $activeCont.hide();
                }

                timerId = window.setTimeout(function() {
                    $activeCont = $cont;
                    $cont.show();
                        
                    over();

                    timerId = null;
                }, 200);
            }, 
            function() {
                if (timerId) {
                    window.clearTimeout(timerId);
                }
                $cont.hide();
            }
        );
        });
    });
};
    
var initButtonEffect = function($cont) {
    var yellowQuery = ".btnYellow";
    var blueQuery = ".btnBlue";
    
    var overHandler = function(prefix) {
        var $btn = $j(this);
        
        $btn.defineOnce("hoverEffectAttached", function() {
            $btn.hover(
            function() {
                if (!$btn.hasClass(prefix + "down") && !$btn.hasClass(prefix + "dsbl")) {
                    $btn.addClass(prefix + "over");
                }
            },
            function() {
                $btn.removeClass(prefix + "over");
            }
        );
        });
    };
    
    ($cont ? $cont.find(yellowQuery) : $j(yellowQuery)).each(function() {
        overHandler.apply(this, ["btnYellow"]);
    });
    
    ($cont ? $cont.find(blueQuery) : $j(blueQuery)).each(function() {
        overHandler.apply(this, ["btnBlue"]);
    });
};

var scrollToFocusable = function() {
    window.scrollTo(0, $j("[focusable='true']").offsetTop());
};

var attachTop20Sliders = function() {
    attachSlider("#topVideo20Show", "#topVideo20");
    attachSlider("#topRadio20Show", "#topRadio20");
};

var FlashPopup = function(id) {
    this.id = id;
    this.update = null;
    this.flashCont = new FlashContainer();
};

FlashPopup.prototype = {
    show: function(args) {
        var $contBack = $j("#overContainerBase");
        var $cont = $j("#overContainer");
        $cont.children("#" + this.id).remove();
        
        var $mainCont = null;
        
        if (args.mainCont) {
            $mainCont = args.mainCont;
        } else {
            $mainCont = $j("<div id='" + this.id + "' class='centered' style='z-index:105;display:none;'>&nbsp;</div>");
        }
        $mainCont.appendTo($cont);
        
        this.update = function() {
            var marginTop = Math.floor(($j(window).height() - $mainCont.height()) / 2);
            
            $mainCont.css("marginTop", $j.scrollTop() + marginTop + "px");
        };
        
        $j(window).bind('scroll', this.update);
        
        this.flashCont.hide($j("embed:visible,object:visible"));
        
        $contBack.show();
        $cont.show();
        $mainCont.show();
        
        if (flashDetection.noFlash) {
            flashDetection.getPopupData(this.id).appendTo($mainCont);
        } else {
            args.addHandler();
        }
        
        this.update();
    }, 
    hide: function() {
        var $contBack = $j("#overContainerBase");
        var $cont = $j("#overContainer");
        
        if (this.closeStarted) {
            return;
        }

        this.closeStarted = true;

        var self = this;
        window.setTimeout(function() {
            $j(window).unbind('scroll', self.update);
            $cont.children("#" + self.id).remove();
            $cont.hide();
            $contBack.hide();

            self.flashCont.show();

            self.closeStarted = false;
        }, 1);
    }
};

var changeRegion = {
    popup: new FlashPopup("changeRegionCont"), 
    
    show: function(pred, url) {
        if (pred) {
            this.popup.show({
                addHandler: function() {
                    var flashObject = new SWFObject("/res/swf/world_map/worldmap.swf?v=" + getDeployVersion(), "mymovie", "793", "511", "8", "#3b3b3b");
                    flashObject.addParam("quality", "high");
                    flashObject.addParam("menu", "false");
                    flashObject.addVariable("configXML", "/res/swf/config.xml");
                    flashObject.addVariable("locale", $j("#localeLocation").val());
                    flashObject.addVariable("curPage", url);
                    flashObject.addVariable("flags", "/res/flags/");
                    flashObject.addVariable("userLocation", $j("#countryCd").val());
                    flashObject.addVariable("mapLocale", "/res/locale/loc_map_" + $j("#locale").val() + ".xml");
                    flashObject.write("changeRegionCont");
                }
            });
        } else {
            this.popup.hide();
        }
    }
};

var uploadRecord = {
    popup: new FlashPopup("uploadRecordCont"), 
    
    show: function(cid, video) {
        if (!common.webCallsMuted) {
            this.unmute = true;
            webCalls.muteCall(true);
        }
        
        this.popup.show({
            mainCont: $j("<div id='uploadRecordCont' class='centered' style='z-index:105;display:none;'>" + 
                "<div id='uploadRecordSubCont1' class='centered'>&nbsp;</div>" + 
                "<div id='uploadRecordSubCont2' class='centered' style='margin-left:29px;'>&nbsp;</div>" + 
                "</div>"), 
            addHandler: function() {
                var uploaderObject = new SWFObject("/res/swf/upload/videouploader.swf?v=" + getDeployVersion(), "uploadRecordMovie", "456", "236", "8", "#333333");
                uploaderObject.addParam("quality", "high");
                uploaderObject.addParam("menu", "false");
                uploaderObject.addVariable("configXML", "/res/swf/config.xml");
                uploaderObject.addVariable("locale", "/res/locale/loc_" + $j("#locale").val() + ".xml");
                uploaderObject.addVariable("serverIp", $j("#uploadRecordIp").val());
                uploaderObject.addVariable("cid", cid);
                uploaderObject.addVariable("recordType", (video ? "video" : "audio"));
                uploaderObject.write("uploadRecordSubCont1");

                var bannerObject = new SWFObject("/res/swf/banners/upload_banner.swf?v=" + getDeployVersion(), "recordBannerMovie", "486", "110", "8", "#333333");
                bannerObject.addParam("quality", "high");
                bannerObject.addParam("wmode", "transparent");
                bannerObject.addParam("menu", "false");
                bannerObject.addVariable("configXML", "/res/swf/config.xml");
                bannerObject.addVariable("locale", "/res/locale/loc_" + $j("#locale").val() + ".xml");
                bannerObject.write("uploadRecordSubCont2");
            }
        });
    }, 
    hide: function() {
        if (this.unmute) {
            webCalls.muteCall(false);
        }
        this.popup.hide();
    }
};

var quickTour = {
    popup: new FlashPopup("quickTourCont"), 
    flashCont: new FlashContainer(), 
    
    show: function() {
        this.popup.show({
            addHandler: function() {
                var flashObject = new SWFObject("/res/swf/quickTour/quickTour.swf?v=" + getDeployVersion(), "tourMovie", "960", "500", "8", "#333333");
                flashObject.addParam("quality", "high");
                flashObject.addParam("menu", "false");
                flashObject.addVariable("locale", "/res/locale/loc_qt_" + $j("#locale").val() + ".xml");
                flashObject.write("quickTourCont");
            }
        });
    },
    hide: function() {
        this.popup.hide();
    }
};

var guestRegistration = {
    popup: new FlashPopup("guestRegCont"), 
    
    show: function(pred) {
        if (pred) {
            this.popup.show({
                addHandler: function() {
                    var flashObject = new SWFObject("/res/swf/register/reg_onfly.swf?v=" + getDeployVersion(), "mymovie", "617", "310", "8", "#333333");
                    flashObject.addParam("quality", "high");
                    flashObject.addParam("menu", "false");
                    flashObject.addVariable("configXML", "/res/swf/config.xml");
                    flashObject.addVariable("locale", $j("#localeLocation").val());
                    flashObject.addVariable("noemail", "false");
                    flashObject.write("guestRegCont");
                }
            });
        } else {
            this.popup.hide();
        }
    }
};

var openComplainBlogPostWnd = function () {
    if (!this.complainPopup) {
        this.complainPopup = new FlashPopup("complainCont");
    }
    
    this.complainPopup.show({
        addHandler: function() {
            var flashObject = new SWFObject("/res/swf/offline_page/Complain.swf?v=" + getDeployVersion(), "complainMovie", "580", "290", "9.0.60", "#EEEEEE");
            flashObject.addParam("align", "middle");
            flashObject.addParam("loop", "false");
            flashObject.addParam("quality", "high");
            flashObject.addParam("allowFullScreen", "true");
            flashObject.addParam("allowScriptAccess", "sameDomain");
            flashObject.addVariable("locale", $j("#locale:hidden").val());
            flashObject.addVariable("streamId", $j("#complainForm [name='pid']:hidden").val());
            flashObject.write("complainCont");
        }
    });
};

var closeComplainBlogPostWnd = function() {
    this.complainPopup.hide();
};

var postAccessRequest = (function() {
    var $overContainerBack = null;
    var $overContainer = null;
    var $rootCont = null;
    var $rootContInner = null;
    var $streamHeader = null;
    var $recordHeader = null;
    var $streamLabel = null;
    var $recordLabel = null;
    var flashCont = new FlashContainer();
    var postId = null;
    var postUrl = null;
    var record = false;
    
    var obj = {
        show: function(pid, isRecord, url) {
            postId = pid;
            postUrl = url;
            record = isRecord;
            flashCont.hide($j("embed,object"));
            
            if (record) {
                $streamHeader.hide();
                $streamLabel.hide();
                $recordHeader.show();
                $recordLabel.show();
            } else {
                $recordHeader.hide();
                $recordLabel.hide();
                $streamHeader.show();
                $streamLabel.show();
            }
            
            this.update = function() {
                var marginTop = Math.floor(($j(window).height() - $rootContInner.height()) / 2);
                $rootCont.css("marginTop", $j.scrollTop() + marginTop + "px");
            };

            $j(window).bind('scroll', this.update);

            $overContainerBack.show();
            $overContainer.show();
            $rootCont.show();
            this.update();
            
            $rootCont.find("input[@name=password]").focus();
        }, 
        hide: function() {
            $rootCont.hide();
            $overContainer.hide();
            $overContainerBack.hide();

            $j(window).unbind('scroll', this.update);

            flashCont.show();
        }
    };

    $j(function() {
        $overContainerBack = $j("#overContainerBase");
        $overContainer = $j("#overContainer");
        $rootCont = $j("#postAccessRequestCont");
        $rootContInner = $rootCont.children(":first");

        $streamHeader = $j("#postAccessRequestStreamProtected");
        $streamLabel = $j("#postAccessRequestStreamPassword");
        $recordHeader = $j("#postAccessRequestRecordProtected");
        $recordLabel = $j("#postAccessRequestRecordPassword");
        
        var $form = $rootCont.find("form");
        var $passwordInput = $form.children("input[@name=password]");
        var $passwordError = $form.children("span");

        var submit = lock(function(unlock) {
            var value = $passwordInput.val().trim();

            if (!value.length) {
                $passwordError.show();
                unlock();
            } else {
                $j.post("/service/post/password/validate" + getSessionId(), {pid: postId, password: SHA1(value)},
                function(data) {
                    if (data.response === "OK") {
                        $passwordInput.val("");
                        $passwordError.hide();
                        obj.hide();
                            
                        window.location.href = postUrl;
                    } else {
                        $passwordError.show();
                    }
                        
                    unlock();
                }, "json"
            );
            }

            return false;
        });

        $j("#postAccessRequestSubmit").click(submit);

        $passwordInput.keypress(function(e) {
            if (e.which == 13) {
                e.preventDefault();
                submit();
            }
        });

        $j("#postAccessRequestCancel").click(function() {
            $passwordInput.val("");
            $passwordError.hide();
            obj.hide();

            return false;
        });
    });

    return obj;
})();

var quickCreate = (function() {
    var $rootCont = null;
    var $rootContInner = null;
    var $header = null;
    var $guestHeader = null;
    var $desc = null;
    var $guestDesc = null;
    var $agreeInput = null;
    var $videoButton = null;
    var $radioButton = null;
    var flashCont = new FlashContainer();
    
    return {
        init: function() {
            $rootCont = $j("#quickRootCont");
            $rootContInner = $rootCont.children(":first");
            $agreeInput = $j("#quickAgreeInput");
            
            $guestHeader = $j("h2 + h2", $rootCont);
            $header = $guestHeader.prev();
            
            $guestDesc = $j("p > span + span", $rootCont);
            $desc = $guestDesc.prev();
            
            var $videoHidden = $rootCont.find("input[name='video']:hidden");
            var $cancelInput = $j("#quickCancelInput");
            $videoButton = $j("#quickVideoButton");
            var $videoInput = $videoButton.find("input");
            $radioButton = $j("#quickRadioButton");
            var $radioInput = $radioButton.find("input");
            
            var self = this;
            $cancelInput.click(function() {
                self.show(false);
            });
            
            $agreeInput.click(function() {
                if (!$agreeInput.attr("checked")) {
                    $videoButton.addClass("btnYellowdsbl");
                    $radioButton.addClass("btnYellowdsbl");
                } else {
                    $videoButton.removeClass("btnYellowdsbl");
                    $radioButton.removeClass("btnYellowdsbl");
                }
            });
            
            $videoInput.click(function() {
                if (!$agreeInput.attr("checked")) {
                    return false;
                }
                
                $videoHidden.val("true");
            });
            
            $radioInput.click(function() {
                if (!$agreeInput.attr("checked")) {
                    return false;
                }
                
                $videoHidden.val("false");
            });
        },
        show: function(pred, guest) {
            var $overContainerBack = $j("#overContainerBase");
            var $overContainer = $j("#overContainer");
            
            if (pred) {
                if (guest) {
                    $header.hide();
                    $desc.hide();
                    $guestHeader.show();
                    $guestDesc.show();
                } else {
                    $guestHeader.hide();
                    $guestDesc.hide();
                    $header.show();
                    $desc.show();
                }
                
                flashCont.hide($j("embed,object"));
                
                this.update = function() {
                    var marginTop = Math.floor(($j(window).height() - $rootContInner.height()) / 2);
                    $rootCont.css("marginTop", $j.scrollTop() + marginTop + "px");
                };

                $j(window).bind('scroll', this.update);
        
                $overContainerBack.show();
                $overContainer.show();
                $rootCont.show();
                this.update();
            } else {
                $rootCont.hide();
                $overContainer.hide();
                $overContainerBack.hide();
                
                $j(window).unbind('scroll', this.update);
                
                flashCont.show();
                
                $agreeInput.attr("checked", false);
                $videoButton.addClass("btnYellowdsbl");
                $radioButton.addClass("btnYellowdsbl");
            }
        }
    };
})();

var languagePopup = {
    fetched: false, 
    active: false, 
    flashCont: new FlashContainer(), 
    
    show: function() {
        if (this.active) {
            return;
        }
        this.active = true;
        
        var $contBack = $j("#overContainerBase");
        var $cont = $j("#overContainer");
        var $langCont = $j("#langRootCont");
        var self = this;
        
        var show = function() {
            self.update = function() {
                var marginTop = Math.floor(($j(window).height() - $langCont.height()) / 2);
                $langCont.css("marginTop", $j.scrollTop() + marginTop + "px");
            };

            $j(window).bind('scroll', self.update);
            
            self.flashCont.hide($j("embed,object"));
            
            $contBack.show();
            $cont.show();
            $langCont.show();
            self.update();
        };
        
        if (!this.fetched) {
            $j.get("/language/popup" + getSessionId(), function(data) {
                var $form = $j(data);
                $form.appendTo($langCont.find(".cntrInt"));

                var $youSelected = $form.find("#langYouSelected");
                var $codeInput = $form.find("[name='lang']:hidden");
                var $currentCodeInput = $form.find("[name='currentLang']:hidden");
                if(location.href.indexOf("invite_friends_send") != -1) {
                    $form.find("[name='redir']:hidden").val("/home");
                } else {
                    $form.find("[name='redir']:hidden").val(location.href);
                }

                $form.find("a").each(function() {
                    var $a = $j(this);
                    
                    var code = $a.attr("code");
                    var name = $a.text();
                    
                    $a.click(function() {
                        $form.find("a").css("backgroundColor", "#ffffff");
                        $a.css("backgroundColor", "#cccccc");
                        
                        $codeInput.val(code);
                        $youSelected.text(name);
                        
                        return false;
                    });
                });
                
                $form.find("input:submit").click(function() {
                    ajaxActivity.start("language", 0);
                    if ($currentCodeInput.val() === $codeInput.val()) {
                        languagePopup.hide();                       
                    } else {
                        $form.trigger('submit');
                    }            
                    
                    return false;
                });

                self.fetched = true;
                self.active = false;
                show();
            });
        } else {
            show();
            this.active = false;
        }
    },
    hide: function() {
        var $contBack = $j("#overContainerBase");
        var $cont = $j("#overContainer");
        var $langCont = $j("#langRootCont");
        
        $langCont.hide();
        $cont.hide();
        $contBack.hide();
        ajaxActivity.end();
              
        $j(window).unbind('scroll', this.update);

        this.flashCont.show();
    }
};

var webCalls = (function() {
    var popupSize = {
        width: 500, 
        height: 636
    };
    
    var $navHeader, $receiveCont, $avatarCont, $nickCont, $callMsg, $conferenceMsg, 
    $acceptButton, $rejectButton, $muteButton, statusMovie;
    var lock = new Lock();
    
    $j(function() {
        $navHeader = $j("#navHeader");
        $receiveCont = $j("#webCallReceiveCont");
        $avatarCont = $j("#webCallReceiveAvatarCont");
        $nickCont = $j("#webCallReceiveNickCont");
        var $after = $nickCont.nextAll();
        $callMsg = $after.filter(":first");
        $conferenceMsg = $after.filter(":last");
        $acceptButton = $j("#acceptWebCallBtn");
        $rejectButton = $j("#rejectWebCallBtn");
        $muteButton = $j("#muteWebCallBtn");
        statusMovie = getFlashMovie("statusMovie");
    });
    
    var handleCall = function(accept) {
        if (statusMovie && statusMovie.handleCall) {
            statusMovie.handleCall(accept);
        }
    };
    var setMuteState = function(mute) {
        var suffix = (mute ? "muted" : "mute");
        $muteButton.children("img").attr("src", "/res/images/buttons/btn_" + suffix + ".png");
        common.webCallsMuted = mute;
    };
    var muteCall = function(mute, save) {
        if (statusMovie && statusMovie.muteCall) {
            setMuteState(mute);
            statusMovie.muteCall(mute);
            
            if (save) {
                $j.post("/service/member/web-calls/mute" + common.sessionId, {mute: mute});
            }
        }
    };
    
    var showReceiveCall = function(callerId, callerNickname, participants) {
        $avatarCont.attr("href", "/people/" + callerNickname + getSessionId())
        $avatarCont.html('<img class="avatarIconM" src="/avatar/%s" alt="%s" title="%s"/>'.format(callerId, callerNickname, callerNickname));
        
        $nickCont.text(callerNickname);
        
        if (participants > 1) {
            $callMsg.hide();
            $conferenceMsg.children("span").text("(%d)".format(participants))
            $conferenceMsg.show();
        } else {
            $conferenceMsg.hide();
            $callMsg.show();
        }
        
        $navHeader.hide();
        $receiveCont.show();
    };
    var hideReceiveCall = function() {
        $receiveCont.hide();
        $navHeader.show();
        
        $acceptButton.unbind("click");
        $rejectButton.unbind("click");
        $muteButton.unbind("click");
        
        lock.release();
    };
    
    var acceptHandler = function(e) {
        handleCall(e.data.accept);
        hideReceiveCall();
        
        if (e.data.accept) {
            webCalls.showCall(null, e.data.callerId, e.data.room);
        }
        
        return false;
    };
    
    var createInput = function(name, value) {
        return $j('<input name="%s" value="%s" type="hidden"/>'.format(name, value));
    };
    
    return {
        incomingCall: function(callerId, callerNickname, room, participants) {
            if (!lock.acquire()) {
                return;
            }
            
            // pre-cache avatar image
            var img = new Image();
            img.src = "/avatar/" + callerId;
            
            $acceptButton.bind('click', {
                accept: true,
                callerId: callerId, 
                room: room, 
                participants: participants
            }, acceptHandler);
            $rejectButton.bind('click', {accept:false}, acceptHandler);
            
            $muteButton.click(function() {
                muteCall(!common.webCallsMuted, true);
                
                return false;
            });
            
            showReceiveCall(callerId, callerNickname, participants);
        },
        hideIncomingCall: function() {
            hideReceiveCall();
        },
        showCall: function(calleeId, callerId, room) {
            var url = "/call"
            if (calleeId) {
                url += "?calleeId=" + encodeURIComponent(calleeId);
            } else if (callerId) {
                url += "?callerId=%s&room=%s".format(encodeURIComponent(callerId), encodeURIComponent(room));
            }
            
            var left = Math.floor((screen.width - popupSize.width) / 2), 
                top = Math.floor((screen.height - popupSize.height) / 2), 
                attributes = "left=%d,top=%d,width=%d,height=%d,directories=no,location=no,menubar=no,resizable=yes,scrollbars=no,toolbar=no".format(left, top, 
                    popupSize.width, popupSize.height);
            
            var w = window.open(url, "yaikawebcalls", attributes);
            
            if (typeof w == "undefined") {
                var form = $j("#acceptWebCallForm");
                $j("input", form).remove();
                
                form.append(createInput("nopopup", "true"));
                if (calleeId) {
                    form.append(createInput("calleeId", calleeId));
                } else if (callerId) {
                    form.append(createInput("callerId", callerId));
                    form.append(createInput("room", room));
                }
                
                setTimeout(function() {
                    form.submit();
                }, 1);
            } else {
                setTimeout(function() {
                    w.focus();
                }, 300);
            }
        }, 
        muteCall: muteCall, 
        setMuteState: setMuteState
    };
})();

var setStreamPid = function(pid) {
    $j(function() {
        if (!common.webCallsMuted) {
            webCalls.muteCall(true);
        }
        
        var $rootCont = $j("#commentsRootCont");
        var $pidHidden = $rootCont.find("input[name='pid']:hidden");

        if ($pidHidden.val() != pid) {
            $rootCont.find(".commentMsg").remove();
        }
        $pidHidden.val(pid);

        $j("#left2w").show();
        $j("#navInt,#commentsRootCont").show();

        chatObject.addVariable("streamId", pid);
        chatObject.write("chatOneN");
        
        var $chatCont = $j("#chatOneN");
        $chatCont.css({
            visibility: "visible"
        });
        
        var hideChat = function() {
            if (!$j("#chatTab").hasClass("selblue")) {
                $chatCont.css({
                    visibility: "hidden"
                });
            }
        };
        
        setTimeout(function() {
            adjustCommentsSubCont();
            window.setTimeout(hideChat, 500);
        }, 100);

        coWatchersObject.addVariable("streamId", pid);
        coWatchersObject.write("flashcontent");

        setTimeout(function() {
            streamControl.active = true;
        }, 100);
    });
};

var notifyChat = function(isBlocked) {
    var movie = null;

    if (navigator.appName.indexOf("Microsoft") != -1) {
        movie = window.mymovie_chat;
    } else {
        movie = document.mymovie_chat;
    }

    if (movie && movie.setMemberBlocked) {
        movie.setMemberBlocked(isBlocked);
    } else {
        return false;
    }

    return true;
};

var initComments = function(updateComments) {
    var Sort = {
        DESC: 0,
        ASC: 1
    };
    
    var POST_COMMENT_HEIGHT = 140;
    var DELETE_CONFIRM_HEIGHT = 108;
    var BLOCKED_HEIGHT = 114;
    var POST_DELETED_HEIGHT = 114;
    var MAX_COMMENT_LENGTH = 1000;
    
    var globalLock = new Lock();
    
    var $rootCont = $j("#commentsRootCont");
    var $commentsSubCont = $rootCont.find("[cont='commentsSubCont']");
    var $postBackLayer = $j("#postCommentBack");
    var $postCommentCont = $j("#postCommentCont");
    var $deleteConfirmCont = $j("#deleteConfirmCont");
    var $blockedCont = $j("#commentsBlockedCont");
    var $postDeletedCont = $j("#postDeletedCont");
    var $textarea = $j("#postCommentTextarea");
    var $tooLongError = $j("#commentTooLongError");
    var $chatCont = $j("#chatOneN");
    var $commentsBox = $commentsSubCont.find("[cont='commentsBoxCont']");
    
    var scrollable = ($rootCont.hiddenValue("scrollable") === "true");
    var guest = ($rootCont.hiddenValue("guest") === "true");
    var channelUrlLink = ($rootCont.hiddenValue("channelUrlLink"));
    var commentsSort = Sort.DESC;
    var currentCid = null;
    var chatHeight = 151;

    var getPid = function() {
        return $rootCont.hiddenValue("pid");
    };
    
    var getLastUpdateTime = function($cont) {
        return ($cont ? $cont : $rootCont).find("[cont='comments']").attr("spy_last_update_time");
    };
    
    var getPageCount = function($cont) {
        return ($cont ? $cont : $rootCont).find("[cont='comments']").attr("spy_page_count");
    };
    
    var getCurrentPage = function($cont) {
        return ($cont ? $cont : $rootCont).find("[cont='comments']").attr("spy_current_page");
    };
    
    var showCommentsBox = function(pred) {
        if (!scrollable) {
            if (pred) {
                $commentsBox.show();
            } else {
                $commentsBox.hide();
            }
        }
    };
    

    var makeCalcAbsTop = function(absHeight) {
        return function($elem) {
            var topSpace = $elem.offsetTop() - $commentsSubCont.offsetTop();

            var upperBound = Math.max($commentsSubCont.height(), 217) - absHeight;

            var top = topSpace - Math.floor(absHeight / 2);
            if (top < 37) {
                top = 37;
            } else if (top > upperBound) {
                top = upperBound;
            }

            return top;
        };
    };
    
    var calcPostContTop = makeCalcAbsTop(POST_COMMENT_HEIGHT);
    var calcDeleteConfirmContTop = makeCalcAbsTop(DELETE_CONFIRM_HEIGHT);
    
    var makeUpdateAbsCont = function($abs, absHeight) {
        return function(top) {
            var height = ($j("#commentsPagination").is(":visible") ? 39 : 0);
            
            if (scrollable) {
                $postBackLayer.css("top", "-20px");

                height += 20 + $rootCont.height();

                $postBackLayer.css("height", height + "px");
                $abs.css("top", Math.floor(($rootCont.height() - absHeight) / 2) + "px");
            } else {
                $postBackLayer.css("top", "0");

                height += Math.max($commentsSubCont.height(), 217);
                $postBackLayer.css("height", height + "px");
                $abs.css("top", top  + "px");
            }
        };
    };
    
    var updatePostCont = makeUpdateAbsCont($postCommentCont, POST_COMMENT_HEIGHT);
    var updateDeleteConfirmCont = makeUpdateAbsCont($deleteConfirmCont, DELETE_CONFIRM_HEIGHT);
    var updateBlockedCont = makeUpdateAbsCont($blockedCont, BLOCKED_HEIGHT);
    var updatePostDeletedCont = makeUpdateAbsCont($postDeletedCont, POST_DELETED_HEIGHT);
    
    var makeShowAbsCont = function($absCont, onshow, onhide) {
        return function(pred) {
            if (pred) {
                if (!scrollable && $commentsSubCont.height() < 217) {
                    $commentsSubCont.css("minHeight", "217px");
                }

                $j("#commentsTab").css("zIndex", "0").removeClass("selgreen");
                $postBackLayer.show();
                $absCont.show();
                
                if (onshow) {
                    onshow();
                }
            } else {
                if (!scrollable) {
                    $commentsSubCont.css("minHeight", "0");
                }

                $absCont.hide();
                $postBackLayer.hide();
                $j("#commentsTab").css("zIndex", "3").addClass("selgreen");
                
                if (onhide) {
                    onhide();
                }
            }
        };
    };
    
    var showPostCont = makeShowAbsCont($postCommentCont, function() {
        $textarea.trigger("focus");
    });
    
    var showDeleteConfirmCont = makeShowAbsCont($deleteConfirmCont, undefined, function() {
        $deleteConfirmCont.find("#deleteConfirmYes").unbind("click");
    });
    
    var showBlockedCont = makeShowAbsCont($blockedCont);
    
    $j("a", $blockedCont).click(function() {
        showBlockedCont(false);
        return false;
    });
    
    var showPostDeletedCont = makeShowAbsCont($postDeletedCont);
    
    $j("a", $postDeletedCont).click(function() {
        window.location.href = "/channel/" + channelUrlLink + getSessionId();

        return false;
    });
    
    var showCommentsBlocked = function() {
        if (scrollable) {
            updateBlockedCont();
        } else {
            var center = Math.max($commentsSubCont.height(), 217) / 2.0;
            var top = Math.floor(center - (BLOCKED_HEIGHT / 2.0));
            
            updateBlockedCont(top);
        }
        
        
        showBlockedCont(true);
    };
    
    var showPostDeleted = function() {
        if (scrollable) {
            updatePostDeletedCont();
        } else {
            var center = Math.max($commentsSubCont.height(), 217) / 2.0;
            var top = Math.floor(center - (POST_DELETED_HEIGHT / 2.0));
            
            updatePostDeletedCont(top);
        }
        
        showPostDeletedCont(true);
    };
    
    window.showPostDeleted = showPostDeleted;

    var containerBottomHeight = $j("#containerBottom").height() + ($j.browser.msie ? 40 : 30);
    
    var adjustCommentsSubCont = function() {
        var chatActive = $j("#chatTab").hasClass("selblue");
        
        if (!$commentsSubCont.height() && !$chatCont.height()) {
            return;
        }
        
        var pagHeight = ($j("div.paginationBox").css("display") === "block" ? 32 : 0);
        
        var height = (window.size().height - containerBottomHeight - pagHeight) - (chatActive ? $chatCont.offsetTop() : $commentsSubCont.offsetTop());
        height = Math.max(120, height);
        
        chatHeight = (window.size().height - containerBottomHeight - pagHeight) - (chatActive ? $chatCont.offsetTop() : $rootCont.offsetTop());
        chatHeight = Math.max(151, chatHeight);
        
        $commentsSubCont.css("height", height + "px");
        updatePostCont();
        updateDeleteConfirmCont();
        updateBlockedCont();
        
        if (chatActive) {
            $chatCont.css("height", chatHeight + "px");
        }
    };
    this.adjustCommentsSubCont = adjustCommentsSubCont;
    
    
    if (scrollable) {
        $j(window).resize(function() {
            adjustCommentsSubCont();
        });
    }
    
    var replaceComments = function(data) {
        var pageCountBefore = getPageCount();
        
        var div = document.createElement("div");
        div.innerHTML = data;
        var $data = $j(div.childNodes);
        var $comments = $data.eq(0);
        
        var isBlocked = ($comments.attr("spy_is_blocked") == "true");
        notifyChat(isBlocked);
        if (typeof notifyBroadcaster != "undefined") {
            notifyBroadcaster(isBlocked);
        }
        

        $rootCont.find("#commentsPagination").replaceWith($data.eq(1));
        $rootCont.find("[cont='comments']").replaceWith($comments);

        editRelationships($comments);
        initButtonEffect($comments);
        initPersonMouseOver($comments);
        attachDeleteReply($comments);
        
        $commentsSubCont[0].scrollTop = 0;
        
        if (scrollable && pageCountBefore <= 1 && getPageCount() > 1) {
            adjustCommentsSubCont();
        }
    };
    
    var initCommentsSorter = function() {
        var $commentsSortBtn = $j("#commentsSortBtn");
        var $freshOnTopText = $j("#freshOnTopText");
        var $oldestOnTopText = $j("#oldestOnTopText");

        $commentsSortBtn.click(function() {
            if (!globalLock.acquire()) {
                return false;
            }
            
            commentsSort = (commentsSort === Sort.DESC ? Sort.ASC : Sort.DESC);
            
            var req = $j.post("/service/post/comment/page" + getSessionId(), 
            {
                pid: getPid(), 
                desc: (commentsSort == Sort.DESC), 
                time: getLastUpdateTime(), 
                page: 0
            },
            function(data) {
                if (isResponseJSON(req)) {
                    var result = evalJSON(data);
                        
                    if (result.postDeleted) {
                        showPostDeleted();
                    }
                } else {
                    if (commentsSort === Sort.DESC) {
                        $oldestOnTopText.hide();
                        $freshOnTopText.show();
                    } else {
                        $freshOnTopText.hide();
                        $oldestOnTopText.show();
                    }

                    replaceComments(data);
                }
                    
                globalLock.release();
            }
        );

            return false;
        });
    };

    var attachGuestReg = function($link) {
        $link.click(function() {
            guestRegistration.show(true);
            
            return false;
        });
    };
    
    $j("#postCommentMain").each(function() {
        var $link = $j(this);

        $link.defineOnce("replyAttached", function() {
            if (!guest) {
                $link.click(function() {
                    currentCid = null;

                    if (!globalLock.acquire()) {
                        return false;
                    }

                    if (!scrollable) {
                        updatePostCont(calcPostContTop($link));
                    } else {
                        updatePostCont();
                    }

                    showPostCont(true);

                    return false;
                });
            } else {
                attachGuestReg($link);
            }
        });
    });

    var deleteComment = lock(function(unlock, cid) {
        var req = $j.post("/service/post/comment/delete" + getSessionId(), 
        {
            cid: cid, 
            pid: getPid(), 
            desc: (commentsSort == Sort.DESC), 
            time: getLastUpdateTime(), 
            page: getCurrentPage()
        }, 
        function(data) {
            if (isResponseJSON(req)) {
                var result = evalJSON(data);
                    
                if (result.postDeleted) {
                    $deleteConfirmCont.find("#deleteConfirmYes").unbind("click");
                    showDeleteConfirmCont(false);
                        
                    showPostDeleted();
                }
            } else {
                replaceComments(data);

                if (!$rootCont.find("div.commentMsg").length) {
                    showCommentsBox(false);
                }
                    
                $deleteConfirmCont.find("#deleteConfirmYes").unbind("click");
                showDeleteConfirmCont(false);
            }
                
            unlock();
            globalLock.release();
        }
    );
    });

    $deleteConfirmCont.find("#deleteConfirmNo").click(function() {
        globalLock.release();
        showDeleteConfirmCont(false);
        
        return false;
    });
    
    var attachDeleteReply = function($cont) {
        var query = "div.commentMsg";
        
        ($cont ? $cont.find(query) : $j(query)).each(function() {
            $j(this).defineOnce("handlers_attached", function() {
                var $cont = $j(this);
                $cont.find("[spy_delete_comment]").click(function() {
                    if (!globalLock.acquire()) {
                        return false;
                    }
                    
                    var $link = $j(this);
                    var cid = $link.attr("spy_delete_comment");
                    
                    $deleteConfirmCont.find("#deleteConfirmYes").click(function() {
                        deleteComment(cid);
                        
                        return false;
                    });
                    
                    if (!scrollable) {
                        updateDeleteConfirmCont(calcDeleteConfirmContTop($link));
                    } else {
                        updateDeleteConfirmCont();
                    }
                    
                    showDeleteConfirmCont(true);
                    
                    return false;
                });
                
                $cont.find("[spy_post_comment]").click(function() {
                    var $link = $j(this);
                    var cid = $link.attr("spy_post_comment");
                    
                    if (guest) {
                        guestRegistration.show(true);
                    } else {
                        if (!globalLock.acquire()) {
                            return false;
                        }
                        
                        currentCid = cid;

                        var msg = "[QUOTE]";
                        $j("div[id='msg_" + cid + "']").contents().each(function() {
                            if ($j(this).is("br")) {
                                msg += "\n";
                            } else {
                                msg += $j.text(this);
                            }
                        });
                        msg += "[/QUOTE]\n\n";

                        $textarea.val(msg);

                        if (!scrollable) {
                            updatePostCont(calcPostContTop($link));
                        } else {
                            updatePostCont();
                        }

                        showPostCont(true);
                    }
                    
                    return false;
                });
            });
        });
    };
    
    attachDeleteReply($rootCont);
    
    var postComment = lock(function(unlock, comment) {
        ajaxActivity.start('comment', 0);
        var pid = getPid();
        if (pid === "0") {
            unlock();
            return;
        }
        
        var params = {
            pid: pid, 
            comment: comment,
            desc: (commentsSort == Sort.DESC)
        };

        if (currentCid) {
            params.cid = currentCid;
        }

        var req = $j.post("/service/post/comment/add" + getSessionId(), params, 
        function(data) {
            if (isResponseJSON(req)) {
                var result = evalJSON(data);
                
                showPostCont(false);
                $textarea.val("");
                
                if (result.postDeleted) {
                    showPostDeleted();
                } else if (result.blocked) {
                    notifyChat(true);
                    if (typeof notifyBroadcaster != "undefined") {
                        notifyBroadcaster(true);
                    }
                    showCommentsBlocked();
                }
            } else {
                replaceComments(data);
                showCommentsBox(true);
                showPostCont(false);
                $textarea.val("");

                if (!scrollable) {
                    if (commentsSort === Sort.ASC) {
                        window.scrollTo(0, $j("div.commentMsg:last").offsetTop());
                    }
                }
            }
            ajaxActivity.end();
                
            unlock();
            globalLock.release();
        }
    );
    });

    
    if (updateComments) {
        window.setInterval(function() {
            if (globalLock.isLocked()) {
                return;
            }
            
            var pid = getPid();
            if (pid === "0") {
                return;
            }
                        
            $j.getJSON("/service/post/comment/new-info" + getSessionId(), 
            {
                pid: pid,
                time: getLastUpdateTime()
            },
            function(data) {
                notifyChat(data.isBlocked);
                if (typeof notifyBroadcaster != "undefined") {
                    notifyBroadcaster(data.isBlocked);
                }
                
                if (data.exists) {
                    if (globalLock.isLocked()) {
                        return;
                    }
                        
                    setMessageActive(false);
                        
                    var pageCount = getPageCount();
                    var currentPage = getCurrentPage();
                        
                    if ((commentsSort == Sort.DESC && currentPage == 0) || (commentsSort == Sort.ASC && currentPage == (pageCount - 1))) {
                        $j.post("/service/post/comment/new" + getSessionId(), 
                        {
                            pid: getPid(), 
                            desc: (commentsSort == Sort.DESC)
                        }, 
                        function(data) {
                            replaceComments(data);
                        }
                    );
                    } else {
                        $j("#commentsTab img").show();
                    }
                }
            }
        );
        }, 10000);
    }
    
    window.changeCommentsPage = lock(function(unlock, page) {
        if (!globalLock.acquire()) {
            return;
        }
        ajaxActivity.start('pagination', 0);
        
        var req = $j.post("/service/post/comment/page" + getSessionId(), 
        {
            pid: getPid(), 
            desc: (commentsSort == Sort.DESC), 
            time: getLastUpdateTime(), 
            page: (page - 1)
        },
        function(data) {
            if (isResponseJSON(req)) {
                var result = evalJSON(data);
                    
                if (result.postDeleted) {
                    showPostDeleted();
                }
            } else {
                replaceComments(data);

                if ((commentsSort == Sort.DESC && (page - 1) == 0) || (commentsSort == Sort.ASC && page == getPageCount())) {
                    $j("#commentsTab img").hide();
                }

                if (!scrollable) {
                    scrollToFocusable();
                }
            }
                    
            ajaxActivity.end();    
            unlock();
            globalLock.release();
        }
    );
    });
        
    if ($chatCont.length) {
        var $commentsTab = $j("#commentsTab");
        var $commentsIndicator = $j("#commentsTab img");
        var $chatTab = $j("#chatTab");
        var $chatIndicator = $j("#chatTab img");
    
        var showCommentsTab = function() {
            $chatTab.removeClass("selblue");
            $commentsTab.addClass("selgreen");
            $commentsTab.css("zIndex", "3");
            $commentsIndicator.hide();

            $chatCont.css({
                visibility: "hidden",
                height: "0px"
            });

            $rootCont.show();
        };
    
        var commentsHandler = lock(function(unlock) {
            if ($commentsIndicator.is(":visible")) {
                if (!globalLock.acquire()) {
                    return;
                }
                
                $j.post("/service/post/comment/new" + getSessionId(), 
                {
                    pid: getPid(), 
                    desc: (commentsSort == Sort.DESC)
                }, 
                function(data) {
                    replaceComments(data);
                    $commentsIndicator.hide();
                    showCommentsTab();
                    unlock();
                    globalLock.release();
                }
            );
            } else {
                showCommentsTab();
                unlock();
            }
        });
    
        $j("#commentsTab a").click(function() {
            commentsHandler();
            
            return false;
        });
        
        $j("#chatTab a").click(function() {
            $commentsTab.removeClass("selgreen");
            $commentsTab.css("zIndex", "0");
            $chatTab.addClass("selblue");
            $chatIndicator.hide();
            
            $rootCont.hide();
            
            $chatCont.css({
                visibility: "visible",
                height: chatHeight + "px"
            });
            
            return false;
        });
        
        window.setMessageActive = function(chat) {
            if (chat) {
                if (!$chatTab.hasClass("selblue")) {
                    $chatIndicator.show();
                }
            } else {
                if (!$commentsTab.hasClass("selgreen")) {
                    $commentsIndicator.show();
                }
            }
        };
    }
    
    $textarea.keyup(function() {
        if ($textarea.val().length > MAX_COMMENT_LENGTH) {
            $tooLongError.show();
        } else {
            $tooLongError.hide();
        }
    });
    
    $j("#postCommentAbs").click(function() {
        var comment = $textarea.val().trim();

        if (currentCid) {
            comment = comment.replace(/\[QUOTE\]([\s\S]*)\[\/QUOTE\]/g, "").trim();
        }

        if (comment.length > MAX_COMMENT_LENGTH) {
            $tooLongError.show();
            return false;
        } else {
            $tooLongError.hide();
        }
        
        if (!comment.length) {
            $textarea.val("");
            showPostCont(false);
            
            globalLock.release();
        } else {
            postComment(comment);
        }

        return false;
    });
    
    $j("#cancelButton").click(function() {
        $textarea.val("");
        showPostCont(false);
        globalLock.release();

        return false;
    });

    if (scrollable) {
        window.setTimeout(adjustCommentsSubCont, 100);
    }
    
    var hideChat = function() {
        $chatCont.css({
            visibility: "hidden"
        });
    };
    
    if ($j.browser.msie) {
        window.setTimeout(hideChat, 500);
    } else {
        hideChat();
    }
    
    
    editRelationships();
    initPersonMouseOver();
    initCommentsSorter();
};

var setPostReaderCount = function(count) {
    var $readCountCont = $j("#readCountCont");
    
    if (count == 0) {
        $readCountCont.hide();
        $j("#flashcontent").hide();
    } else {
        $readCountCont.show();
        
        $j("#readParenCont")
        .children("span")
        .text(count)
        .end().show();
    }
};

var attachCensoredInputHandler = function() {
    var $olderInput = $j("#olderInput");
    var $agreeButton = $j("#censoredAgree");
    var $agreeButtonInput = $j("#censoredAgree input");
    
    var enableAgree = function() {
        if ($olderInput.attr("checked")) {
            $agreeButton.removeClass("btnYellowdsbl");
        } else {
            $agreeButton.addClass("btnYellowdsbl");
        }
    };
    
    $olderInput.defineOnce("enableAgree", function() {
        $olderInput.click(enableAgree);
    });
    
    $agreeButtonInput.defineOnce("enableAgree", function() {
        $agreeButtonInput.click(function() {
            if (!$olderInput.attr("checked")) {
                return false;
            }
        });
    });
    
    enableAgree();
};

var censoringHandler = (function() {
    var $overContainerBack = [];
    var $overContainer = [];
    var $rootCont = [];
    var flashCont = new FlashContainer();
    var update = null;
    
    var show = function(level, quickStream, location) {
        $j("#censoredLevel").val(level);
        $j("#censoredRedirect").val(location);
        
        var lvl = "[level='" + level + "']";
        $rootCont.find("p[level],label[level]").css("display", "none")
        .filter("p" + lvl + ",label" + lvl).show();
        

        marginTop = Math.floor(($j(window).height() - 254) / 2);
        $rootCont.css("marginTop", $j.scrollTop() + marginTop + "px");
        
        update = function() {
            var marginTop = Math.floor(($j(window).height() - $rootCont.height()) / 2);
            $rootCont.css("marginTop", $j.scrollTop() + marginTop + "px");
        };
        $j(window).bind('scroll', update);
        
        flashCont.hide($j("embed,object"));
        
        attachCensoredInputHandler();
        
        
        $overContainerBack.show();
        $overContainer.show();
        $rootCont.show();
        update();
    };
    
    return {
        init: function() {
            $overContainerBack = $j("#overContainerBase");
            $overContainer = $j("#overContainer");
            $rootCont = $j("#censoredRootCont");
            var $olderInput = $j("#olderInput");
            var $showCensoredInput = $j("#showCensoredInput");
            var $cancelButtonInput = $j("#censoredCancel input");
            
            $cancelButtonInput.click(function() {
                $rootCont.hide();
                $j(window).unbind('scroll', update);
                
                $overContainer.hide();
                $overContainerBack.hide();

                flashCont.show();

                $olderInput.attr("checked", false);
                $showCensoredInput.attr("checked", false);

                return false;
            });

            $j("[censored='true']").each(function() {
                var $elem = $j(this);
                var location = $elem.parent().attr("href").replace(/;jsessionid=[^?]*/, "");
                var level = $elem.attr("censoringLevel");
                var quickStream = ($elem.attr("quickStream") === "true");

                $elem.click(function() {
                    show(level, quickStream, location);

                    return false;
                });
            });
        },
        show: show
    };
})();

var postEditor = (function() {
    var $postCont = null;
    var $editForm = null;
    var $contentInput = null;
    var $postEditorArea = null;
    var $channelProfile = null;
    var language = null;
    var pid = null;
    
    var editor = null;
    
    var createEditor = function() {
        var editor = new FCKeditor("postEditor", undefined, "500", "YaikaSave");
        editor.BasePath = "/res/fckeditor/";
        editor.Config.CustomConfigurationsPath = "/res/fckeditor/config.js";
        editor.Config.AutoDetectLanguage = false;
        editor.Config.DefaultLanguage = language;
        editor.ReplaceTextarea();
    };
    
    var editing = false;
    var incrementalSave = false;
    
    var invokeFlash = function(value) {
        var movie = null;
        
        if (navigator.appName.indexOf("Microsoft") != -1) {
            movie = window.infoMovie;
        } else {
            movie = document.infoMovie;
        }
        
        if (movie && movie.sendToActionScript) {
            movie.sendToActionScript(value);
        } else {
            return false;
        }
        
        return true;
    };
    
    var toggle = null;
    
    var initButtons = function() {
        var $editButton = $j("#postEditButton");
        
        if (!$editButton.length) {
            return;
        }
        
        var $cancelButton = $j("#postCancelButton");
        var $saveButton = $j("#postSaveButton");

        toggle = function(edit) {
            if (edit) {
                $editButton.css("display", "none");
                $saveButton.css("display", "inline");
                $cancelButton.css("display", "inline");
            } else {
                $cancelButton.css("display", "none");
                $saveButton.css("display", "none");
                $editButton.css("display", "inline");
            }
        };

        $editButton.click(function() {
            postEditor.edit(true);
            toggle(true);

            return false;
        });

        $cancelButton.click(function() {
            postEditor.cancel();
            toggle(false);

            return false;
        });

        $saveButton.click(function() {
            postEditor.save();
            toggle(false);

            return false;
        });
    };
    
    return {
        init: function(params) {
            $postCont = $j("#postCont");
            $editForm = $j("#editForm");
            $postEditorArea = $j("#postEditor");
            $contentInput = $editForm.find("input[name='content']:hidden");
            $channelProfile = $j("#channelProfileCont");
            language = $editForm.hiddenValue("lang");
            pid = $editForm.hiddenValue("pid");
            
            if (params) {
                this.record = params.record;
            }
            
            initButtons();
        },
        edit: function() {
            if (editing) {
                return;
            }
            editing = true;
            
            if (!arguments[0]) {
                if (toggle) {
                    toggle(true);
                }
            }
            
            if ($channelProfile.length) {
                if (!$channelProfile.find("embed,object").length) {
                    channelProfileObject.write("channelProfileCont");
                } else {
                    $channelProfile.show();
                }
            }
            
            invokeFlash("showEdit");
            
            if (FCKeditor_IsCompatibleBrowser()) {
                if (!editor) {
                    window.FCKeditor_OnComplete = function(editorInstance) {
                        editor = editorInstance;
                        editor.SetHTML($contentInput.val());

                        editor.LinkedField.form.onsubmit = function() {
                            incrementalSave = true;

                            $j.post("/service/post/update-desc" + getSessionId(), 
                            {
                                pid: pid,
                                content: editor.GetXHTML()
                            },
                            function(data) {}, "json"
                        );

                            return false;
                        };
                    };

                    createEditor();
                } else {
                    editor.SetHTML($contentInput.val());
                }
            } else {
                var content = $contentInput.val().replace(/<br\/>/g, "\n");
                content = content.replace(/&#160;/g, " ");
                $postEditorArea.val(content);
            }
            
            $postCont.css("display", "none");
            $editForm.css("display", "block");
        },
        cancel: function() {
            if (!editing) {
                return;
            }
            
            if ($channelProfile.length) {
                $channelProfile.hide();
            }
            
            invokeFlash("hideEdit");
            
            if (incrementalSave) {
                $j.post("/service/post/update-desc" + getSessionId(),
                {
                    pid: pid,
                    content: $contentInput.val()
                },
                function(data) {
                    $editForm.css("display", "none");
                    $postCont.css("display", "block");
                    editing = false;
                    incrementalSave = false;
                }
            );
            } else {
                $editForm.css("display", "none");
                $postCont.css("display", "block");
                editing = false;
            }
        },
        save: function() {
            if (!editing) {
                return;
            }
            
            invokeFlash("saveChanges");
            
            $j.post("/service/post/update-desc" + getSessionId(), 
            {
                pid: pid, 
                content: (FCKeditor_IsCompatibleBrowser() ? editor.GetXHTML() : $postEditorArea.val()),
                naked: !FCKeditor_IsCompatibleBrowser()
            },
            function(data) {
                if (data.response === "OK") {
                    $postCont.html(data.content);
                    $editForm.css("display", "none");
                    $postCont.css("display", "block");
                        
                    if (data.content.length) {
                        $postCont.parent().css("display", "block");
                    } else {
                        $postCont.parent().css("display", "none");
                    }
                        
                    $contentInput.val(data.content);
                        
                    editing = false;
                    incrementalSave = false;
                }
            }, "json"
        );
        }
    };
})();

var initAddBlogPost = function() {
    var adding = false;
    
    $j(function() {
        var $titleInput = $j("#titleInput");
        var $publishInput = $j("#publishInput");
        var $editForm = $j("#editForm");
        
        var $titleEmptyError = $j("#titleEmptyError");
        var $titleTooLongError = $j("#titleTooLongError");
        
        $publishInput.click(function() {
            if (adding) {
                return false;
            }
            adding = true;
            
            var title = $titleInput.val().trim();
            
            if (!title.length) {
                $titleTooLongError.hide();
                $titleEmptyError.show();
                adding = false;
                
                return false;
            } else if (title.length > 150) {
                $titleEmptyError.hide();
                $titleTooLongError.show();
                adding = false;
                
                return false;
            }
            
            var content = "";
            
            var $postEditorArea = $j("#postEditor");
            
            if (FCKeditor_IsCompatibleBrowser()) {
                var editor = FCKeditorAPI.GetInstance('postEditor');
                content = editor.GetXHTML();
            } else {
                content = $postEditorArea.val();
                $editForm.find("input[name='naked']").val("true");
            }
            
            $editForm.find("input[name='content']").val(content);
            $editForm.trigger('submit');
            
            return false;
        });
    });
};

var initStream = function(args) {
    window.streamControl = {
        active: false,
        linkTime: new Date().getTime()
    };
    
    if (!args.creating) {
        window.setCaller = function(calling) {
            if (!common.webCallsMuted) {
                webCalls.muteCall(true);
            }
            
            streamControl.active = calling;
        };
    }
    
    window.notifyBroadcaster = function(isBlocked) {
        var movie = null;

        if (navigator.appName.indexOf("Microsoft") != -1) {
            movie = window.mymovie2;
        } else {
            movie = document.mymovie2;
        }

        if (movie && movie.setMemberBlocked) {
            movie.setMemberBlocked(isBlocked);
        } else {
            return false;
        }

        return true;
    };
    
    $j(function() {
        var callBoth = (function() {
            var cowatchers = null;
            var broadcaster = null;
            var retrieved = false;
            
            return function(method, uid) {
                if (!retrieved) {
                    cowatchers = getFlashMovie("cowatchers");
                    broadcaster = getFlashMovie("mymovie2");
                    retrieved = true;
                }
                
                if (cowatchers.memberStatusChanged) {
                    cowatchers.memberStatusChanged(method, uid);
                }
                if (broadcaster.memberStatusChanged) {
                    broadcaster.memberStatusChanged(method, uid);
                }
            };
        })();
        
        $j(window).bind(SpyEvent.ADD_FRIEND, function(event, uid) {
            callBoth("addFriend", uid);
            return false;
        });
        $j(window).bind(SpyEvent.REMOVE_FRIEND, function(event, uid) {
            callBoth("removeFriend", uid);
            return false;
        });
        $j(window).bind(SpyEvent.BLOCK_MEMBER, function(event, uid) {
            callBoth("blockMember", uid);
            return false;
        });
        $j(window).bind(SpyEvent.UNBLOCK_MEMBER, function(event, uid) {
            callBoth("unblockMember", uid);
            return false;
        });
        $j(window).bind(SpyEvent.ALLOW_FLASH_SIZE_CHANGE, function(event, yes) {
            var cowatchers = getFlashMovie("cowatchers");
            if (cowatchers && cowatchers.allowFlashSizeChange) {
                cowatchers.allowFlashSizeChange(yes);
            }
        });
        
        var $yesButton = $j("#broadcastLeaveConfirmDiv a#confirmDeletion");
        var $noButton = $j("#broadcastLeaveConfirmDiv a#cancelDeletion");

        var yesHandler = function() {
        };

        $yesButton.click(function() {
            showBroadcastLeaveConfirm(false);
            yesHandler();
            return false;
        });

        $noButton.click(function() {
            showBroadcastLeaveConfirm(false);
            return false;
        });

        $j("#searchBlock .btnYellow input").click(function() {
            if (streamControl.active) {
                yesHandler = function() {
                    document.searchForm.submit();
                };
                showBroadcastLeaveConfirm(true); 

                return false;
            }
        });

        $j("#containerBottom #changeRegionBtn").click(function() {
            if (streamControl.active) {
                yesHandler = function() {
                    changeRegion.show(true, "/");
                };
                showBroadcastLeaveConfirm(true); 

                return false;
            }
        });

        $j("#containerTop .box a:not([id='langClosed'])").click(function() {
            if (streamControl.active) {
                var url = $j(this).attr('href');
                yesHandler = function() {
                    location.href = url;
                };

                showBroadcastLeaveConfirm(true); 

                return false;
            }
        });

        $j("#langClosed").unbind('click');
        $j("#langClosed").click(function() {
            if (streamControl.active) {
                yesHandler = function() {
                    languagePopup.show();
                };
                showBroadcastLeaveConfirm(true);
            } else {
                languagePopup.show();
            }
            
            return false;
        });

        $j(".chnlHeader a,#toChannelBtn").click(function() {
            if (streamControl.active) {
                var url = $j(this).attr('href');
                yesHandler = function() {
                    location.href = url;
                };
                showBroadcastLeaveConfirm(true);

                return false;
            }
        });

        $j(".links a").click(function() {
            if (streamControl.active) {
                var url = $j(this).attr('href');
                yesHandler = function() {
                    location.href = url;
                };
                showBroadcastLeaveConfirm(true); 

                return false;
            }
        });
        
        initComments(true);
    });
};

var initPost = function() {
    $j(function() {
        initComments(false);
    });
};

var initRecord = function(owner) {
    $j(function() {
        editTags();
        initComments(false);
        if (owner) {
            postEditor.init({record: true});
        }
        
        window.changeRecordName = function(name) {
            var $a = $j("h2.chnlHeader a:eq(0)");
            
            if (name.length > 27) {
                name = name.substr(0, 27).trim() + "...";
            }
            
            $a.text(name);
        };
    });
};

var initHome = function() {
    initCategoriesMouseOver();
    
    $j(function() {
        attachTop20Sliders();
      
        var $guestBanner = $j("#guestBanner");
        $j("#guestBannerClose").click(function() {
            $guestBanner.remove();
          
            var date = new Date();
            date.setUTCFullYear(date.getUTCFullYear() + 20);
          
            document.cookie = "gbanner=1; expires=" + date.toGMTString() + "; path=/";
          
            return false;
        });
      
        $j("#guestBannerJoinUs").click(function() {
            quickTour.show();
            return false;
        });
    });
};

var initHomeLogged = function() {
    $j(function() {
        attachTop20Sliders();
        initPersonMouseOver();
        editRelationships();
        setPreviewTextToDefault();       
        
        var $lastPostBanner = $j("#lastPostBanner");
        
        $j("#lastPostBannerClose").click(function() {
            $lastPostBanner.children().hide().end().css("height", "0");
          
            var date = new Date();
            date.setUTCFullYear(date.getUTCFullYear() + 20);
          
            document.cookie = "lbanner=1; path=/";
          
            return false;
        });
        
        var conts = [];
        
        var showTab = function($tab, $cont) {
            $j("#navInt li").each(function() {
                var $li = $j(this);
                $li.removeClass($li.attr("spy_sel"));
            });
            $tab.addClass($tab.attr("spy_sel"));

            $j(conts.join(",")).css("display", "none");
            $cont.css("display", "block");
            $tab.find("a").blur();
        };
         
    var lock = new Lock();
        
    $j("#navInt li").each(function() {
        var $tab = $j(this);
            
        var id = $tab.attr("spy_cont");
        var url = $tab.attr("spy_url");
            
        conts.push("#" + id);
            
        $tab.click(function() {
            if ($tab.hasClass($tab.attr("spy_sel"))) {
                return false;
            }
                
            if (!lock.acquire()) {
                return false;
            }
                
            var $cont = $j("#" + id);
                
            if (!$cont.length) {
                $j.get(url + getSessionId(), {}, function(data) {
                    if (data.length) {
                        $cont = $j(data);
                        $cont.css("display", "none");
                        $j("#navInt").after($cont);
                        initButtonEffect($cont);
                            
                        showTab($tab, $cont);
                        lock.release();
                    }
                });
            } else {
                $j.post(url + getSessionId(), {onlyTab: true});
                showTab($tab,  $cont);
                lock.release(); 
            }
                
            return false;
        });
           
    });
        
    window.updateMyPagination = function(page, id) {
        if (!lock.acquire()) {
            return;
        }
            
        var url = $j("#navInt li[@spy_cont='" + id + "']").attr("spy_url");
            
        $j.post(url + getSessionId(), {page: page}, 
        function(data) {
            if (data.length) {
                $j("#" + id).replaceWith(data);
                initButtonEffect($j("#" + id));
                //scrollToFocusable();
            }
            lock.release();
        }
    );
    };
});
};

var changeChannelPermission = function(ageLevel, permissionLevel) {
var permAge = 0;
if (ageLevel == 1) {
    permAge = 13;
} else if(ageLevel == 2) {
    permAge =16;
} else if (ageLevel == 3) {
    permAge =  18;
}
    
$j("span[id^='ageRestriction_']").html(permAge);
    
var messageNr = 0;
if(permissionLevel == 1 && ageLevel == 4){
    messageNr = 1;
} else if(permissionLevel == 3) {
    messageNr = 2;
} else if (permissionLevel == 2 && ageLevel != 4) {
    messageNr = 3;
} else if (permissionLevel == 2 && ageLevel == 4) {
    messageNr = 4;
} else if(permissionLevel == 1 && ageLevel != 4) {
    messageNr = 5;
}
     
$j("div[id^='notAllowed_']")
.hide()
.filter("[id='notAllowed_" + messageNr + "']").show();
    
if (ageLevel == "4" && permissionLevel == "1") {
    $j("#atomCont").show();
} else {
    $j("#atomCont").hide();
}
};

var initChannel = function() {
    $j(function() {
        $j(window).bind(SpyEvent.ALLOW_FLASH_SIZE_CHANGE, function(e, yes) {
            var profileMovie = getFlashMovie("mymovie");
            
            if (profileMovie && profileMovie.allowFlashSizeChange) {
                profileMovie.allowFlashSizeChange(yes);
            }
        });
        
        editTags();
        editRelationships();
        editFavourites();
        initPersonMouseOver();
    });
};

var initCategoriesMouseOver = function() {
$j(function() {
    $j("a.menuWhite").each(function() {
        var $a = $j(this);

        $a.hover(
        function() {
            $a.removeClass("menuWhite");
            $a.addClass("menuBlue");
        },
        function() {
            $a.removeClass("menuBlue");
            $a.addClass("menuWhite");
        }
    );
    });
});
};

var enableCriteriaControls = function() {
$j("#criteriaForm").find("input:radio,select").attr("disabled", false);
};

var attachChannelSortHandler = function(update, lock) {
$j("#resultsPerPage").change(function(e) {
    if (!lock.acquire()) {
        return false;
    }

    update({
        resultsPerPage: $j(this).val()
    });
});

$j("#liveair").click(function(e) {
    if (!lock.acquire()) {
        return false;
    }
        
    update({liveAir: true});
});
    
$j("#recorded").click(function(e) {
    if (!lock.acquire()) {
        return false;
    }
        
    update({recorded: true});
});

$j("#date").click(function(e) {
    if (!lock.acquire()) {
        return false;
    }
        
    update({date: true});
});

$j("#rating").click(function(e) {
    if (!lock.acquire()) {
        return false;
    }
        
    update({rating: true});
});
};

var initSearchChannels = function() {
var globalLock = new Lock();

var update = function(args, focus) {
    ajaxActivity.start('pagination', 0);
    var url = $j("#left2w").attr("base_url");
            
    $j.post(url + "/partial" + getSessionId(), args, function(data) {
        $j("#left2w").replaceWith(data);
        attachChannelSortHandler(update, globalLock);
        enableCriteriaControls();

        ajaxActivity.end();
            
        if (focus) {
            scrollToFocusable();
        }

        globalLock.release();
    });
};
    
window.changeChannelsPage = function(page) {
    if (!globalLock.acquire()) {
        return;
    }

    update({page: page}, true);
};
    
$j(function() {
    attachChannelSortHandler(update, globalLock);
    enableCriteriaControls();
});
};

var initChannels = function() {
var globalLock = new Lock();

var update = function(args, focus) {
    ajaxActivity.start('pagination', 0);
    args.video = $j("#left2w").attr("video");
            
    $j.post("/channels/partial" + getSessionId(), args, function(data) {
        $j("#left2w").replaceWith(data);
        attachChannelSortHandler(update, globalLock);
        enableCriteriaControls();

        channelOverInit($j("#left2w"));

        ajaxActivity.end();
            
        if (focus) {
            scrollToFocusable();
        }
            
        globalLock.release();
    });
};
    
window.changeChannelsPage = function(page) {
    if (!globalLock.acquire()) {
        return;
    }

    update({page: page}, true);
};
    
$j(function() {
    attachChannelSortHandler(update, globalLock);
    enableCriteriaControls();
});
};

var initRecords = function() {
var globalLock = new Lock();

var update = function(args, focus) {
    ajaxActivity.start("pagination", 0);
        
    $j.post("/records/partial" + getSessionId(), args, function(data) {
        $j("#left2w").replaceWith(data);
        attachChannelSortHandler(update, globalLock);
        enableCriteriaControls();
            
        channelOverInit($j("#left2w"));
            
        ajaxActivity.end();
            
        if (focus) {
            scrollToFocusable();
        }

        globalLock.release();
    });
};
    
window.changeRecordsPage = function(page) {
    if (!globalLock.acquire()) {
        return;
    }

    update({page: page}, true);
};
    
$j(function() {
    attachChannelSortHandler(update, globalLock);
    enableCriteriaControls();
});
};

var initSearchPeople = function() {
var globalLock = new Lock();
    
var attachResultsHandler = function(update) {
    $j("#resultsPerPage").change(function() {
        if (!globalLock.acquire()) {
            return false;
        }

        update({
            resultsPerPage: $j(this).val()
        });
    });
};
    
var update = function(args, focus) {
    ajaxActivity.start('common', 1000);
    var url = $j("#left2w").attr("base_url");
        
    $j.post(url + "/partial" + getSessionId(), args, function(data) {
        $j("#left2w").replaceWith(data);
        attachResultsHandler(update);
        enableCriteriaControls();
            
        attachPeopleMouseOver($j("#left2w"));
            
        ajaxActivity.end();
            
        if (focus) {
            scrollToFocusable();
        }

        globalLock.release();
    });
};
    
window.changePeoplePage = function(page) {
    if (!globalLock.acquire()) {
        return;
    }

    update({page: page}, true);
};
    
$j(function() {
    attachResultsHandler(update);
    enableCriteriaControls();
    initCategoriesMouseOver();
    attachPeopleMouseOver();
});
};

var initPeoplePartial = function() {
var globalLock = new Lock();

var attachHandlers = function(update) {
    $j("#peopleCont #resultsPerPage").change(function() {
        if (!globalLock.acquire()) {
            return false;
        }

        update({
            resultsPerPage: $j(this).val()
        });
    });
        
    $j("#peopleCont #sortBy").change(function() {
        if (!globalLock.acquire()) {
            return false;
        }

        update({
            sortBy: $j(this).val()
        });
    });
};
    
var update = function(args, focus) {
    var url = $j("#peopleCont").attr("base_url");
        
    $j.post(url + "/partial" + getSessionId(), args, function(data) {
        $j("#peopleCont").replaceWith(data);
        attachHandlers(update);
        enableCriteriaControls();

        attachPeopleMouseOver($j("#peopleCont"));
            
        if (focus) {
            scrollToFocusable();
        }

        globalLock.release();
    });
};
    
window.changePeoplePage = function(page) {
    if (!globalLock.acquire()) {
        return;
    }

    update({page: page}, true);
};
    
$j(function() {
    attachHandlers(update);
    enableCriteriaControls();
    attachPeopleMouseOver();
});
};



var initPeople = function() {
initCategoriesMouseOver();
    
$j(function() {
    attachSlider("#popularShowAll", "#popularAuthors");
    attachSlider("#discussedShowAll", "#discussedAuthors");
    attachSlider("#newestShowAll", "#newestMembers");
    attachSlider("#onlineShowAll", "#onlineMembers");
        
    attachPeopleMouseOver();
});
};

var initPerson = function() {
initCategoriesMouseOver();
    
$j(function() {
    attachTop20Sliders();
    attachSlider("#videoShowAll", "#topVideo20");
    attachSlider("#radioShowAll", "#topRadio20");
    attachSlider("#recordsShowAll", "#topRecords20");
});
};

var attachTopMouseover = function() {
var isGreen = function(styleClass) {
    return styleClass !== undefined && (styleClass.indexOf("menuBarBtngreen") != -1);
};
var isOrange = function(styleClass) {
    return styleClass !== undefined && (styleClass.indexOf("menuBarBtnorange") != -1);
};
var isBlue = function(styleClass) {
    return styleClass !== undefined && (styleClass.indexOf("menuBarBtnblue") != -1);
};    
$j("#menuLine a").each(function() {
    var $a = $j(this);

    $a.hover(
    function() {
        var styleClass = $a.attr("class");

        if (!isGreen(styleClass) && !isOrange(styleClass) && !isBlue(styleClass)) {
            $a.addClass("menuBarBtn");
        } else {
            if (isGreen(styleClass)) {
                $a.removeClass("menuBarBtngreennrml");
                $a.addClass("menuBarBtngreenover");
            } else if (isOrange(styleClass)) {
                $a.removeClass("menuBarBtnorangenrml");
                $a.addClass("menuBarBtnorangeover");
            } else if (isBlue(styleClass)) {
                $a.removeClass("menuBarBtnbluenrml");
                $a.addClass("menuBarBtnblueover");
            }
        }
    },
    function() {
        var styleClass = $a.attr("class");

        if (!isGreen(styleClass) && !isOrange(styleClass) && !isBlue(styleClass)) {
            $a.removeClass("menuBarBtn");
        } else {
            if (isGreen(styleClass)) {
                $a.removeClass("menuBarBtngreenover");
                $a.addClass("menuBarBtngreennrml");
            } else if (isOrange(styleClass)) {
                $a.removeClass("menuBarBtnorangeover");
                $a.addClass("menuBarBtnorangenrml");
            } else if (isBlue(styleClass)) {
                $a.removeClass("menuBarBtnblueover");
                $a.addClass("menuBarBtnbluenrml");
            }
        }
    }
);
});
};


var ajaxActivity = {
start: function(type, time) {
    $j(window).trigger('activityStart', [type, time]);
},
end: function() {
    $j(window).trigger('activityEnd');
}
};

var showInviteFriendsForm = function (contactsData) {
var contacts = eval("[" + contactsData + "]");
    
var emailsDivData = "";
    
$j.each(contacts[0].friends, function(i,item){       
    if(item.name != null) {            
        emailsDivData += "<div class=\"row clearfix\"><p><input type=\"checkbox\" name=\"emailsChecked\" value=\"" + item.emails + "\" class=\"chkInCol\" /><label class=\"lblInCol\">" + item.name + "</label></p>" + item.emails + "</div><div class=\"hrdouble five\"><div><div>&nbsp;</div></div></div>";
    } else {           
        emailsDivData += "<div class=\"row clearfix\"><input type=\"checkbox\" name=\"emailsChecked\" value=\"" + item.emails + "\" class=\"chkInCol\" />" + item.emails + "</div><div class=\"hrdouble five\"><div><div>&nbsp;</div></div></div>";
    }
});          
    
$j("#emailsDiv").html(emailsDivData);
      
if(document.getElementById("homeCont") != null) {
    $j("#homeCont").css("display", 'none'); 
}    
if(document.getElementById("peopleCont") != null) {
    $j("#peopleCont").css("display", 'none'); 
}
 
$j("#homeContInviteFriends").css("display", 'block');
};

var hideInviteFriendsForm = function() {
if(document.getElementById("homeCont") != null) {
    $j("#homeCont").css("display", 'block'); 
}    
if(document.getElementById("peopleCont") != null) {
    $j("#peopleCont").css("display", 'block'); 
}               
$j("#homeContInviteFriends").css("display", 'none');
};

var cancelInviteText = function(defaultText) {
document.getElementsByName("textToSend")[0].value = defaultText.substring(0, 500);
    
showInviteFriendsFormEdit(true);
};

var setTextToSend = function() {
document.getElementsByName("textToSendParam")[0].value = document.getElementsByName("textToSend")[0].value.substring(0, 500);
};

var showInvitePreview = function() {
if ($j("[name='textToSend']").val().length > 500) {
    $j("#inviteLengthError").show();
        
    return false;
} else {
    $j("#inviteLengthError").hide();
}
    
var $contBack = $j("#overContainerBase");
var $cont = $j("#overContainer");
var $invitePreviewCont = $j("#invitePreview");
var $inviteChild = $j("#invitePreview > div");
    
this.inviteUpdate = function() {
    var marginTop = Math.floor(($j(window).height() - ($inviteChild.height() + 60)) / 2);
    $inviteChild.css("marginTop", ($j.scrollTop() + marginTop) + "px");
};
$j(window).bind('scroll', this.inviteUpdate);
    
$cont.append($invitePreviewCont);
    
var textToSend = $j("[name='textToSend']").val().replace(/\r|(\r?\n)/g, "<br/>").substring(0, 500);
$j("#previewP").html(textToSend);
    
if (!window.inviteFlashCont) {
    window.inviteFlashCont = new FlashContainer();
}
window.inviteFlashCont.hide($j("embed,object"));
    
$contBack.show();
$cont.show();
$invitePreviewCont.css("display", "block");
this.inviteUpdate();
};

var hideInvitePreview = function() {
var $contBack = $j("#overContainerBase");
var $cont = $j("#overContainer");
    
$j(window).unbind('scroll', this.inviteUpdate);
    
$j("#invitePreview").css("display", 'none');
    
if (window.inviteFlashCont) {
    window.inviteFlashCont.show();
}
    
$contBack.hide();
$cont.hide();
};

var blockedPopup = {
flashCont: new FlashContainer(), 
    
show: function() {
    var $contBack = $j("#overContainerBase");
    var $cont = $j("#overContainer");
    var $blockedCont = $j("#blockedCont");
    var $innerCont = $blockedCont.children(":first");
        
    this.update = function() {
        var marginTop = Math.floor(($j(window).height() - $innerCont.height()) / 2);
        $blockedCont.css("marginTop", $j.scrollTop() + marginTop + "px");
    };
    $j(window).bind('scroll', this.update);
        
    this.flashCont.hide($j("embed,object"));
        
    $contBack.show();
    $cont.show();
    $blockedCont.show();
    this.update();
},
hide: function() {
    var $contBack = $j("#overContainerBase");
    var $cont = $j("#overContainer");

    $j(window).unbind('scroll', this.update);
    $j("#blockedCont").css("display", 'none');
        
    this.flashCont.show();

    $contBack.hide();
    $cont.hide();
}
};

var showBroadcastLeaveConfirm = (function() {
var flashCont = new FlashContainer();
    
return function(isVisible) {
    var $contBack = $j("#overContainerBase");
    var $cont = $j("#overContainer");
    var $confirmDiv = $j("#broadcastLeaveConfirmDiv");
    var $innerCont = $confirmDiv.children(":first");

    if (isVisible == true) {
        this.broadcastConfirmUpdate = function() {
            var marginTop = Math.floor(($j(window).height() - $innerCont.height()) / 2);
            $confirmDiv.css("marginTop", $j.scrollTop() + marginTop + "px");
        };
        $j(window).bind('scroll', this.broadcastConfirmUpdate);

        flashCont.hide($j("embed,object"));

        $contBack.show();
        $cont.show();
        $confirmDiv.css("display", "block");
        if ($j.browser.msie) {
            $confirmDiv.find(".centered").css("display", "inline-block");
        }
        this.broadcastConfirmUpdate();
    } else {    
        $confirmDiv.css("display", 'none');

        $j(window).unbind('scroll', this.broadcastConfirmUpdate);

        flashCont.show();

        $contBack.hide();
        $cont.hide();
    }
};
})();

var hideDeleteCommentConfirmWnd = function() {
var $postBackLayer = $j("#postCommentBack");
var $postCommentCont = $j("#postCommentCont");
    
$j("#postCommentFlyDiv").css("display", 'block');
$j("#deleteCommentFlyDiv").css("display", 'none');
$j("#deleteCommentConfirmation").css("display", 'none');                        
    
$postCommentCont.removeClass('overCommDelete');
$postCommentCont.addClass('overCommForm');
                    
$postBackLayer.hide();
$postCommentCont.hide();
};

var showInviteFriendsFormEdit = function (isMain) {
if ($j("[name='textToSend']").val().length > 500) {
    $j("#inviteLengthError").show();
        
    return false;
} else {
    $j("#inviteLengthError").hide();
}
    
$j("#inviteFriendsMain").css("display", isMain ? 'block' : 'none');               
$j("#inviteFriendsEdit").css("display", isMain ? 'none' : 'block');
};

var setAllCheckBoxes = function(FormName, FieldName) {   
if(!document.forms[FormName]) {
    return;
}

var checkedVal = document.getElementById("selAllCheckbox").checked;

var objCheckBoxes = document.forms[FormName].elements[FieldName];
if(!objCheckBoxes) {
    return;
}
    
var countCheckBoxes = objCheckBoxes.length;
if(!countCheckBoxes) {
    objCheckBoxes.checked = checkedVal;
} else {
    // set the check value for all check boxes
    for(var i = 0; i < countCheckBoxes; i++) {
        objCheckBoxes[i].checked = checkedVal;
    }
}
};


var initOnlinePartial = function() {
var globalLock = new Lock();

var attachHandlers = function(update) {
    $j("#onlineCont #resultsPerPage").change(function() {
        if (!globalLock.acquire()) {
            return false;
        }

        update({
            resultsPerPage: $j(this).val()
        });
    });
};
    
var update = function(args, focus) {
    ajaxActivity.start('common', 1000);
    var url = $j("#onlineCont").attr("base_url");
        
    $j.post(url + "/partial" + getSessionId(), args, function(data) {
        $j("#onlineCont").replaceWith(data);
        attachHandlers(update);
        enableCriteriaControls();

        attachPeopleMouseOver($j("#onlineCont"));
        $j("span[id='peopleSize']").html($j("[spy_people_size]").attr('spy_people_size'));
        ajaxActivity.end();
            
        if (focus) {
            scrollToFocusable();
        }

        globalLock.release();
    });
};
    
window.changePeoplePage = function(page) {
    if (!globalLock.acquire()) {
        return;
    }

    update({page: page}, true);
};
    
$j(function() {
    attachHandlers(update);
    enableCriteriaControls();
    attachPeopleMouseOver();
});
};

var flashDetection = (function() {
var hasProductInstall = DetectFlashVer(6, 0, 65);
var hasRequestedVersion = DetectFlashVer(9, 0, 60);

if (hasProductInstall && !hasRequestedVersion) {
    var MMPlayerType = (isIE ? "ActiveX" : "PlugIn");
    var MMredirectURL = window.location;
    document.title = document.title.slice(0, 47) + " - Flash Player Installation";
    var MMdoctitle = document.title;

    var data = AC_FL_RunContent(
    "src", "/res/swf/playerProductInstall",
    "FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"",
    "width", "305",
    "height", "190",
    "align", "middle",
    "id", "expressInstall",
    "quality", "high",
    "bgcolor", "#3A6EA5",
    "name", "expressInstall",
    "allowScriptAccess","always",
    "type", "application/x-shockwave-flash",
    "pluginspage", "http://www.adobe.com/go/getflashplayer"
);
        
    $j(function() {
        $j("div[@id^=flashDetection_]").each(function() {
            var $rootCont = $j(this);
            var $expressCont = $rootCont.children("div:eq(1)");

            $expressCont.css("display", "block");

            $expressCont.children("a").click(function() {
                $j(this).parent().replaceWith(data);

                return false;
            });
        });
    });
} else if (!hasRequestedVersion) {
    $j(function() {
        $j("div[@id^=flashDetection_] > div:first-child").css("display", "block");
    });
}
    
return {
    noFlash: !hasRequestedVersion, 
    canExpressInstall: hasProductInstall, 
        
    getPopupData: function(id) {
        return $j("#flashDetection_popup").clone(true).attr("id", id).css("display", "block");
    }
};
})();

var initContactUs = function() {
$j(function() {
    $j("#secScreen input").click(function() {
        $j("#secScreen").hide();
        $j("#firstScreen").show();
            
        return false;
    });
        
    $j("#contactUsForm").submit(function() {
        $j("#errName,#errEmail,#errMsg,#errCptch").hide();
            
        var name = $j("#contactUserName").val();
        var email = $j("#contactUserEmail").val();
        var message = $j("#contactMassage").val();
        var captchaCode = $j("#cptchCode").val();
            
        var error = false;
            
        if (name.trim().length < 2) {
            $j("#errName").css("display", "inline");
            error = true;
        }
            
        var reEmail = new RegExp("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?");
        var match = reEmail.exec(email.trim());
            
        if (match == null || match.index !== 0) {
            $j("#errEmail").css("display", "inline");
            error = true;
        }

        if (message.trim().length < 5) {
            $j("#errMsg").css("display", "inline");
            error = true;
        }

        if (!captchaCode.trim().length) {
            $j("#errCptch").css("display", "inline");
            error = true;
        }
            
        return !error;
    });
});
};

var setNewMsgCounter = function(val) {
var $newMsgCount = $j("#newMsgCount");
var $imgIs = $j("#newMsgImgIs");
var $img = $j("#newMsgImg");
    
if (val == 0) {
    $img.css("display", "inline");
    $imgIs.css("display", "none");
    $newMsgCount.css("display", "none");
} else {
    $img.css("display", "none");
    $imgIs.css("display", "inline");
    $newMsgCount.text("(" + val + ")").css("display", "inline");
}
};

var onlineMbrsCounter = function(val) {
    var update = lock(function(unlock) {
        $j.ajax({
            url: "/service/banner", 
            dataType: "json", 
            complete: unlock, 
            success: function(data) {
                $j("#mbrsOnlineCntShr,#mbrsOnlineCnt").html(data.users + "&nbsp;" + val);
            }
        });
    });
    $j(update);
    
    window.setInterval(update, 30000);
};

var streamOnlineObserver = function() {
    $j(function() {
        var $link = $j("#liveLink");
        var cid = $link.attr("spy_cid");
        var channelUrlLink = $link.attr("spy_url");

        var update = lock(function(unlock) {
            $j.ajax({
                url: "/service/channel/lastPost/live" + getSessionId(), 
                data: {cid: cid}, 
                dataType: "json", 
                complete: unlock, 
                success: function(data) {
                    if (data.live) {
                        $link.attr("href", "/channel/" + channelUrlLink + "/" + data.urlLink + getSessionId());
                        $link.show();
                    } else {
                        $link.hide();
                    }
                }
            });
        });
        update();

        window.setInterval(update, 10000);
    });
};

var mcObserver= function() {
    $j(function() {
        var $msgCounter = $j("#newMsgCount");
        var $iconMsg = $j("#newMsgImg");
        var $iconIsMsg = $j("#newMsgImgIs");

        var hideElements = function(){
            $msgCounter.hide();
            $iconMsg.hide();
            $iconIsMsg.hide();
        };

        var update = lock(function(unlock) {
            $j.ajax({
                url: "/service/messages/counter", 
                dataType: "json", 
                complete: unlock, 
                success: function(data) {
                    if (data.response == "OK") {
                        hideElements();
                        if (data.num != 0) {
                            $msgCounter.text("(" + data.num +")");
                            $msgCounter.show();
                            $iconIsMsg.show();
                        } else {
                            $iconMsg.show();
                        }
                    }
                }
            });
        });
        update();
        
        window.setInterval(update, 60000);
    });
};

var initAccount = function() {
    $j(function() {
        $j(window).bind(SpyEvent.ALLOW_FLASH_SIZE_CHANGE, function(e, yes) {
            var timeBalance = getFlashMovie("timeBalanceMovie");
            if (timeBalance && timeBalance.allowFlashSizeChange) {
                timeBalance.allowFlashSizeChange(yes);
            }
        });
        
        $j("#avatarTab").click(function() {
            $j(this).next("li")
              .removeClass("selgrey")
            .end().addClass("selblue").blur();

            $j("#autoresponder").hide();
            $j("#flashcontentAvatar").show();

            return false;
        });
        $j("#responderTab").click(function() {
            $j(this).prev("li")
              .removeClass("selblue")
            .end().addClass("selgrey").blur();

            $j("#flashcontentAvatar").hide();
            $j("#autoresponder").show();

            return false;
        });
    });
};
