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

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

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

var JSON_MIME_TYPE = "application/json";

var isResponseJSON = function(req) {
    return req.getResponseHeader("Content-Type").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;
        });
        
        func.apply(func, args);
    };
};

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 getSessionId = function() {
    var value = $j("#jsessionid").val();
    
    return (value.length > 1 ? value.slice(1) : "");
};

var animate = function(elems, method, speed, oncomplete) {
    var anim = function(index) {
        if (index < elems.length) {
            var count = 0;

            elems[index][method](speed, function() {
                if (++count == elems[index].length) {
                    anim(index + 1);
                }
            });
        } else {
            oncomplete();
        }
    };

    anim(0);
};

var makeHoverWithDelay = function(time) {
    var timerId = null;
    var $activeCont = {length: 0};
    
    return function($parent, $cont, over, out) {
        $parent.hover(
            function() {
                if (timerId) {
                    window.clearTimeout(timerId);
                }
                if ($activeCont.length) {
                    $activeCont.hide();
                }
                
                timerId = window.setTimeout(function() {
                    if (over) {
                        over();
                    }
                    
                    $activeCont = $cont;
                    $cont.show();
                    timerId = null;
                }, time);
            },
            function() {
                if (timerId) {
                    window.clearTimeout(timerId);
                }
                $cont.hide();
                if (out) {
                    out();
                }
            }
        );
    };
};

var attachSlider = function($elem, $children, minElems) {
    var running = false;
    var showing = false;
    
    $elem.click(function() {
        if (running) {
            return false;
        }

        running = true;

        if (showing) {
            var fadeOutElems = [];

            for (var i = $children.length - 1; i >= minElems; i--) {
                fadeOutElems.push($children.slice(i, i + 1));
            }

            animate(fadeOutElems, "slideUp", "fast", function() {
                showing = false;
                running = false;
            });
        } else {
            var fadeInElems = [];
            for (var j = minElems, len = $children.length; j < len; j++) {
                fadeInElems.push($children.slice(j, j + 1));
            }

            animate(fadeInElems, "slideDown", "fast", function() {
                showing = true;
                running = false;
            });
        }

        return false;
    });
};

var attachPeopleMouseOver = function($baseCont) {
    var hover = makeHoverWithDelay(200);
    
    var MEMBER_HEIGHT = 48;
    var ABS_HEIGHT = 182;
    
    var query = "div.__mover";
    
    ($baseCont ? $baseCont.find(query) : $j(query)).each(function() {
        var $rel = $j(this);
        var $rootContainer = $j("#" + $rel.attr("rootContainer"));
        var forceDown = ($rel.attr("forceDown") === "true");
        
        hover($rel.parent(), $rel, 
            function() {
                var parentOffsetTop = $rel.parent().offsetTop();
                var $mainCont = $j("#containerContent");
                var $bottomCont = $j("#containerBottom");
                
                var upperHeight = parentOffsetTop - $mainCont.offsetTop();
                var lowerHeight = $bottomCont.offsetTop() - parentOffsetTop;

                var top = MEMBER_HEIGHT;

                if ((lowerHeight - ABS_HEIGHT - MEMBER_HEIGHT) > 0) {
                    top = MEMBER_HEIGHT;
                } else if ((upperHeight - ABS_HEIGHT) > 0) {
                    if (forceDown) {
                        var contUpperHeight = parentOffsetTop - $rootContainer.offsetTop();
                        
                        if ((contUpperHeight - ABS_HEIGHT) < 0) {
                            top = MEMBER_HEIGHT;
                        } else {
                            top = -ABS_HEIGHT;
                        }
                    } else {
                        top = -ABS_HEIGHT;
                    }
                }

                $rel.children(":eq(1)").css("top", top + "px");
            }
        );
    });
};

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();
                }
                
                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;
            }
            
            $j.post("/service/channel/tags/add" + getSessionId(), {cid:cid, tags: value}, 
                function(data) {
                    $j("#tagsContRoot").replaceWith(data);
                    attachDeleteHandlers();
                    attachAddHandler();
                    initButtonEffect();
                    $textarea.val("");
                }
            );
            
            return false;
        });
    };
    
    attachDeleteHandlers();
    attachAddHandler();
};

var editFavourites = (function() {
    var execute = function(add, $addButton, $removeButton, cid) {
        $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");
                        $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");

            $addButton.defineOnce("addToFavourites", function() {
                $addButton.click(function() {
                    execute(true, $addButton, $removeButton, cid);

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

                    return false;
                });
            });
        });
    };
})();

var editRelationships = (function() {
    var addToFriendsQuery = "a[id^='addToFriends_']";
    var removeFromFriendsQuery = "a[id^='removeFromFriends_']";
    
    var showAdd = function(fullId, show) {
        $j("a[id^='addToFriends_" + fullId + "']").css("display", (show ? 'inline' : 'none'));
        $j("a[id^='removeFromFriends_" + fullId + "']").css("display", (show ? 'none' : 'inline'));
    };
    
    var addToFriends = function(uid, fullId) {
        $j.getJSON("/service/friends/add" + getSessionId(), {uid:uid}, 
            function(data) {
                if (data.response === "OK") {
                    showAdd(fullId, false);
                }
            }
        );
    };
    
    var removeFromFriends = function(uid, fullId) {
        $j.getJSON("/service/friends/remove" + getSessionId(), {uid:uid},
            function(data) {
                if (data.response === "OK") {
                    showAdd(fullId, true);
                }
            }
        );
    };
    
    return function($cont) {
        ($cont ? $cont.find(addToFriendsQuery) : $j(addToFriendsQuery)).each(function() {
            var $a = $j(this);

            $a.defineOnce("addToFriends", function() {
                var fullId = $a.attr("id");
                fullId = fullId.slice(fullId.indexOf("_") + 1);

                var uid = $a.attr("id").split("_", 2)[1];

                $a.click(function() {
                    addToFriends(uid, fullId);

                    return false;
                });
            });
        });

        ($cont ? $cont.find(removeFromFriendsQuery) : $j(removeFromFriendsQuery)).each(function() {
            var $a = $j(this);

            $a.defineOnce("removeFromFriends", function() {
                var uid = $a.attr("id").split("_", 2)[1];
                var fullId = $a.attr("id");
                fullId = fullId.slice(fullId.indexOf("_") + 1);

                $a.click(function() {
                    removeFromFriends(uid, fullId);

                    return false;
                });
            });
        });
    };
})();

var initPersonMouseOver = function($root) {
    var Region = {
        LEFT: 0,
        RIGHT: 1,
        TOP: 2,
        BOTTOM: 3
    };
    
    var hover = makeHoverWithDelay(200);
    
    var query = "div[id^='memberMOver_']";
    
    ($root ? $root.find(query) : $j(query)).each(function(index) {
        var $cont = $j(this);
        
        $cont.defineOnce("personMouseOver", function() {
            var $avatarContHover = $cont.find("[id^='avatarContHover_']");
            
            if (!$avatarContHover.length) {
                return;
            }
            
            if ($avatarContHover.length) {
                var hoverContId = $avatarContHover.attr("id");
                var id = hoverContId.slice(hoverContId.indexOf("_") + 1);
                var $absCont = $cont.children("div");
                var $avatarCont = $j("#avatarCont_" + id);
                var $vspacer = $cont.find("[id^='avatarVSpacer_']");
                var $contRight = $cont.find("[id^='avatarContRight_']");

                var left = $cont.hiddenValue("left", 10);
                var top = $cont.hiddenValue("top", 10);
                var absWidth = $cont.hiddenValue("absWidth", 10);
                var absHeight = $cont.hiddenValue("absHeight", 10);
                var avatarWidth = $cont.hiddenValue("avatarWidth", 10);
                var avatarHeight = $cont.hiddenValue("avatarHeight", 10);
                var vspacerWidth = $cont.hiddenValue("vspacerWidth", 10);
                
                var contId = $cont.hiddenValue("contId");
                var $masterCont = {length: 0};
                if (contId) {
                    $masterCont = $j("#" + contId);
                }

                var getTopSpace = function() {
                    if ($masterCont.length) {
                        return ($avatarCont.offset().top + avatarHeight) - $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 $j("#containerBottom").offset().top - 20 - $avatarCont.offset().top;
                    }
                };

                var getLeftSpace = function() {
                    if ($masterCont.length) {
                        return ($avatarCont.offset().left + $avatarCont.width()) - $masterCont.offset().left;
                    }

                    return 0;
                };

                var getRightSpace = function() {
                    if ($masterCont.length) {
                        return ($masterCont.offset().left + $masterCont.width()) - $avatarCont.offset().left;
                    }

                    return 0;
                };

                hover($cont.parent(), $cont, function() {
                    var leftSpace = getLeftSpace();
                    var rightSpace = getRightSpace();
                    var topSpace = getTopSpace();
                    var bottomSpace = getBottomSpace();

                    var absTop = top;
                    var absLeft = left;
                    var avatarMarginTop = 0;

                    var regionHoriz = Region.LEFT;
                    var regionVert = Region.TOP;
                    
                    var leftToRightWidth = absWidth - vspacerWidth - avatarWidth;

                    if (!$masterCont.length) {
                        if (bottomSpace < absHeight) {
                            regionVert = Region.BOTTOM;
                        }
                    } else {
                        if ((bottomSpace < absHeight) && (topSpace >= absHeight)) {
                            regionVert = Region.BOTTOM;
                        }
                        if ((rightSpace < absWidth) && (leftSpace >= (leftToRightWidth))) {
                            regionHoriz = Region.RIGHT;
                        }
                    }

                    if (regionVert == Region.BOTTOM) {
                        absTop = -(absHeight - avatarHeight);
                        avatarMarginTop = absHeight - avatarHeight + top;
                    }
                    if (regionHoriz == Region.RIGHT) {
                        absLeft = -leftToRightWidth;

                        $j([$contRight, $vspacer, $avatarContHover]).appendTo($absCont);
                    }

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

                    //$avatarContHover.css("marginTop", avatarMarginTop + "px");
                });
            }
        });
    });
};
    
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 updateMyChannels = function(page) {
    $j.post("/home/my_channels" + getSessionId(), {page: page}, 
        function(data) {
            $j("#myChannelsCont").replaceWith(data);
            initPersonMouseOver();
            editRelationships();
            initButtonEffect();
        }
    );
};

var attachTop20Sliders = function() {
    attachSlider($j("#topVideo20Show"), $j("#topVideo20").children(".left"), 2);
    attachSlider($j("#topRadio20Show"), $j("#topRadio20").children(".left"), 2);
};

var changeRegion = {
 hiddenConts: {length: 0},
    update: null,
    
    show: function(pred) {
        var $contBack = $j("#overContainerBase");
        var $cont = $j("#overContainer");

        if (pred) {
            $cont.children("#guestContFlash").remove();
            $cont.children(".intBox").css("display", "none");
            
            $guestContFlash = $j("<div id='guestContFlash' style='z-index:105;display:block;'>&nbsp;</div>");
            marginTop = Math.floor(($j(window).height() - 511) / 2);
            $guestContFlash.css("marginTop", $j.scrollTop() + marginTop + "px");
            $guestContFlash.appendTo($cont);

            this.update = function() {
                $guestContFlash.css("marginTop", $j.scrollTop() + marginTop + "px");
            };
            
            $j(window).bind('scroll', this.update);
            
            this.hiddenConts = $j("embed,object").parent().visible(false);
            $contBack.show();
                       
            var flashObject = new SWFObject("/res/swf/world_map/worldmap.swf", "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("flags", "/res/flags/");
            flashObject.addVariable("userLocation", $j("#countryCd").val());
            flashObject.addVariable("mapLocale", "/res/locale/loc_map_" + $j("#locale").val() + ".xml");
          
            
            flashObject.write("guestContFlash");
            $cont.show();
            $guestContFlash.show();
        } else {
            if (this.closeStarted) {
                return;
            }
            
            this.closeStarted = true;
            
            var self = this;
            window.setTimeout(function() {
                $j(window).unbind('scroll', self.update);
                $cont.children("#guestContFlash").remove();
                $cont.hide();
                $contBack.hide();

                if (self.hiddenConts.length) {
                    self.hiddenConts.visible(true);
                }
                self.closeStarted = false;
            }, 1);
        }
    }
};

var quickCreate = (function() {
    var $rootCont = null;
    var $agreeInput = null;
    var $videoButton = null;
    var $radioButton = null;
    var $flashConts = [];
    
    return {
        init: function() {
            $rootCont = $j("#quickRootCont");
            $agreeInput = $j("#quickAgreeInput");
            
            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) {
            var $overContainerBack = $j("#overContainerBase");
            var $overContainer = $j("#overContainer");
            
            if (pred) {
                $flashConts = $j("embed,object").parent().visible(false);
        
                var marginTop = Math.floor(($j(window).height() - 406) / 2);
                $rootCont.css("marginTop", $j.scrollTop() + marginTop + "px");

                this.update = function() {
                    $rootCont.css("marginTop", $j.scrollTop() + marginTop + "px");
                };

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

var languagePopup = {
    fetched: false,
    active: false,
    
    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() {
            var marginTop = Math.floor(($j(window).height() - 397) / 2);
            $langCont.css("marginTop", $j.scrollTop() + marginTop + "px");

            self.update = function() {
                $langCont.css("marginTop", $j.scrollTop() + marginTop + "px");
            };

            $j(window).bind('scroll', self.update);
            
            self.hiddenConts = $j("embed,object").parent().visible(false);
            $contBack.show();
            $cont.show();
            $langCont.show();
        }
        
        if (!this.fetched) {
            $j.get("/service/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() {
                    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();
        
        $j(window).unbind('scroll', this.update);

        if (this.hiddenConts.length) {
            this.hiddenConts.visible(true);
        }
    }
};

var quickTour = {
    show: function() {
        var $contBack = $j("#overContainerBase");
        var $cont = $j("#overContainer");
        
        $cont.children("#quickTourCont").remove();
        
        var $tourCont = $j("<div id='quickTourCont' class='centered' style='z-index:105;display:none;'>&nbsp;</div>");
        $tourCont.appendTo($cont);
        
        var marginTop = Math.floor(($j(window).height() - 500) / 2);
        $tourCont.css("marginTop", $j.scrollTop() + marginTop + "px");
        
        this.update = function() {
            $tourCont.css("marginTop", $j.scrollTop() + marginTop + "px");
        };

        $j(window).bind('scroll', this.update);
        
        this.hiddenConts = $j("embed,object").parent().visible(false);
        $contBack.show();
        
        var flashObject = new SWFObject("/res/swf/quickTour/quickTour.swf", "tourMovie", "960", "500", "8", "#333333");
        flashObject.addParam("quality", "high");
        flashObject.addParam("menu", "false");
        flashObject.addVariable("locale", "/res/locale/loc_qt_" + $j("#locale").val() + ".xml");
        $cont.show();
        $tourCont.show();
        
        flashObject.write("quickTourCont");
    },
    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("#quickTourCont").remove();
            $cont.hide();
            $contBack.hide();

            if (self.hiddenConts.length) {
                self.hiddenConts.visible(true);
            }

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

var guestRegistration = {
    hiddenConts: {length: 0},
    update: null,
    
    show: function(pred) {
        var $contBack = $j("#overContainerBase");
        var $cont = $j("#overContainer");

        if (pred) {
            $cont.children("#guestContFlash").remove();
            $cont.children(".intBox").css("display", "none");
            
            $guestContFlash = $j("<div id='guestContFlash' class='centered' style='z-index:105;visibility:hidden;'>&nbsp;</div>");
            marginTop = Math.floor(($j(window).height() - 310) / 2);
            $guestContFlash.css("marginTop", $j.scrollTop() + marginTop + "px");
            $guestContFlash.appendTo($cont);

            this.update = function() {
                $guestContFlash.css("marginTop", $j.scrollTop() + marginTop + "px");
            };
            
            $j(window).bind('scroll', this.update);
            
            this.hiddenConts = $j("embed,object").parent().visible(false);
            $contBack.show();
            
            
            
            var flashObject = new SWFObject("/res/swf/register/reg_onfly.swf", "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");
            
            $cont.show();
            $guestContFlash.visible(true);
            
            flashObject.write("guestContFlash");
        } else {
            if (this.closeStarted) {
                return;
            }
            
            this.closeStarted = true;
            
            var self = this;
            window.setTimeout(function() {
                $j(window).unbind('scroll', self.update);
                $cont.children("#guestContFlash").remove();
                $cont.hide();
                $contBack.hide();
                
                if (self.hiddenConts.length) {
                    self.hiddenConts.visible(true);
                }
                
                self.closeStarted = false;
            }, 1);
        }
    }
};

var setStreamPid = function(pid) {
    streamControl.active = true;
    var $rootCont = $j("#commentsRootCont");
    $rootCont.find("input[name='pid']:hidden").val(pid);
    $j("#navInt,#commentsRootCont").show();
    adjustCommentsSubCont();
    
    chatObject.addVariable("streamId", pid);
    chatObject.write("chatOneN");
    coWatchersObject.addVariable("streamId", pid);
    coWatchersObject.write("flashcontent");
}

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

    var getPid = function() {
        return $rootCont.hiddenValue("pid");
    };
    
    var getLatestPostTime = function($cont) {
        var latestTime = 0;

        $cont.find("input[name='createdDate']").each(function() {
            var time = parseInt($j(this).val(), 10);
            if (time > latestTime) {
                latestTime = time;
            }
        });

        return latestTime;
    };
    
    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 updateCommentsColorBands = function($cont) {
        var query = "div.commentMsg";

        ($cont ? $cont.find(query) : $j(query)).each(function(i) {
            if (i % 2 === 0) {
                $j(this).addClass("frow");
            } else {
                $j(this).removeClass("frow");
            }
        });
    };

    var makeUpdateAbsCont = function($abs, absHeight) {
        return function(top) {
            if (scrollable) {
                $postBackLayer.css("top", "0");

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

                var 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 makeShowAbsCont = function($absCont, onshow, onhide) {
        return function(pred) {
            if (pred) {
                if (!scrollable && $commentsSubCont.height() < 217) {
                    $commentsSubCont.css("minHeight", "217px");
                }

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

                $absCont.hide();
                $postBackLayer.hide();
                $j("#commentsTab").css("zIndex", "3");
                
                if (onhide) {
                    onhide();
                }
            }
        };
    };
    
    var showPostCont = makeShowAbsCont($postCommentCont, function() {
        $textarea.trigger("focus");
    });
    
    var showDeleteConfirmCont = makeShowAbsCont($deleteConfirmCont, undefined, function() {
        $deleteConfirmCont.find("#deleteConfirmYes").unbind("click");
    });

    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 height = (window.size().height - containerBottomHeight) - (chatActive ? $chatCont.offsetTop() : $commentsSubCont.offsetTop());
        height = Math.max(120, height);
        
        chatHeight = (window.size().height - containerBottomHeight) - (chatActive ? $chatCont.offsetTop() : $rootCont.offsetTop());
        chatHeight = Math.max(151, chatHeight);
        
        $commentsSubCont.css("height", height + "px");
        updatePostCont();
        updateDeleteConfirmCont();
        
        if (chatActive) {
            $chatCont.css("height", chatHeight + "px");
        }
    };
    this.adjustCommentsSubCont = adjustCommentsSubCont;
    
    
    if (scrollable) {
        $j(window).resize(function() {
            adjustCommentsSubCont();
        });
    }
    
    var initCommentsSorter = function() {
        var $commentsSortBtn = $j("#commentsSortBtn");
        var $freshOnTopText = $j("#freshOnTopText");
        var $oldestOnTopText = $j("#oldestOnTopText");

        $commentsSortBtn.click(function() {
            commentsSort = (commentsSort === Sort.DESC ? Sort.ASC : Sort.DESC);

            var elems = [];

            $rootCont.find("div.commentMsg").each(function() {
                var $msgCont = $j(this);

                elems.push({
                    $msgCont: $msgCont,
                    time: $msgCont.hiddenValue("createdDate", 10)
                });
            });

            if (elems.length) {
                elems.sort(function(a, b) {
                    return (commentsSort === Sort.DESC ? b.time - a.time : a.time - b.time);
                });

                var $parent = elems[0].$msgCont.parent();

                $j(elems).each(function(i) {
                    if (i % 2 === 0) {
                        this.$msgCont.addClass("frow");
                    } else {
                        this.$msgCont.removeClass("frow");
                    }
                    this.$msgCont.appendTo($parent);
                });
            }

            if (commentsSort === Sort.DESC) {
                $oldestOnTopText.hide();
                $freshOnTopText.show();
            } else {
                $freshOnTopText.hide();
                $oldestOnTopText.show();
            }

            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 (!scrollable) {
                        updatePostCont(calcPostContTop($link));
                    } else {
                        updatePostCont();
                    }

                    showPostCont(true);

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

    var deleteComment = function(cid) {
        $j.getJSON("/service/stream/comment/delete", {cid: cid}, 
            function(data) {
                if (data.success) {
                    $j.each(data.cids, function() {
                        $j("div.commentMsg[id='" + this + "']").remove();
                    });
                    
                    if (!$rootCont.find("div.commentMsg").length) {
                        showCommentsBox(false);
                    }
                    
                    updateCommentsColorBands($commentsSubCont);
                    
                    $deleteConfirmCont.find("#deleteConfirmYes").unbind("click");
                    showDeleteConfirmCont(false);
                }
            }
        );
    };

    $deleteConfirmCont.find("#deleteConfirmNo").click(function() {
        showDeleteConfirmCont(false);
        
        return false;
    });
        
    var attachDelete = function($cont) {
        var query = "[id^='deleteComment_']";

        ($cont ? $cont.find(query) : $j(query)).each(function() {
            var $link = $j(this);

            $link.defineOnce("deleteAttached", function() {
                var cid = $link.attr("id").split("_", 2)[1];

                $link.click(function() {
                    $deleteConfirmCont.find("#deleteConfirmYes").click(function() {
                        deleteComment(cid);
                        
                        return false;
                    });
                    
                    if (!scrollable) {
                        updateDeleteConfirmCont(calcDeleteConfirmContTop($link));
                    } else {
                        updateDeleteConfirmCont();
                    }
                    
                    showDeleteConfirmCont(true);
                    
                    return false;
                });
            });
        });
    };
    attachDelete($rootCont);

    var attachReply = function($cont) {
        var query = "[id^='postComment_']";

        ($cont ? $cont.find(query) : $j(query)).each(function() {
            var $link = $j(this);

            $link.defineOnce("replyAttached", function() {
                if (!guest) {
                    var cid = $j(this).attr("id").split("_", 2)[1];

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

                    $link.click(function() {
                        currentCid = cid;

                        $textarea.val(msg);

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

                        showPostCont(true);

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

    var postComment = lock(function(unlock, comment) {
        posting = true;

        var time = getLatestPostTime($rootCont);

        var pid = getPid();
        if (pid === "0") {
            unlock();
            return;
        }
        
        var params = {
            pid: pid, 
            comment: comment,
            time: time,
            desc: (commentsSort == Sort.DESC)
        };

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

        var req = $j.post("/service/stream/comment/add" + getSessionId(), params, 
            function(data) {
                var $cont = $rootCont.find("[cont='comments']");

                if (isResponseJSON(req)) {
                    window.alert(commentDeleted);

                    var toDelete = [$cont.find("div[id='" + currentCid + "']")];
                    var idMap = {};
                    idMap[currentCid] = true;

                    for (var i = 0; i < toDelete.length; i++) {
                        var $msgCont = toDelete[i];
                        var parentCid = $msgCont.attr("id");

                        var $elems = $cont.find("[name='parentCid'][value='" + parentCid + "']:hidden").parent().parent();

                        $elems.each(function() {
                            var $childCont = $j(this);
                            var childCid = $childCont.attr("id");

                            if (!idMap[childCid]) {
                                idMap[childCid] = true;

                                toDelete.push($childCont);
                            }
                        });
                    }

                    for (var j = 0, len = toDelete.length; j < len; j++) {
                        toDelete[j].remove();
                    }

                    delete toDelete;
                    delete idMap;

                    updateCommentsColorBands();
                } else {
                    var $comments = $j(data);

                    if (commentsSort === Sort.DESC) {
                        $comments.prependTo($cont);
                    } else {
                        $comments.appendTo($cont);
                    }
                    
                    showCommentsBox(true);
                    
                    updateCommentsColorBands();

                    editRelationships($comments);
                    initButtonEffect($comments);
                    initPersonMouseOver($comments);
                    attachReply($comments);
                    attachDelete($comments);
                }

                unlock();
                $textarea.val("");
                showPostCont(false);

                posting = false;
            }
        );
    });

    
    if (updateComments) {
        window.setInterval(function() {
            var time = getLatestPostTime($rootCont);

            if (posting) {
                return;
            }

            var pid = getPid();
            if (pid === "0") {
                return;
            }
            
            $j.post("/service/stream/comment/new" + getSessionId(), 
                {
                    pid: pid,
                    time: time,
                    desc: (commentsSort == Sort.DESC)
                }, 
                function(data) {
                    var $cont = $rootCont.find("[cont='comments']");
                    var $comments = $j(data);

                    if (posting) {
                        return;
                    }

                    if (data.length) {
                        if (commentsSort === Sort.DESC) {
                            $comments.prependTo($cont);
                        } else {
                            $comments.appendTo($cont);
                        }
                        
                        showCommentsBox();
                        updateCommentsColorBands();
                        editRelationships($comments);
                        initButtonEffect($comments);
                        initPersonMouseOver($comments);
                        attachReply($comments);
                        attachDelete($comments);
                        
                        if ($chatCont.length) {
                            window.setMessageActive(false);
                        }
                    }
                }
            );
        }, 10000);
    }
    
    
        
    if ($chatCont.length) {
        var $commentsTab = $j("#commentsTab");
        var $commentsIndicator = $j("#commentsTab img");
        var $chatTab = $j("#chatTab");
        var $chatIndicator = $j("#chatTab img");
    
        $j("#commentsTab a").click(function() {
            $chatTab.removeClass("selblue");
            $commentsTab.addClass("selgreen");
            $commentsIndicator.hide();
            
            $chatCont.css({
                visibility: "hidden",
                height: "0px"
            });
            
            $rootCont.show();
            
            return false;
        });
        
        $j("#chatTab a").click(function() {
            $commentsTab.removeClass("selgreen");
            $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);
        } else {
            postComment(comment);
        }

        return false;
    });

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

        return false;
    });

    if (scrollable) {
        window.setTimeout(adjustCommentsSubCont, 100);
    }
    
    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 $flashConts = [];
    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() {
            $rootCont.css("marginTop", $j.scrollTop() + marginTop + "px");
        };
        $j(window).bind('scroll', update);
        
        $flashConts = $j("embed,object").parent().visible(false);
        
        attachCensoredInputHandler();
        
        
        $overContainerBack.show();
        $overContainer.show();
        $rootCont.show();
    };
    
    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() {
                //$olderInput.unbind('click');

                $rootCont.hide();
                $j(window).unbind('scroll', update);
                
                $overContainer.hide();
                $overContainerBack.hide();

                if ($flashConts.length) {
                    $flashConts.visible(true);
                }

                $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 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(value);
        }
    };
    
    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() {
            $postCont = $j("#postCont");
            $editForm = $j("#editForm");
            $postEditorArea = $j("#postEditor");
            $contentInput = $editForm.find("input[name='content']:hidden");
            language = $editForm.hiddenValue("lang");
            pid = $editForm.hiddenValue("pid");
            
            initButtons();
        },
        edit: function() {
            if (editing) {
                return;
            }
            editing = true;
            
            if (!arguments[0]) {
                if (toggle) {
                    toggle(true);
                }
            }
            
            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;
            }
            
            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) {
            streamControl.active = calling;
        };
    }
    
    $j(function() {
        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 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").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 initHome = function() {
    $j(function() {
      attachTop20Sliders();
    });
};

var initHomeLogged = function() {
    $j(function() {
      attachTop20Sliders();
      initPersonMouseOver();
      editRelationships();
    });
};

var changeChannelPermission = function(ageLevel, permissionLevel) {
    $j("div[id^='notAllowed_']")
    .hide()
    .filter("[id='notAllowed_" + ageLevel + "']").show();
    
    if (ageLevel == "4" && permissionLevel == "1") {
        $j("#atomCont").show();
    } else {
        $j("#atomCont").hide();
    }
};

var initChannel = function() {
    $j(function() {
        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 attachChannelSortHandler = function(update) {
    $j("#resultsPerPage").change(function() {
        update({
            resultsPerPage: $j(this).val()
        });
    });

    $j("#liveair").click(function() {
        update({liveAir: true});
    });

    $j("#date").click(function() {
        update({date: true});
    });

    $j("#rating").click(function() {
        update({rating: true});
    });
};

var initSearchChannels = function() {
    var update = lock(function(unlock, args) {
        ajaxActivity.start();
        var url = $j("#left2w").attr("base_url");
            
        $j.post(url + "/partial" + getSessionId(), args, function(data) {
            $j("#left2w").replaceWith(data);
            attachChannelSortHandler(update);
            ajaxActivity.end();
            unlock();
        });
    });
    
    window.changeChannelsPage = function(page) {
        update({page: page});
    };
    
    $j(function() {
        attachChannelSortHandler(update);
    });
};

var initChannels = function() {
    var update = lock(function(unlock, args) {
        ajaxActivity.start();
        args.video = $j("#left2w").attr("video");
            
        $j.post("/channels/partial" + getSessionId(), args, function(data) {
            $j("#left2w").replaceWith(data);
            channelOverInit($j("#left2w"));

            attachChannelSortHandler(update);
            ajaxActivity.end();
            unlock();
        });
    });
    
    window.changeChannelsPage = function(page) {
        update({page: page});
    };
    
    $j(function() {
        attachChannelSortHandler(update);
    });
};

var initSearchPeople = function() {
    var attachResultsHandler = function(update) {
        $j("#resultsPerPage").change(function() {
            update({
                resultsPerPage: $j(this).val()
            });
        });
    };
    
    var update = lock(function(unlock, args) {
        ajaxActivity.start();
        var url = $j("#left2w").attr("base_url");
        
        $j.post(url + "/partial" + getSessionId(), args, function(data) {
            $j("#left2w").replaceWith(data);
            attachPeopleMouseOver($j("#left2w"));
            attachResultsHandler(update);
            ajaxActivity.end();
            unlock();
        });
    });
    
    window.changePeoplePage = function(page) {
        update({page: page});
    };
    
    $j(function() {
        attachResultsHandler(update);
        initCategoriesMouseOver();
        attachPeopleMouseOver();
    });
};

var initHomeFavourites = function() {
    var attachHandler = function(update) {
        $j("#criteriaForm #resultsPerPage").change(function() {
            update({
                resultsPerPage: $j(this).val()
            });
        });
        
        $j("#criteriaForm #all").click(function() {
            update({all: true});
        });
        
        $j("#criteriaForm #video").click(function() {
            update({video: true});
        });
        
        $j("#criteriaForm #radio").click(function() {
            update({radio: true});
        });
    };
    
    var update = lock(function(unlock, args) {
        $j.post("/home/favourites/partial", args, function(data) {
            $j("#favouritesCont").replaceWith(data);
            channelOverInit($j("#favouritesCont"));
            attachHandler(update);
            unlock();
        });
    });
    
    window.changeFavouritesPage = function(page) {
        update({page: page});
    };
    
    $j(function() {
        attachHandler(update);
    });
};

var initPeoplePartial = function() {
    var attachHandlers = function(update) {
        $j("#peopleCont #resultsPerPage").change(function() {
            update({
                resultsPerPage: $j(this).val()
            });
        });
        
        $j("#peopleCont #sortBy").change(function() {
            update({
                sortBy: $j(this).val()
            });
        });
    };
    
    var update = lock(function(unlock, args) {
        var url = $j("#peopleCont").attr("base_url");
        
        $j.post(url + "/partial" + getSessionId(), args, function(data) {
            $j("#peopleCont").replaceWith(data);
            attachHandlers(update);
            attachPeopleMouseOver($j("#peopleCont"));
            unlock();
        });
    });
    
    window.changePeoplePage = function(page) {
        update({page: page});
    };
    
    $j(function() {
        attachHandlers(update);
        attachPeopleMouseOver();
    });
};



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

var initPerson = function() {
    $j(function() {
        attachTop20Sliders();
        attachSlider($j("#videoShowAll"), $j("#topVideo20").children(".left"), 1);
        attachSlider($j("#radioShowAll"), $j("#topRadio20").children(".left"), 1);
    });
};

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);
    };
    
    $j("#menuLine a").each(function() {
        var $a = $j(this);

        $a.hover(
            function() {
                var styleClass = $a.attr("class");
                
                if (!isGreen(styleClass) && !isOrange(styleClass)) {
                    $a.addClass("menuBarBtn");
                } else {
                    if (isGreen(styleClass)) {
                        $a.removeClass("menuBarBtngreennrml");
                        $a.addClass("menuBarBtngreenover");
                    } else if (isOrange(styleClass)) {
                        $a.removeClass("menuBarBtnorangenrml");
                        $a.addClass("menuBarBtnorangeover");
                    }
                }
            },
            function() {
                var styleClass = $a.attr("class");
                
                if (!isGreen(styleClass) && !isOrange(styleClass)) {
                    $a.removeClass("menuBarBtn");
                } else {
                    if (isGreen(styleClass)) {
                        $a.removeClass("menuBarBtngreenover");
                        $a.addClass("menuBarBtngreennrml");
                    } else if (isOrange(styleClass)) {
                        $a.removeClass("menuBarBtnorangeover");
                        $a.addClass("menuBarBtnorangenrml");
                    }
                }
            }
        );
    });
};
    
$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();
    });
    
    $j("#langClosed").click(function() {
        languagePopup.show();
        
        return false;
    });
    
    var ajaxTimer = null;
    
    $j(window).bind('ajaxStart', function() {
        if (ajaxTimer) {
            window.clearTimeout(ajaxTimer);
        }
        
        ajaxTimer = window.setTimeout(function() {
            $j("#activityIndicator").visible(true);
        }, 1000);
    });
    $j(window).bind('ajaxEnd', function() {
        if (ajaxTimer) {
            window.clearTimeout(ajaxTimer);
        }
        $j("#activityIndicator").visible(false);
    });
});

var ajaxActivity = {
    start: function() {
        $j(window).trigger('ajaxStart');
    },
    end: function() {
        $j(window).trigger('ajaxEnd');
    }
};

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;
    
    showInviteFriendsFormEdit(true);
};

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

var showInvitePreview = function() {
    var $contBack = $j("#overContainerBase");
    var $cont = $j("#overContainer");
    var $invitePreviewCont = $j("#invitePreview");
    
    var marginTop = Math.floor(($j(window).height() - 500) / 2);
    
    this.inviteUpdate = function() {
        $invitePreviewCont.css("marginTop", $j.scrollTop() + marginTop + "px");
    };
    $j(window).bind('scroll', this.inviteUpdate);
    
    
    $invitePreviewCont.css({
        marginTop: $j.scrollTop() + marginTop + "px",
        display: "block"
    });
    
    $cont.append($invitePreviewCont);
    
    var textToSend = $j("[name='textToSend']").val().replace(/\r|(\r?\n)/g, "<br/>");
    $j("#previewP").html(textToSend);
    
    $j("embed,object").parent().visible(false);
    
    $contBack.show();
    $cont.show();
};

var hideInvitePreview = function() {
    var $contBack = $j("#overContainerBase");
    var $cont = $j("#overContainer");
    
    $j(window).unbind('scroll', this.inviteUpdate);
    
    $j("#invitePreview").css("display", 'none');
    
    $j("embed,object").parent().visible(true);
    
    $contBack.hide();
    $cont.hide();
};

var showBroadcastLeaveConfirm = function(isVisible) {
    var $contBack = $j("#overContainerBase");
    var $cont = $j("#overContainer");
    var $confirmDiv = $j("#broadcastLeaveConfirmDiv");

    if(isVisible == true) {
        var marginTop = Math.floor(($j(window).height() - 116) / 2);
    
        this.broadcastConfirmUpdate = function() {
            $confirmDiv.css("marginTop", $j.scrollTop() + marginTop + "px");
        };
        $j(window).bind('scroll', this.broadcastConfirmUpdate);
        
        $confirmDiv.css({
            marginTop: $j.scrollTop() + marginTop + "px",
            display: "block"
        });
        
        $j("embed,object").parent().visible(false);
        
        $contBack.show();
        $cont.show();
        if ($j.browser.msie) {
            $confirmDiv.find(".centered").css("display", "inline-block");
        }
    } else {    
        $confirmDiv.css("display", 'none');
        
        $j(window).unbind('scroll', this.broadcastConfirmUpdate);

        $j("embed,object").parent().visible(true);

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

var openComplainBlogPostWnd = function() {
    var $contBack = $j("#overContainerBase");
    var $cont = $j("#overContainer");
    
    var $complainDiv = $j("<div id='complainDiv' class='centered' style='z-index:105;visibility:visible;display:none;'></div>");
    $complainDiv.appendTo($cont);
    
    var complainSWF = new SWFObject("/res/swf/offline_page/Complain.swf", "complainMovie", "580", "290", "9.0.60", "#EEEEEE");
    complainSWF.addParam("align", "middle");
    complainSWF.addParam("loop", "false");
    complainSWF.addParam("quality", "high");
    complainSWF.addParam("allowFullScreen", "true");
    complainSWF.addParam("allowScriptAccess", "sameDomain");
    complainSWF.addVariable("locale", $j("#locale:hidden").val());
    complainSWF.addVariable("streamId", $j("#complainForm [name='pid']:hidden").val());
    complainSWF.write("complainDiv");
    
    var marginTop = Math.floor(($j(window).height() - 290) / 2);

    this.complainUpdate = function() {
        $complainDiv.css("marginTop", $j.scrollTop() + marginTop + "px");
    };
    $j(window).bind('scroll', this.complainUpdate);
    
    $complainDiv.css("marginTop", $j.scrollTop() + marginTop + "px");
    
    $j("embed,object").parent().visible(false);
    
    $contBack.show();
    $cont.show();
    $complainDiv.css({
        display: "block",
        visibility: "visible"
    });
};

var closeComplainBlogPostWnd = function() {
    var $contBack = $j("#overContainerBase");
    var $cont = $j("#overContainer");
    
    $j(window).unbind('scroll', this.complainUpdate);
    
    window.setTimeout(function() {
        $j("#complainDiv").remove();
        $j("embed,object").parent().visible(true);

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

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) {    
    $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 attachHandlers = function(update) {
        $j("#onlineCont #resultsPerPage").change(function() {
            update({
                resultsPerPage: $j(this).val()
            });
        });
        
    };
    
    var update = lock(function(unlock, args) {
        ajaxActivity.start();
        var url = $j("#onlineCont").attr("base_url");
        
        $j.post(url + "/partial" + getSessionId(), args, function(data) {
            $j("#onlineCont").replaceWith(data);
            attachHandlers(update);
            attachPeopleMouseOver($j("#onlineCont"));
            ajaxActivity.end();
            unlock();
        });
    });
    
    window.changePeoplePage = function(page) {
        update({page: page});
    };
    
    $j(function() {
        attachHandlers(update);
        attachPeopleMouseOver();
    });
};

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

    var show = function(data) {
        $j(function() {
            var $contBack = $j("#overContainerBase");
            var $cont = $j("#overContainer");
            
            var $detectCont = $j("#flashDetectionCont");
            
            marginTop = Math.floor(($j(window).height() - (data ? 300 : 152)) / 2);
            $detectCont.css("marginTop", $j.scrollTop() + marginTop + "px");

            this.update = function() {
                $detectCont.css("marginTop", $j.scrollTop() + marginTop + "px");
            };
            
            $j(window).bind('scroll', this.update);
            
            this.hiddenConts = $j("embed,object").parent().visible(false);
            
            if (data) {
                $j("#expressInstallCont").replaceWith(data);
            } else {
                $j("#expressInstallCont").hide();
                $j("#noFlashCont").show();
            }
            
            $contBack.show();
            $cont.show();
            $detectCont.show();
            
            if (data) {
                $detectCont.find(".content").visible(true);
            }
        });
    }
    
    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", "550",
          "height", "300",
          "align", "middle",
          "id", "expressInstall",
          "quality", "high",
          "bgcolor", "#3A6EA5",
          "name", "expressInstall",
          "allowScriptAccess","always",
          "type", "application/x-shockwave-flash",
          "pluginspage", "http://www.adobe.com/go/getflashplayer"
        );
        
        show(data);
    } else if (!hasRequestedVersion) {
        show();
    }
};

var contactUsOk = function() {
    $j("#secScreen").css("display", "none");
    $j("#firstScreen").css("display", "block");
};

var validateContactUs = function(form) {    
    var name = form.contactUserName.value;
    var email = form.contactUserEmail.value;
    var msg = form.contactMassage.value;
    var cptchCode = form.cptchCode.value;
    
    $j("#errName").css("display", "none");
    $j("#errEmail").css("display", "none");
    $j("#errMsg").css("display", "none");
    $j("#errCptch").css("display", "none");
    
    if(name.length < 2) {
        $j("#errName").css("display", "inline");
        return false;
    }
    
    if(email.length < 3) {
        $j("#errEmail").css("display", "inline");
        return false;
    }
    
    if(msg.length < 5) {
        $j("#errMsg").css("display", "inline");
        return false;
    }
    
    if(cptchCode.length < 1) {
        $j("#errCptch").css("display", "inline");
        return false;
    }
    
    return true;
};

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");
    }
};
