var g_tioldest = null;
var g_tinewest = null;
var c_WAIT = 60000;
var playback = 1;

$(document).ready(function() {
//    fetchMoreTweets(2044639869);
setTimeout("Reinitialise();", 100);  //* was called from fetchMoreTweets()

    //* Check in 15 seconds
//    setTimeout(checkNewTweets, c_WAIT);    
    setTimeout("InitializeDisplay();", 1000);
    $(".btn_twitter").click(function() {
        $(".btn_keyspeakers").addClass("btn_nobknd");
        $(".btn_twitter").removeClass("btn_nobknd");
        $(".keyspeakers").hide();
	$("#divCommentary").show();
        $(".twitterDivider").show();
        $(".twitterBase").show();
        $(".jScrollPaneContainer:first").show();
	Reinitialise();
    });
    $(".btn_keyspeakers").click(function() {
        $(".btn_twitter").addClass("btn_nobknd");
        $(".btn_keyspeakers").removeClass("btn_nobknd");
        $(".jScrollPaneContainer:first").hide();
	$("#divCommentary").hide();
        $(".twitterDivider").hide();
        $(".twitterBase").hide();
        $(".keyspeakers").show();
    });
    $(".speakerRow").hover(function() {
        $(this).css({ 'background': '#ADCBEC' });
        //$(this).find(".name").css("color", "#7babdf");
    }, function() {
        $(this).css({ 'background': 'none' });
        //$(this).find(".name").css("color", "#00338e");
    });

});

function InitializeDisplay() {
    $(".twitter").show();
    $(".twitterDivider").show();
    $(".twitterBase").show();
}

//* ----- UTIL -----
function newListItemTop(tweet) {
    return "<div class=\"twittercomment\" style=\"display:none; margin-bottom: 5px; border-bottom:1px solid  #6290D3; padding-bottom: 5px;\" id=\"dT" + tweet.Id + "\"><p>" + tweet.Text + "</p><p class=\"datestamp\">" + tweet.CreateDateFmt + " from " + tweet.Source + "</p></div>";
}

function newListItemBottom(tweet) {
    return "<div class=\"twittercomment\" style=\"margin-bottom: 5px; border-bottom:1px solid  #6290D3; padding-bottom: 5px;\" id=\"dT" + tweet.Id + "\"><p>" + tweet.Text + "</p><p class=\"datestamp\">" + tweet.CreateDateFmt + " from " + tweet.Source + "</p></div>";
}

//* ----- ADD OLDER -----
//* Intitial load, data most recent first
function addBottom(tweets) {
    //alert("success: " + tweets);
    for (var post in tweets) {
        $("#dTweets").append(newListItemBottom(tweets[post]));
        if (g_tinewest == null) g_tinewest = tweets[post].Id; //* init newest
        g_tioldest = tweets[post].Id;  //* save oldest
    }
    if ((tweets.length > 0)) {
        $('#dLoadMore').remove();
        $('.twitter').append('<div id="dLoadMore" style="padding-top:5px; text-align:center;"><a href="javascript:loadMore();">Load more...</a></div>');
    }
    else {
        $('#dLoadMore').remove();
    }
    setTimeout("Reinitialise();", 100);
}

function fetchMoreTweets(b) {
    $.ajax({
        type: "POST",
        url: "/Svc/Twitter.asmx/GetMeetingTweets",
        data: "{'t':10,'b':" + b + ",'a':0}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            addBottom(msg.d.Tweets);
        },
        error: function(xhr, msg) {
            //alert("error: " + msg);
        }
    });
}

function loadMore() {
    fetchMoreTweets(g_tioldest);
}


//* ----- ADD NEWER -----
function addTop(tweets, rids) {
    if (tweets.length > 0)
    {
        //* items come in desc order, add them to the top in reverse
        for (var i=tweets.length-1; i>=0; i--)
        {
            $("#dTweets").prepend(newListItemTop(tweets[i]));
            AddTweet();
            g_tinewest = tweets[i].Id; //* save newest
        }
    }

    if (rids.length > 0)
    {
        for (var j=0; j<rids.length; j++)
        {
            $("#dT" + rids[j]).remove();
        }
	Reinitialise();
    }
}

function fetchNewTweets(b, a) {
    $.ajax({
        type: "POST",
        url: "/Svc/Twitter.asmx/GetMeetingTweets",
        data: "{'t':0,'b':" + b + ",'a':" + a + "}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            addTop(msg.d.Tweets, msg.d.RemoveIds);
        },
        error: function(xhr, msg) {
            //alert("error: " + msg);
        }
    });
}

function checkNewTweets() {
    if (playback == 1) {
        //alert(g_tinewest);
        fetchNewTweets(g_tioldest, g_tinewest);
        //* Check every 15 seconds
        setTimeout(checkNewTweets, c_WAIT);
    }
}

function PausePlay() {
    if (playback == 1) {
        $("#imgPlayback").attr({ "src": "images/btn_play.gif", "alt": "Resume incoming tweets", "title": "Resume incoming tweets" });
        playback = 0;
    }
    else {
        $("#imgPlayback").attr({ "src": "images/btn_pause.gif", "alt": "Pause incoming tweets", "title": "Pause incoming tweets" });
        playback = 1;
        //checkNewTweets();
    }
}

function AddTweet() {    
    $(".twittercomment:first").slideDown("slow", function() { Reinitialise(); });        
}

function Reinitialise() {    
    $('.twitter').jScrollPane({ dragMaxHeight: 41, dragMinHeight: 41, scrollbarWidth: 12, scrollbarMargin: 18, showArrows: 'true' });    
    $(".jScrollArrowDown:first").css("width", "14px");
    $(".jScrollArrowUp:first").css("width", "14px");
}

function OpenBio(id) {
    $(".speakerRow").hide();
    $(id).show();
    $(id).find(".bioText").jScrollPane({ dragMaxHeight: 41, dragMinHeight: 41, scrollbarWidth: 12, showArrows: 'true' });
    $(id).find(".jScrollPaneContainer").css({ "top": "0", "width": "238px" });
    $(id).find(".jScrollArrowDown").css("width", "14px");
    $(id).find(".jScrollArrowUp").css("width", "14px");            
}

function CloseBio(id) {
    $(id).hide();
    $(".speakerRow").show();
}

(function(A) { A.jScrollPane = { active: [] }; A.fn.jScrollPane = function(C) { C = A.extend({}, A.fn.jScrollPane.defaults, C); var B = function() { return false }; return this.each(function() { var O = A(this); O.css("overflow", "hidden"); var X = this; if (A(this).parent().is(".jScrollPaneContainer")) { var Ac = C.maintainPosition ? O.position().top : 0; var L = A(this).parent(); var d = L.innerWidth(); var Ad = L.outerHeight(); var M = Ad; A(">.jScrollPaneTrack, >.jScrollArrowUp, >.jScrollArrowDown", L).remove(); O.css({ top: 0 }) } else { var Ac = 0; this.originalPadding = O.css("paddingTop") + " " + O.css("paddingRight") + " " + O.css("paddingBottom") + " " + O.css("paddingLeft"); this.originalSidePaddingTotal = (parseInt(O.css("paddingLeft")) || 0) + (parseInt(O.css("paddingRight")) || 0); var d = O.innerWidth(); var Ad = O.innerHeight(); var M = Ad; O.wrap(A("<div></div>").attr({ className: "jScrollPaneContainer" }).css({ height: Ad + "px", width: d + "px" })); A(document).bind("emchange", function(Ae, Af, p) { O.jScrollPane(C) }) } if (C.reinitialiseOnImageLoad) { var N = A.data(X, "jScrollPaneImagesToLoad") || A("img", O); var G = []; if (N.length) { N.each(function(p, Ae) { A(this).bind("load", function() { if (A.inArray(p, G) == -1) { G.push(Ae); N = A.grep(N, function(Ag, Af) { return Ag != Ae }); A.data(X, "jScrollPaneImagesToLoad", N); C.reinitialiseOnImageLoad = false; O.jScrollPane(C) } }).each(function(Af, Ag) { if (this.complete || this.complete === undefined) { this.src = this.src } }) }) } } var o = this.originalSidePaddingTotal; var l = { height: "auto", width: d - C.scrollbarWidth - C.scrollbarMargin - o + "px" }; if (C.scrollbarOnLeft) { l.paddingLeft = C.scrollbarMargin + C.scrollbarWidth + "px" } else { l.paddingRight = C.scrollbarMargin + "px" } O.css(l); var m = O.outerHeight(); var i = Ad / m; if (i < 0.99) { var H = O.parent(); H.append(A("<div></div>").attr({ className: "jScrollPaneTrack" }).css({ width: C.scrollbarWidth + "px" }).append(A("<div></div>").attr({ className: "jScrollPaneDrag" }).css({ width: C.scrollbarWidth + "px" }).append(A("<div></div>").attr({ className: "jScrollPaneDragTop" }).css({ width: C.scrollbarWidth + "px" }), A("<div></div>").attr({ className: "jScrollPaneDragBottom" }).css({ width: C.scrollbarWidth + "px" })))); var z = A(">.jScrollPaneTrack", H); var P = A(">.jScrollPaneTrack .jScrollPaneDrag", H); if (C.showArrows) { var g; var Ab; var S; var r; var j = function() { if (r > 4 || r % 4 == 0) { y(u + Ab * b) } r++ }; var K = function(p) { A("html").unbind("mouseup", K); g.removeClass("jScrollActiveArrowButton"); clearInterval(S) }; var Z = function() { A("html").bind("mouseup", K); g.addClass("jScrollActiveArrowButton"); r = 0; j(); S = setInterval(j, 100) }; H.append(A("<a></a>").attr({ href: "javascript:;", className: "jScrollArrowUp" }).css({ width: C.scrollbarWidth + "px" }).html("Scroll up").bind("mousedown", function() { g = A(this); Ab = -1; Z(); this.blur(); return false }).bind("click", B), A("<a></a>").attr({ href: "javascript:;", className: "jScrollArrowDown" }).css({ width: C.scrollbarWidth + "px" }).html("Scroll down").bind("mousedown", function() { g = A(this); Ab = 1; Z(); this.blur(); return false }).bind("click", B)); var Q = A(">.jScrollArrowUp", H); var J = A(">.jScrollArrowDown", H); if (C.arrowSize) { M = Ad - C.arrowSize - C.arrowSize; z.css({ height: M + "px", top: C.arrowSize + "px" }) } else { var s = Q.height(); C.arrowSize = s; M = Ad - s - J.height(); z.css({ height: M + "px", top: s + "px" }) } } var w = A(this).css({ position: "absolute", overflow: "visible" }); var D; var Y; var b; var u = 0; var V = i * Ad / 2; var a = function(Ae, Ag) { var Af = Ag == "X" ? "Left" : "Top"; return Ae["page" + Ag] || (Ae["client" + Ag] + (document.documentElement["scroll" + Af] || document.body["scroll" + Af])) || 0 }; var f = function() { return false }; var v = function() { n(); D = P.offset(false); D.top -= u; Y = M - P[0].offsetHeight; b = 2 * C.wheelSpeed * Y / m }; var E = function(p) { v(); V = a(p, "Y") - u - D.top; A("html").bind("mouseup", T).bind("mousemove", h); if (A.browser.msie) { A("html").bind("dragstart", f).bind("selectstart", f) } return false }; var T = function() { A("html").unbind("mouseup", T).unbind("mousemove", h); V = i * Ad / 2; if (A.browser.msie) { A("html").unbind("dragstart", f).unbind("selectstart", f) } }; var y = function(Ae) { Ae = Ae < 0 ? 0 : (Ae > Y ? Y : Ae); u = Ae; P.css({ top: Ae + "px" }); var Af = Ae / Y; w.css({ top: ((Ad - m) * Af) + "px" }); O.trigger("scroll"); if (C.showArrows) { Q[Ae == 0 ? "addClass" : "removeClass"]("disabled"); J[Ae == Y ? "addClass" : "removeClass"]("disabled") } }; var h = function(p) { y(a(p, "Y") - D.top - V) }; var q = Math.max(Math.min(i * (Ad - C.arrowSize * 2), C.dragMaxHeight), C.dragMinHeight); P.css({ height: q + "px" }).bind("mousedown", E); var k; var R; var I; var t = function() { if (R > 8 || R % 4 == 0) { y((u - ((u - I) / 2))) } R++ }; var Aa = function() { clearInterval(k); A("html").unbind("mouseup", Aa).unbind("mousemove", e) }; var e = function(p) { I = a(p, "Y") - D.top - V }; var U = function(p) { v(); e(p); R = 0; A("html").bind("mouseup", Aa).bind("mousemove", e); k = setInterval(t, 100); t() }; z.bind("mousedown", U); H.bind("mousewheel", function(Ae, Ag) { v(); n(); var Af = u; y(u - Ag * b); var p = Af != u; return !p }); var F; var W; function c() { var p = (F - u) / C.animateStep; if (p > 1 || p < -1) { y(u + p) } else { y(F); n() } } var n = function() { if (W) { clearInterval(W); delete F } }; var x = function(Af, p) { if (typeof Af == "string") { $e = A(Af, O); if (!$e.length) { return } Af = $e.offset().top - O.offset().top } H.scrollTop(0); n(); var Ae = -Af / (Ad - m) * Y; if (p || !C.animateTo) { y(Ae) } else { F = Ae; W = setInterval(c, C.animateInterval) } }; O[0].scrollTo = x; O[0].scrollBy = function(Ae) { var p = -parseInt(w.css("top")) || 0; x(p + Ae) }; v(); x(-Ac, true); A("*", this).bind("focus", function(Ah) { var Ag = A(this); var Aj = 0; while (Ag[0] != O[0]) { Aj += Ag.position().top; Ag = Ag.offsetParent() } var p = -parseInt(w.css("top")) || 0; var Ai = p + Ad; var Af = Aj > p && Aj < Ai; if (!Af) { var Ae = Aj - C.scrollbarMargin; if (Aj > p) { Ae += A(this).height() + 15 + C.scrollbarMargin - Ad } x(Ae) } }); if (location.hash) { x(location.hash) } A(document).bind("click", function(Ae) { $target = A(Ae.target); if ($target.is("a")) { var p = $target.attr("href"); if (p.substr(0, 1) == "#") { x(p) } } }); A.jScrollPane.active.push(O[0]) } else { O.css({ height: Ad + "px", width: d - this.originalSidePaddingTotal + "px", padding: this.originalPadding }); O.parent().unbind("mousewheel") } }) }; A.fn.jScrollPane.defaults = { scrollbarWidth: 10, scrollbarMargin: 5, wheelSpeed: 18, showArrows: false, arrowSize: 0, animateTo: false, dragMinHeight: 1, dragMaxHeight: 99999, animateInterval: 100, animateStep: 3, maintainPosition: true, scrollbarOnLeft: false, reinitialiseOnImageLoad: false }; A(window).bind("unload", function() { var C = A.jScrollPane.active; for (var B = 0; B < C.length; B++) { C[B].scrollTo = C[B].scrollBy = null } }) })(jQuery);

/* Copyright (c) 2006 Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
* Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
* Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
*
* $LastChangedDate: 2007-12-20 09:02:08 -0600 (Thu, 20 Dec 2007) $
* $Rev: 4265 $
*
* Version: 3.0
* 
* Requires: $ 1.2.2+
*/

(function($) {

    $.event.special.mousewheel = {
        setup: function() {
            var handler = $.event.special.mousewheel.handler;

            // Fix pageX, pageY, clientX and clientY for mozilla
            if ($.browser.mozilla)
                $(this).bind('mousemove.mousewheel', function(event) {
                    $.data(this, 'mwcursorposdata', {
                        pageX: event.pageX,
                        pageY: event.pageY,
                        clientX: event.clientX,
                        clientY: event.clientY
                    });
                });

            if (this.addEventListener)
                this.addEventListener(($.browser.mozilla ? 'DOMMouseScroll' : 'mousewheel'), handler, false);
            else
                this.onmousewheel = handler;
        },

        teardown: function() {
            var handler = $.event.special.mousewheel.handler;

            $(this).unbind('mousemove.mousewheel');

            if (this.removeEventListener)
                this.removeEventListener(($.browser.mozilla ? 'DOMMouseScroll' : 'mousewheel'), handler, false);
            else
                this.onmousewheel = function() { };

            $.removeData(this, 'mwcursorposdata');
        },

        handler: function(event) {
            var args = Array.prototype.slice.call(arguments, 1);

            event = $.event.fix(event || window.event);
            // Get correct pageX, pageY, clientX and clientY for mozilla
            $.extend(event, $.data(this, 'mwcursorposdata') || {});
            var delta = 0, returnValue = true;

            if (event.wheelDelta) delta = event.wheelDelta / 120;
            if (event.detail) delta = -event.detail / 3;
            //		if ( $.browser.opera  ) delta = -event.wheelDelta;

            event.data = event.data || {};
            event.type = "mousewheel";

            // Add delta to the front of the arguments
            args.unshift(delta);
            // Add event to the front of the arguments
            args.unshift(event);

            return $.event.handle.apply(this, args);
        }
    };

    $.fn.extend({
        mousewheel: function(fn) {
            return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
        },

        unmousewheel: function(fn) {
            return this.unbind("mousewheel", fn);
        }
    });

})(jQuery);