// JavaScript Document 
({
    comments: (function(){
        // load dependent libs
        bam.loadSync(bam.homePath + "bam.cookies.js");
        bam.loadSync(bam.homePath + "bam.url.js");
        $.ajax({
          dataType: "script",
          url: "/shared/scripts/external/jquery.bindable.min.js",
          async: false,
          cache: true
        });

        var debug = {};

        var _self = {};
        
        var _commenter_fprt = !!bam.cookies.get('fprt');                // is user logged in?
        var _commenterNickname = null;
        var _commenterId = null;
        var _req = bam.url.Location(window.location);
        var _contentId;                                                // unique id for the comment set aka article id
        var _currentPage, _lastPage;                                    // keep track of pagination
        var _numberOfComments = 0;
        var _lastRequestTime = null;
        var _commentId = null;

        var _commentTpl;                                            // html template for comment creation
        var _forwardUrl = null;
        var _loginLinkParams;

        //   uncomment this if using external comment scripts
        // var _CommentServerAvailable = typeof RequestBatch != "undefined";
        var _CommentServerAvailable = true;        // swap this for above statement

        // default settings
        var _settings = {
            domain              : "mlb.com",
            serverUrl           : "http://comments.mlb.com/ver1.0/Direct/Jsonp", // "http://comments.mlb.com/ver1.0/Direct/Process",
            loginUrl            : "https://secure.mlb.com/enterworkflow.do?flowId=registration.dynaindex&forwardUrl=",
            profileUrl          : "http://www.mlb.com/mlb/community/profile/index.jsp?ipid=",
            updateProfileUrl    : "https://secure.mlb.com/account/profile.jsp",
            contentId           : _req.getParam("content_id"),
            prefix              : "",
            commentsPerPage     : 10,
            maxCommentPageLinks : 10,
            
            cacheComments       : false,
            cachedCommentsUrl   : "/shared/components/comments/cached_comments.jsp",
            
            // layout-controlling variables... these vars are not used to actually DO anything-- they let the library know whether an element is present on the page (currently not being used)
            showCommentCount    : false,
            showPagination      : true,
            allowPost           : true,

            commentContainer    : "comment_container",
            commentList         : "comments_list",
            
            
            pageDataObj         : window      // object which contains 'page_id', 'section', and 'club' attributes              
        };
        
        var _metaData = {
          title       : document.title,
          url         : document.location.href,
          section     : _settings.pageDataObj.section || "",
          categories  : {
            page_id : _settings.pageDataObj.page_id || _settings.pageDataObj.pageid || "",
            club    : _settings.pageDataObj.club || ""                    // MLB only
          },
          tags        : []
        };

//        var _Event = $({});         // event object for triggering
        
        var _errorHandlers = {
            COMMENTS_DOWN: function() {
                $("#comment_body").html("<div style='text-align: center; font-weight: bold; padding: 10px; color: red'>Comments are currently undergoing maintanance.  Please try back later.</div>");
                $("#comment_list").empty();
            },
            NO_NICK: function() {
                $("#comment_error").html("* Please enter a nickname <a href='" + _settings.updateProfileUrl + "'>here</a> before commenting");
            },
            NOT_LOGGED_IN: function() {
                $("#comment_error").html("* Please login before attempting to post a comment");
            },
            BAD_WORD: function(bad_word) {
                $("#comment_error").html("* Please remove the word \""+ bad_word +"\" from your comment.");
            },
            HAS_HTML: function() {
                $("#comment_error").html("* Please remove any code from your comment.");
            },
            BLANK: function() {
                $("#comment_error").html("* Please provide a comment.");
            },
            ALL_CAPS: function() {
                $("#comment_error").html("* Please do not post in all caps.");
            },
            DEFAULT: function() {
                $("#comment_error").html("* Comment Error: Please check your message and try again.");
            }
        };

        _handleError = function(error_str) {
            var args = Array.prototype.slice.call(arguments, 1);
            if (_errorHandlers[error_str]) {
							_errorHandlers[error_str].apply(this, args);
						}
						else {
							_errorHandlers.DEFAULT();
						}
        };

        // if not using external scripts, simulate ReuqestBatch
        var ArticleKey = function(key) {
            return { 
              ArticleKey: { 
                Key : key 
              } 
            };
        };

        var CommentKey = function(key) {
            return { 
              CommentKey: { 
                Key : key 
              } 
            };
        };

        var CommentPage = function(articleKey, numberPerPage, onPage, sort) {
            return { 
              CommentPage : { 
                ArticleKey    : articleKey, 
                NumberPerPage : numberPerPage, 
                OnPage        : onPage, 
                Sort          : sort 
              } 
            };
        };

        var CommentAction = function(commentOnKey, onPageUrl, onPageTitle, commentBody) {
            return { 
              CommentAction : { 
                CommentOnKey  : commentOnKey, 
                OnPageUrl     : onPageUrl, 
                OnPageTitle   : onPageTitle, 
                CommentBody   : commentBody 
              } 
            };
        };

        var ReportAbuseAction = function(reportThisKey, abuseReason, abuseDescription) {
            return { 
              ReportAbuseAction : { 
                ReportThisKey     : reportThisKey, 
                AbuseReason       : abuseReason, 
                AbuseDescription  : abuseDescription
              } 
            };
        };
        
        var Section = function(section) {
            return { 
              Section : { 
                Name : section 
              } 
            }; 
        };
        
        var Category = function(category) {
            return { 
              Category: { 
                Name : category 
              } 
            };
        };
        
        var UserTier = function(tier) {
            return {
              UserTier : {
                Name : tier
              }
            };
        };
        
        var Activity = function(activity) {
            return {
              Activity : {
                Name : activity
              }
            };
        };
                   
        var UpdateArticleAction = function(articleKey, pageUrl, pageTitle, section, categories) {
            return { 
              UpdateArticleAction : { 
                UpdateArticle : articleKey,
                OnPageUrl     : pageUrl,
                OnPageTitle   : pageTitle,
                Section       : section,
                Categories    : categories
              }
            };
        };
        
        var DiscoverArticlesAction = function(sections, categories, contributors, activity, age, numItemsToGet) {
            return {
              DiscoverArticlesAction : {
                Activity                    : activity,
                Age                         : age,
                LimitToContributors         : contributors,
                MaximumNumberOfDiscoveries  : numItemsToGet,
                SearchCategories            : categories,
                SearchSections              : sections
              }
            };
        };
        
        var RequestBatch = function(){
            this.Requests = [];
            this.UniqueId = RequestBatch.UniqueId++;
        };

        RequestBatch.UniqueId = 0;
        RequestBatch.prototype = {

            AddToRequest: function(obj) {
                this.Requests.push(obj);
            },
            BeginRequest: function(cb, cache) {
                cache = cache || false;
                var url, data;
                var r = JSON.stringify(this);
                var params = {
                    type: "GET",
                    success: function(result) {
                        if(result.error) {
                            _handleError("COMMENTS_DOWN");
                        }
                        else if(typeof cb == "function") {
                            cb(result.ResponseBatch);
                        }
                    }
                };
                if(cache) {
                    params.dataType = "json";
                    params.url = _settings.cachedCommentsUrl;
                    params.data = { url : _settings.serverUrl, r : r };
                }
                else {
                    params.dataType = "jsonp";
                    params.jsonp = "cb";
                    params.url = _settings.serverUrl;
                    params.data = { r : r };
                }

                $.ajax(params);
            }
        };

        // uses the Profile Service to extract user data if user is logged in and sets the commenter nickname
        _initCommenter = function(cb) {
            var commenter_nickname = null;
            if (_commenter_fprt) {
                ProfileService.find(
                    function(profile){
                        document.domain=_settings.domain;
                        var commenter_id, commenter_nickname, HDvalue;
                        if (profile.nickname) {
                            commenter_nickname = profile.nickname.value[0];
                        } else {
                            // add a notice here to add a nickname
                            _handleError("NO_NICK");
                        }
                        commenter_id       = bam.cookies.get('ipid');
                        HDvalue            = commenter_id + '|' + commenter_nickname;
                        if (commenter_id) {
                            bam.cookies.set({
                                name   : 'HD',
                                value  : HDvalue,
                                path   : '/',
                                domain : _settings.domain
                            });
                        }
                        _commenterNickname = commenter_nickname;
                        _commenterId = commenter_id;
                        if(typeof cb === "function") { cb(); }
                    },
                    function(){
                        document.domain=_settings.domain;
                        bam.cookies.remove('HD');
                    }
                );
            } else {
                document.domain=_settings.domain;
                bam.cookies.remove('HD');
            }
            return null;
        };

        _filterComments = function(comments){
            var filteredArr = [];
//            debugger;
            try{
                for(var i=0;i<comments.length;i++){
                    var aComment = comments[i];
                    var isBlocked = aComment.Author.IsBlocked;
                    var blockingState = aComment.ContentBlockingState;
                    var abuseReportCount = parseInt(aComment.AbuseReportCount, 10);

                    // always show the commenter's comments if the commenter is logged in.  
                    //   otherwise, if the comment is blocked, user is blocked, the user's comments have been reported or the 
                    //   comment has no content, don't display
                    if(    _commenterId == aComment.Author.UserKey.Key || aComment && isBlocked=="False" && blockingState=="Unblocked" && abuseReportCount<4 ) {
                        aComment.CommentBody = bam.string.textWrap(aComment.CommentBody);
                        filteredArr[filteredArr.length]=comments[i];
                    }
                }
            }
            catch(e){throw e.message;}
            return filteredArr;
        };

        _getCommentsHandler = function(responseBatch){
            debug.responseBatch = responseBatch;
            var MessageTime = responseBatch.Messages[0].MessageTime.match(/0?(\d?\d:\d{2}).*?(AM|PM)/);
            _lastRequestTime = MessageTime[1] + " " + MessageTime[2];
            var response = responseBatch.Responses[0];
            _numberOfComments = parseInt(response.CommentPage.NumberOfComments, 10);
            
            var numberPerPage = parseInt(response.CommentPage.NumberPerPage, 10);
            var onPage = parseInt(response.CommentPage.OnPage, 10);
            var numberOfPages = Math.floor(_numberOfComments/numberPerPage) + (_numberOfComments % numberPerPage ? 1 : 0);
            var atFirstPage = (onPage==1) ? true : false;
            var atLastPage = (onPage==numberOfPages || _numberOfComments===0) ? true : false;
            var comments = _filterComments(responseBatch.Responses[0].CommentPage.Comments);
            
            _self.trigger("commentsLoaded", [comments]);

            var paginationOnClick = "onclick='return bam.comments.loadPage(this);'";
            var paginationPrefix = (atFirstPage) ? "" : "<a href='#' " + paginationOnClick + ">First</a> <a href='#' " + paginationOnClick + ">&lt;&lt;</a>";
            var paginationSuffix = (atLastPage) ? "" : "<a href='#' " + paginationOnClick + ">&gt;&gt;</a> <a href='#' " + paginationOnClick + ">Last</a>";
            var paginationHTML = paginationPrefix;
            _currentPage = onPage;
            _lastPage = numberOfPages;

            var commentsHTML = "";
            var reported = [];

            var getUserLink = function(author_key, username) {
                if(_settings.profileUrl) {
                    return '<a target="_parent" href="' + _settings.profileUrl + author_key + '" id=""><span class="display_name">' + username + '</span></a>';
                }
                else {
                    return '<span class="display_name">' + username + '</span>';
                }
            };

            for(var i=0;i<comments.length;i++){
                var row_class= "comment_list_row" + (i % 2);
                commentsHTML += _commentTpl.replace(/\{ROW_CLASS\}/g, row_class)
                                .replace(/\{USER_NICKNAME\}/g, getUserLink(comments[i].Author.UserKey.Key, comments[i].Author.DisplayName))
                                .replace(/\{COMMENT_BODY\}/g, comments[i].CommentBody)
                                .replace(/\{COMMENT_POSTED_TIME\}/g, comments[i].PostedAtTime)
                                .replace(/\{COMMENT_KEY\}/g, comments[i].CommentKey.Key);
//                              .replace(/%7BMLBAM_USER_PROFILE_URL%7D/g, _settings.profileUrl + comments[i].Author.UserKey.Key)    // jQuery encodes the href
                
                if(comments[i].CurrentUserHasReportedAbuse == "True") {
                    reported.push(comments[i].CommentKey.Key);
                }
            }
            if(numberOfPages<=_settings.maxCommentPageLinks){
                for(var i=1;i<=numberOfPages; i++){
                    paginationHTML += (onPage == i) ?
                        "<b>" + i + "</b>" :
                        "<a href='#' " + paginationOnClick + ">" + i + "</a>";
                }
            }
            else{
                var paginationPageStart = (onPage>1)?onPage-1:1;
                if(onPage>numberOfPages-(_settings.maxCommentPageLinks-1)){
                    paginationPageStart=numberOfPages-(_settings.maxCommentPageLinks-1);
                }
                for(
                    var i=paginationPageStart,count=1;
                    i<=numberOfPages && count<=_settings.maxCommentPageLinks; 
                    i++,count++
                   ){
                    paginationHTML += (onPage == i) ?
                        "<b>" + i + "</b>" :
                        "<a href='#' " + paginationOnClick + ">" + i + "</a>";
                }
            }
            paginationHTML += paginationSuffix;

//            if(commentsHTML.length !== 0) {
                $("#" + _settings.commentList).html(commentsHTML);
//            }            
            i = reported.length;
            do {
                _reportAbuseHandler(reported[i]);
            } while(i--);


            $(".comment_cell_abuse_link").click(function(e) {
                _self.showAbuseModule(e);
                return false;
            });


            $("#comment_paginator").html(paginationHTML);
            $("#comment_count").html(_numberOfComments + " Comments");
            if(_settings.cacheComments) {
                $("#commentsTotalCount, .commentsTotalCount").html("(" + _numberOfComments + ")");
								$("#article_ccomments_link .post_comment").show();
                if(_numberOfComments) {
                    $("#article_ccomments_link .write_comment").html(_numberOfComments + " Comments at " + _lastRequestTime + " - View All &raquo;");
                }
								else {
                    $("#article_ccomments_link .write_comment").html("Write a Comment!");
								}
            }
        };

        _postComment = function(commentBody) {
            if (!_contentId) { // if _contentId has not been set yet, this function is being accessed illegally
							return;
						}
            // get form elements and page info 
            var pageUrl = _metaData.url;  
            var pageTitle = _metaData.title; 
            
            // create and send request  
            var requestBatch = new RequestBatch();
            var articleKey = new ArticleKey(_contentId);
            var commentAction = new CommentAction(articleKey, pageUrl, pageTitle, commentBody);  
            requestBatch.AddToRequest(commentAction);
            
            /**
             * categories is a hash of values that get concatenated together into a single key:value string
             */
            var categories = [], cat, section;
            for(var i in _metaData.categories) {
              if (_metaData.categories.hasOwnProperty(i)) {
                cat = _metaData.categories[i];
                if (cat.length) {
                  categories.push(new Category(i + ":" + cat));
                }                                           
              }                
            }
            
            /**
             * tags is an array of values to tag the content with
             */
            for(var i = 0, n = _metaData.tags.length; i < n; i++) {
              categories.push(new Category(_metaData.tags[i]));
            }
            
            section = new Section(_metaData.section);
            
            var updateArticleAction = new UpdateArticleAction(articleKey, pageUrl, pageTitle, section, categories);
            requestBatch.AddToRequest(updateArticleAction);

            // requestBatch.BeginRequest(_settings.serverUrl, _postCommentHandler);
            requestBatch.BeginRequest(_postCommentHandler);                // use above line if using external comment scripts
        };

        _postCommentHandler = function(responseBatch) {
            var message = responseBatch.Messages[0];
            if (message.Message == 'ok') { 
                bam.tracking.track({
                    async:{
                        isDynamic    : true,
                        compName     : 'Comment Widget',
                        compActivity : "Submit Comment Click",
                        actionGen    : true,
                        Open         : _contentId
                    }
                });
                $("#comment_msg_body").val("");
                $("#comment_error").html("");
                _self.loadPage(false);
            } 
            else{
                var errMsg = "(" + message.MessageTime + ")<br/>" +    message.Message;  
                _handleError("DEFAULT");
                if(typeof console!="undefined"){
                    console.log("Pluck Error Message:\n"+errMsg);
                }
            }
        };

        _reportAbuseHandler = function(comment_id) {
            if(typeof comment_id !== "string") {
                if (_commentId) {
                    comment_id = _commentId;
                } else {
                    return;
                }
            }
            comment_id = comment_id.replace(":", "\\:");

            $("#rpt_" + comment_id).html("<span class='comment_reported'>Reported</span>");
        };

        _self = {
            init: function(passed_settings) {
                $.extend(_settings, passed_settings);        // override default settings with passed values

                /* // uncomment if using external comment scripts
                if(!_CommentServerAvailable) {
                    _handleError("COMMENTS_DOWN");
                    return;
                }*/

                if (!!_settings.errorHandlers) {
									$.extend(_errorHandlers, _settings.errorHandlers);
								}

                // if a contentId has been supplied, use it to init the _contentId
                if (_settings.contentId !== "" && _settings.contentId !== 0) {
									_contentId = _settings.contentId;
								}
                
                // grab the comment template from the DOM
                var $tpl = $(".\\{ROW_CLASS\\}").show();
                _commentTpl = $tpl.parent().html();
                $tpl.remove();

                if(!_settings.cacheComments) {
                    _initCommenter(function() {                            // manage cookies and set _commenterNickname
                        if (_commenter_fprt){
                            $("#comment_login").hide();
                            $("#comment_logged_in").show();
                            if(_commenterNickname) {
                                $("#comment_msg_body").removeAttr("disabled")
                                    .val(" ").val("");                      // fix for chrome focus bug
                                $("#comment_submit").removeAttr("disabled");
                            }
                        }
                        else{
                            $("#comment_msg_body").attr("disabled", "disabled");
                            $("#comment_submit").attr("disabled", "disabled");
                            $("#comment_logged_in").hide();
                            $("#comment_login").show();
                        }
                    });  
                }
                
                if(_contentId) {
                    if(!_settings.cacheComments) {
                        _self.getComments(_contentId);
                    } 
                    else {
                        _self.getCachedComments(_contentId);
                    }
                }

                delete _self.init;
            },
//            bind: function(evt, func) {
//                _Event.bind.apply(this, arguments);
//            },
            getComments: function(passedId, pageNum, cache) {
                cache = cache || false;
                if (passedId) {           // if an id has been passed, set it to _contentId
									_contentId = _settings.prefix + passedId;
								}
								else if (!_contentId) {      // if no id has been passed AND _contentId has no value, do nothing
										return;
  							}

                pageNum = pageNum || 0;

                var requestBatch = new RequestBatch();
                requestBatch.AddToRequest(new CommentPage(new ArticleKey(_contentId), _settings.commentsPerPage, pageNum, "TimeStampDescending"));
                // requestBatch.BeginRequest(_settings.serverUrl, _getCommentsHandler);
                requestBatch.BeginRequest(_getCommentsHandler, cache);                // use previous line if using external comment scripts
            },
            getCachedComments: function(passedId, pageNum) {
                pageNum = pageNum || 0;
                _self.getComments(passedId, pageNum, true);
            },
            getCommentCount: function() {
                return _numberOfComments;
            },
            getLastRequestTime: function() {
                return _lastRequestTime;
            },
            reportAbuse: function($reason, $descript) {
                var requestBatch = new RequestBatch();
                requestBatch.AddToRequest(new ReportAbuseAction(new CommentKey(_commentId), $reason, $descript));
                // requestBatch.BeginRequest(_settings.serverUrl, _getCommentsHandler);
                requestBatch.BeginRequest(_reportAbuseHandler);
            },
            loadPage: function(element) {
                var requestBatch = new RequestBatch();
                var pageNum = _currentPage;
                if(element){
                    switch($(element).text()){
                        case ">>":
                            bam.tracking.track({
                                async:{
                                    isDynamic    : true,
                                    compName     : 'Comment Widget',
                                    compActivity : "Next Click",
                                    actionGen    : true
                                }
                            });
                            pageNum = _currentPage + 1;
                            break;
                        case "<<":
                            bam.tracking.track({
                                async:{
                                    isDynamic    : true,
                                    compName     : 'Comment Widget',
                                    compActivity : "Previous Click",
                                    actionGen    : true
                                }
                            });
                            pageNum = _currentPage - 1;
                            break;
                        case "First":
                            bam.tracking.track({
                                async:{
                                    isDynamic    : true,
                                    compName     : 'Comment Widget',
                                    compActivity : "First Click",
                                    actionGen    : true
                                }
                            });
                            pageNum = 0;
                            break;
                        case "Last":
                            bam.tracking.track({
                                async:{
                                    isDynamic    : true,
                                    compName     : 'Comment Widget',
                                    compActivity : "Last Click",
                                    actionGen    : true
                                }
                            });
                            pageNum = _lastPage;
                            break;
                        default:
                            var x = parseInt($(element).text(), 10);
                            if(!isNaN(x)){pageNum = x;}
                            bam.tracking.track({
                                async:{
                                    isDynamic    : true,
                                    compName     : 'Comment Widget',
                                    compActivity : "Page #"+pageNum+" Click",
                                    actionGen    : true
                                }
                            });
                            break;
                    }
                }
                _self.getComments(null, pageNum);
                return false;
            },
            formSubmit: function(formObj){
                if(!_commenter_fprt) {                    // no real way to get here without altering the DOM
                    _handleError("NOT_LOGGED_IN");
                    return false;
                }
                else if(!_commenterNickname) {            // no real way to get here without altering the DOM
                    _handleError("NO_NICK");
                    return false;
                }

                var textareastring = $("#comment_msg_body").val();
                var filteredwords  = ['motherfucker','niggar','bitch','fucker','fuc','pendejo','puta','blackie','buttfucker','chingar','chinga','chingu','cock','cocksucker','coger','cooze','cunt','darkie','darky','fag','fagget','faggit','faggot','fagit','fuck','fucked','fucking','fuckin','fuk','homo','homos','honkey','honky','joder','kike','lesbo','lessy','lezbo','lezzy','merde','mierda','niggard','nigger','nigga','phuck','punta','shit','spic','wetback','wop'];
                var invalidcomment = false;
                
                function filterWords(x){        
                    for (var f=0; f<filteredwords.length; f++) {
                        var re = new RegExp('\\b'+filteredwords[f]+'\\b', 'gi');
                        if (re.test(x)===true) {
                            _handleError("BAD_WORD", filteredwords[f]);
                            invalidcomment = true;
                        }
                    }
                    return x;
                }    
                textareastring = filterWords(textareastring);
                
                if (invalidcomment) {
                    return false;
                }
                    
                //textareastring = textareastring.replace(/(<([^>]+)>)/gi, "");
                var commentcode = new RegExp('(<([^>]+)>)','gi');


                if (commentcode.test(textareastring)===true) {
                    _handleError("HAS_HTML");
                    return false;
                }
                
                if ($.trim(textareastring) === '') {
                    _handleError("BLANK");
                    return false;
                }

                var upper_count = 0;
                var i = textareastring.length;
                do {
                    var chr = textareastring[i];
                    if (chr >= 'A' && chr <= 'Z') {
											upper_count++;
										}
                } while(i--);
                if(upper_count > (textareastring.length * 0.5)) {
                    _handleError("ALL_CAPS");
                    return false;
                }

                _postComment(textareastring);
                return false;
            },
            overrideForwardUrl: function(url) {
                _forwardUrl = url || null;
            },
            overrideLoginLinkParams: function(params) {
                _loginLinkParams = params;
            },
            setMetaData: function(metaData) {
              $.extend(_metaData, metaData);
            },
            loginLinkHandler: function(logOrReg){
                bam.tracking.track({
                    async:{
                        isDynamic    : false,
                        compName     : 'Comment Widget',
                        compActivity : logOrReg + " Click",
                        actionGen    : true
                    }
                });

                var params, href;
                if(_forwardUrl) {
                    href = _forwardUrl;
                }
                else {
                    href = window.location.protocol + "//" + window.location.hostname + window.location.pathname;
                    params = _req.getParams();
                    $.extend(params, _loginLinkParams);
                }
                
                window.location = _settings.loginUrl + encodeURIComponent(href + bam.url.buildSearch(params));
                return false;
            },

            /* SiteLife Functionality port */
            showAbuseModule: function(evt) {
                var $rpt_link = $(evt.target);
                _commentId = evt.target.id.replace('_RptAbuse', '');

                var pos = $rpt_link.position();
                var l = pos.left;
                var t = pos.top;
                var r = l + $rpt_link.width() + parseInt($rpt_link.css('padding-right'), 10) + parseInt($rpt_link.css('padding-left'), 10);
                var b = t + $rpt_link.height();
                
                var $menu = $('#comment_report_abuse_menu');
                var w = $menu.width();
                $menu.css({
                    left: (r - w) + 'px',
                    top:  b + 'px',
                    display: 'block'
                });
                //abuse_style = document.getElementById('ReportAbuse_Menu').style;
                //abuse_style.left = r + "px";
                //abuse_style.top = b + "px";
                //abuse_style.display = "block";
            },
            limitLength: function(control, limitToLength) {
                var str = control.value;
                if (!str || str.length === 0) {
									return false;
								}
                var matches = str.match(/\r|\n/g);
                if (!matches) {
									return false;
								}
                var offSet = matches.length;
                if (str.length > (limitToLength + offSet)) {
                    control.value = str.substring(0, limitToLength + offSet);
                }
                return false;
            },
            
            // meta data requests
            /**
             * Grab a list of the most popular articles with an age <= 15 and count <= 50
             * @param {string} section    (optional) the name of the section you are looking for (ie. news)
             * @param {int} age           (optional) a number such that 0 < age <= 15
             * @param {int} count         (optional) a number such that 0 < count <= 50
             * @param (function)          callback: used to handle the html returned by the meshed template
             */
            getPopularContent: function(/* section, [age], [count], cb */){
							var __getSync = function(url, cb, type){ // local shortcut.  avoids setting global props via ajaxSetup
								cb = cb || function(){};
								$.ajax({
									type: "GET",
									async: false,
									cache: true,
									url: url,
									dataType: type || "script",
									success: cb
								});
							};
							var html;
							
							cb = Array.prototype.pop.apply(arguments);
							
							var sections = [new Section(section)];
							var categories = [];
							var contributors = [];
							var activity = new Activity("Commented");
							
							var age = arguments[1],
							  count = arguments[2];
							
							age = (age > 15 || age < 1 || !age) ? 7 : age;
							count = (count > 50 || count < 1 || !count) ? 10 : count;

							// create and send request  
							var requestBatch = new RequestBatch();
							var discoveryAction = new DiscoverArticlesAction(sections, categories, contributors, activity, age, count);
							
							requestBatch.AddToRequest(discoveryAction);
							/**
							 * Loads the template via AJAX and returns the output of the template
							 */
							requestBatch.BeginRequest(function(response){
								var template;
								__getSync("/shared/scripts/template/template-0.7b.js");
								__getSync("/shared/components/comments/templates/popular_topic_list.tpl", function(tpl){
									template = new Template(tpl);
								
									html = template.render(bam.object.getDeepValue(response, "Responses.0.DiscoverArticlesAction.DiscoveredArticles"));
									cb(html);
								}, "text");
							}, true);
						}  
            
        };

        $.bindable(_self);

        return _self;
   })()
})