var Leaderboard = function(eventKey, filterKey, sortKey, ascDesc, scorecardKey) {
    
    var that = this;
    var params = {select:eventKey,select2:filterKey,select3:sortKey,select4:ascDesc,sc:scorecardKey};
    var expand = true;
    var last_my = null;
    var last_lb = null;
    
    this.refresh = function(justmy) 
    {       
        var my_params = Object.extend({mode:'MyLeaderboard'},params);
        new Ajax.Request('/scripts/playerscorecard.aspx', {
            method: 'get',
            parameters: my_params, 
            onSuccess: function(transport) { if (transport.responseText) $('myleaderboard').update(transport.responseText); last_my = hilightChanges($('myleaderboard'), transport.headerJSON, last_my); 
            }
        });
        if (justmy) return;
        removeHilight();        
        var lb_params = Object.extend({mode:'Leaderboard'},params);
        new Ajax.Request('/scripts/playerscorecard.aspx', {
            method: 'get',
            parameters: lb_params,
            onSuccess: function(transport) { if (transport.responseText) $('leaderboard').update(transport.responseText); last_lb = hilightChanges($('leaderboard'), transport.headerJSON, last_lb); },
            onComplete: function() { expand = expandScorecard(that,scorecardKey);}
        });  
    }
    
    var highlightRow = function (ele)
    {
        if (typeof(ele) === 'string') ele = $(ele);
        new Effect.Highlight(ele, {startcolor:'#fff666', endcolor:(ele.className == 'alt'? '#E8E8E8' : '#f7f7f7'), duration: 2.5});
    }

    var hilightChanges = function (tb, rows, last)
    {       
        if (!(rows = $A(rows))) alert("didn't get valid hashes!");
        if (!last) return rows;
        var i = 0; var j = 0;
        tb.select("tr.score").each(function(e) {
             if (i>=rows.size() || j>=last.size() || rows[i]!=last[j]) {
                highlightRow(e); 
                i++; 
                if(rows[i]!=last[j])
                {
                    j++;
                }
             } 
             else { i++; j++; }
        });
        return rows;
    }
    
    this.showRow = function (link, playerKey)
    {        
        var prow = $(link).up("tr");
        var replace = prow.next("tr").down("td");
        var open = prow.toggleClassName("selected").hasClassName("selected");
        if (open) {
            new Ajax.Updater(replace, '/scripts/playerscorecard.aspx', 
            {
                method: 'get',
                parameters: {select:eventKey,select5:playerKey},
                evalScripts: true,
                onSuccess: function() { showRowCB(prow);},
                onComplete: function() { showTab('scores',playerKey); }
            });
        } else prow.next("tr").hide();
        if (open) params[prow.id] = true; 
        else delete params[prow.id];
        return false;
    }
    
    this.hideRow = function (link)
    {
        var root = $(link).up("tr");    
        var prow = root.previous("tr");
        root.hide();
        prow.removeClassName("selected");
        delete params[prow.id];
        return false;
    } 
    
    showTab = function (tab,playerKey)
    { 
        var divElement = $(tab + '_' + playerKey);
        var tabElement = $('tab_' + tab + '_' + playerKey);                 
        if (tab == 'scores')
        {
            divElement.show();
            tabElement.className = 'on';
            
            divElement = $('stats_' + playerKey);
            tabElement = $('tab_stats_' + playerKey);
            tabElement.className = '';
            divElement.hide();
            
            divElement = $('bio_' + playerKey);
            tabElement = $('tab_bio_' + playerKey);
            tabElement.className = 'no';
            divElement.hide();
            
            divElement = $('gallery_' + playerKey);
            tabElement = $('tab_gallery_' + playerKey);
            tabElement.className = '';
            divElement.hide();
        }
        else if (tab == 'stats')
        {          
            divElement.show();
            tabElement.className = 'on';
            
            divElement = $('scores_' + playerKey);
            tabElement = $('tab_scores_' + playerKey);
            tabElement.className = '';
            divElement.hide();
            
            divElement = $('bio_' + playerKey);
            tabElement = $('tab_bio_' + playerKey);
            tabElement.className = 'no';
            divElement.hide();
            
            divElement = $('gallery_' + playerKey);
            tabElement = $('tab_gallery_' + playerKey);
            tabElement.className = '';
            divElement.hide();
        }
        else if (tab == 'bio')
        {
            divElement.show();
            tabElement.className = 'on';
            
            divElement = $('scores_' + playerKey);
            tabElement = $('tab_scores_' + playerKey);
            tabElement.className = '';
            divElement.hide();
            
            divElement = $('stats_' + playerKey);
            tabElement = $('tab_stats_' + playerKey);
            tabElement.className = '';
            divElement.hide();
            
            divElement = $('gallery_' + playerKey);
            tabElement = $('tab_gallery_' + playerKey);
            tabElement.className = '';
            divElement.hide();
        }      
        else if (tab == 'gallery')
        {
            divElement.show();
            tabElement.className = 'on';
            
            divElement = $('stats_' + playerKey);
            tabElement = $('tab_stats_' + playerKey);
            tabElement.className = '';
            divElement.hide();
            
            divElement = $('bio_' + playerKey);
            tabElement = $('tab_bio_' + playerKey);
            tabElement.className = 'no';
            divElement.hide();
            
            divElement = $('scores_' + playerKey);
            tabElement = $('tab_scores_' + playerKey);
            tabElement.className = '';
            divElement.hide();
        } 
                
        setTabParams(tab,playerKey);
    }
       
    
    setTabParams = function (tab,playerKey)  
    {        
       params[tab + '_' + playerKey] = true;
       
       if(tab == 'scores')
        {
            delete params['stats_' + playerKey];
            delete params['bio_' + playerKey];
            delete params['gallery_' + playerKey];
        }
        else if (tab == 'stats')
        {   
            delete params['scores_' + playerKey];
            delete params['bio_' + playerKey];
            delete params['gallery_' + playerKey];
        }
        else if (tab == 'bio')
        {
            delete params['scores_' + playerKey];
            delete params['stats_' + playerKey];
            delete params['gallery_' + playerKey];
        }      
        else if (tab == 'gallery')
        {
            delete params['stats_' + playerKey];
            delete params['bio_' + playerKey];
            delete params['scores_' + playerKey];
        } 
    }
        
    var showRowCB = function (prow) { 
        var root = prow.next("tr");
        if (prow.hasClassName("selected")) root.style.display = window.ActiveXObject ? 'block' : 'table-row';        
    }
    
    var start = function() {        
        that.refresh();   
        start.bind(this).delay(60);
    } 
    
    var expandScorecard = function (lb,player)
    {
        if(expand == true)
        {
            if(scorecardKey != null)
            {   
                var scToShow;     
                scToShow = 'link_' + player;
                lb.showRow(scToShow, player);
                window.location.hash = player;
            }            
        }
        return false;      
    }
    
    start();      
    
}



var Rater = function(d, bf, pb) {
    d=$(d);
    var that = this;
    var span = d.down("span");
    var lastValue;
    var origValue = span.style.width;
    
    var over = function(evt) {
        d.addClassName("selecting");
        move(evt);    
    }
    
    var move = function(evt) {
        var off = evt.pointerX() - d.cumulativeOffset().left;
        that.setRating(Math.min(5,Math.max(1,Math.ceil(off/31))));
    }
    
    var out = function(evt) {
        d.removeClassName("selecting");
        span.style.width = origValue;
    }
    
    var click = function(evt) {
        $(bf).value = lastValue;
        eval(pb);
    }
    
    this.setRating = function(i) {
        lastValue = i;
        span.style.width = (31*i)+"px";
    }
    
    d.observe('mouseover', over);
    d.observe('mousemove', move);
    d.observe('mouseout', out);
    d.observe('click', click);
    
    return this;
}

var EquipmentRater = function(track, lbl, bf)
{
    if (!EquipmentRater.all) EquipmentRater.all = {};
    EquipmentRater.all[track] = this;
    
    var that = this;
    this.value = parseInt($F(bf));
    track = $(track); lbl = $(lbl);
    var handle = track.down(".handle");
    var qual = track.down(".qual");
    
    this.setRating = function(v) {
        $(bf).value = Math.round(v*100);
        updateLabel(v);
    }
    
    var updateOverall = function() {
        if (!EquipmentRater.all) return;
        var total=0
        var count=0;
        $H(EquipmentRater.all).values().each(function(v) {total += v.value; count++; });      
        $('myOverAll').down('p').update(Math.round(total/count));
    }
    
    var updateLabel = function(v) {
        that.value = Math.round(v*100);
        lbl.innerHTML='('+that.value+' out of 100)';
        if (v < .25)
            qual.className='poor sliderQual';     
        else if (v > .75)
            qual.className='good sliderQual';  
        else if (.26 < v < .75)
            qual.className='moderate sliderQual';  
        else
            qual.className='moderate sliderQual';  
        updateOverall();        
    }
        
    var c = new Control.Slider(handle,track,{
        sliderValue:$F(bf)/100.0,
        startSpan:qual,
        onSlide:updateLabel,
        onChange:this.setRating
    });
    updateLabel($F(bf)/100.0);
}

function hidePopUp()
{
    var popUp = $('popUp');
    $(popUp).replace();
    grayOut(false);
}        

function showPopUp(pop, text)
{
 var posx = 0;
 var posy = 0;

 var scrolly = (document.documentElement) ? document.documentElement.scrollTop : window.pageYOffset
 var scrollx = (document.documentElement) ? document.documentElement.scrollLeft : window.pageXOffset

 var myWidth = 0, myHeight = 0;

 if( typeof( window.innerWidth ) == 'number' ) {
 //Non-IE
 myWidth = window.innerWidth;
 myHeight = window.innerHeight;
 } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
 //IE 6+ in 'standards compliant mode'
 myWidth = document.documentElement.clientWidth;
 myHeight = document.documentElement.clientHeight;
 } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
 //IE 4 compatible
 myWidth = document.body.clientWidth;
 myHeight = document.body.clientHeight;
 }

 var popUpLayer = document.createElement('div');
 popUpLayer.setAttribute('id', 'popUp');
 
 switch(pop) {
    case 'login':
        var loginUrl = "'/core.aspx?page=200081&prev_url=" + escape("/core.aspx" + window.location.search) + "&next_url=" + escape("/core.aspx" + window.location.search) + "'";
        var joinUrl = "'/core.aspx?page=200008&prev_url=" + escape("/core.aspx" + window.location.search) + "&next_url=" + escape("/core.aspx" + window.location.search) + "'";
        posy = scrolly+((myHeight-420)/2);
        posx = scrollx+((myWidth-577)/2);
        $(popUpLayer).addClassName('loginPop'); 
        popUpLayer.innerHTML = '<div class="header"><div class="extra left"></div><div class="right"><img src="http://images.thegolfchannel.com/images/Element2008/221994.png" style="cursor:pointer" onclick="hidePopUp(); return false;" alt="Close" /></div><div class="clear"></div></div><div class="wrapper"><div class="left"><h2>You must be a registered member to interact with this page</h2><p>Already joined the GolfChannel.com? Click the <em>Login</em> button below.</p><input type="image" src="http://images.thegolfchannel.com/images/Element2008/221995.jpg" onclick="hidePopUp(); window.location=' + loginUrl + '; return false;"/></div><div class="right"><h2>Not a Member? Join the Golf Channel</h2><h3>It\'s free and easy.</h3><p>As a registered member of the Golf Channel you\'ll enjoy the following benefits:</p><ul class="regOL"><li>Access to thousands of Videos</li><li>Membership in our Community</li><li>Post Ratings, Comments & Reviews</li><li>Track your game in Game Tracker</li><li>Get the latest news in our Newsletter</li></ul><img src="http://images.thegolfchannel.com/images/Element2008/221996.jpg" style="cursor:pointer" onclick="hidePopUp(); window.location=' + joinUrl + ';return false;" alt="Join Now!" /></div></div>';
        break;
    case 'confirm':
        posy = scrolly+((myHeight-250)/2);
        posx = scrollx+((myWidth-350)/2);
        $(popUpLayer).addClassName('confirmPop');
        popUpLayer.innerHTML = '<div class="header"><div class="extra left"></div><div class="right"><img src="http://images.thegolfchannel.com/images/Element2008/221994.png" style="cursor:pointer" onclick="hidePopUp(); return false;" alt="Close" /></div><div class="clear"></div></div><div class="wrapper"><h2>'+text+'</h2><p style="margin-top: 20px"><img src="http://images.thegolfchannel.com/images/Element2008/221997.jpg" onclick="hidePopUp(); return false;" style="cursor: pointer;" /></p></div></div>';
        break;
    case 'email':
        posy = scrolly+((myHeight-420)/2);
        posx = scrollx+((myWidth-577)/2);
             
        break;  
 }
 popUpLayer.style.top = posy + 'px';
 popUpLayer.style.left = posx + 'px';
 popUpLayer.style.display = 'block';
 popUpLayer.style.zIndex = 999;
 document.body.appendChild(popUpLayer);
 grayOut(true); 
}        

function grayOut(vis, options) {
  // Pass true to gray out screen, false to ungray
  // options are optional.  This is a JSON object with the following (optional) properties
  // opacity:0-100         // Lower number = less grayout higher = more of a blackout 
  // zindex: #             // HTML elements with a higher zindex appear on top of the gray out
  // bgcolor: (#xxxxxx)    // Standard RGB Hex color code
  // grayOut(true, {'zindex':'50', 'bgcolor':'#0000FF', 'opacity':'70'});
  // Because options is JSON opacity/zindex/bgcolor are all optional and can appear
  // in any order.  Pass only the properties you need to set.
  var options = options || {}; 
  var zindex = options.zindex || 50;
  var opacity = options.opacity || 60;
  var opaque = (opacity / 100);
  var bgcolor = options.bgcolor || '#000000';
  var dark=document.getElementById('darkenScreenObject');
  if (!dark) {
    // The dark layer doesn't exist, it's never been created.  So we'll
    // create it here and apply some basic styles.
    // If you are getting errors in IE see: http://support.microsoft.com/default.aspx/kb/927917
    var tbody = document.getElementsByTagName("body")[0];
    var tnode = document.createElement('div');           // Create the layer.
        tnode.style.position='absolute';                 // Position absolutely
        tnode.style.top='0px';                           // In the top
        tnode.style.left='0px';                          // Left corner of the page
        tnode.style.overflow='hidden';                   // Try to avoid making scroll bars            
        tnode.style.display='none';                      // Start out Hidden
        tnode.id='darkenScreenObject';                   // Name it so we can find it later
    tbody.appendChild(tnode);                            // Add it to the web page
    dark=document.getElementById('darkenScreenObject');  // Get the object.
  }
  if (vis) {
    // Calculate the page width and height 
    if( document.body && ( document.body.scrollWidth || document.body.scrollHeight ) ) {
        var pageWidth = document.body.scrollWidth+'px';
        var pageHeight = document.body.scrollHeight+'px';
    } else if( document.body.offsetWidth ) {
      var pageWidth = document.body.offsetWidth+'px';
      var pageHeight = document.body.offsetHeight+'px';
    } else {
       var pageWidth='100%';
       var pageHeight='100%';
    }   
    //set the shader to cover the entire page and make it visible.
    dark.style.opacity=opaque;                      
    dark.style.MozOpacity=opaque;                   
    dark.style.filter='alpha(opacity='+opacity+')'; 
    dark.style.zIndex=zindex;        
    dark.style.backgroundColor=bgcolor;  
    dark.style.width= pageWidth;
    dark.style.height= pageHeight;
    dark.style.display='block';                          
  } else {
     dark.style.display='none';
  }
}

function findCallback(i) 
{
    removeHilight();
    var root = $("player_" + i.id);
    if (root) {
        root.addClassName("hilite");
        window.location.hash = i.id;
        $('playerFound').show();
    } else alert("Player not found on this leaderboard.");
}

function removeHilight() {
    $$(".hilite").each( function (e) { e.removeClassName("hilite"); } );
    $('playerFound').hide();
}

//My Leaderboard functions
function setMyLBoardCookie(playerKey)
{
    var myLB;
    var searchResult;
    myLB = getMyLBoardCookie('favplayers');
    
    if(myLB != null)
    {
        searchResult = myLB.search(playerKey);
    }
    
    if(searchResult == -1 || myLB == null)
    {
        myLB = "favplayers=" + (myLB||'') + playerKey + "|";
        myLB = myLB + "; expires=Fri, 31 Dec 2099 23:59:59 GMT; path=/;";
        document.cookie = myLB;
        
    }
        
    ldbd.refresh(true);
}

function getMyLBoardCookie(cookieName)
{    
    var results = document.cookie.match ( '(^|;) ?' + cookieName + '=([^;]*)(;|$)' );
    if (results) return (unescape(results[2]));
    return null;
}

function removeFromMyLBoard(playerKey)
{    
    var myLB;
    myLB = getMyLBoardCookie('favplayers');
    if (myLB == null) return;
    var newMyLB;
    newMyLB = myLB.replace(playerKey + "|", "");
    if (newMyLB == "")
        deleteMyLBoardCookie("favplayers");
    else
        document.cookie = "favplayers=" + newMyLB + "; expires=Fri, 31 Dec 2099 23:59:59 GMT; path=/;";

    ldbd.refresh(true);        
}

function deleteMyLBoardCookie(cookieName)
{
    document.cookie = cookieName += "=; expires=Thu, 01-Jan-70 00:00:01 GMT; path=/";
}