$.fn.tagName = function() {
    return this.get(0).tagName.toLowerCase();
}


/**
 * Setup custom styles
 */
$(document).ready(function() {
  $('#status').livequery('keyup', function(){ 
      if(this.value.length >= 140) { 
           //handle the over the limit part here 
           $('#twitter_counter').addClass('red'); 
           //this.value = this.value.substring(0, 140); 
      } else { 
          $('#twitter_counter').removeClass('red'); 
      } 
     $('#twitter_counter').text(140-this.value.length); 
  }); 

  
  $('.timeago').livequery(function() {
      $(this).timeago();
  });
  
  $('img.favicon').livequery(function() {
       var img = $(this);
       if (img.attr('src') != '') return;
       var domain = img.attr('title');
       if (domain) {
            var url = 'http://www.google.com/s2/favicons?domain='+domain; 
            img.attr('src',url);
       }
       return false;
  });
  
  $('img.profile-image-from-twitter').each(function() {
      var url = 'http://search.twitter.com/search.json?q=from%3A'+$(this).attr('title')+'&callback=?';
      var img = $(this);
      $.getJSON(url,  function(data){   
            var url = data.results[0].profile_image_url;
            img.attr('src',url);
      });
  });
  
   // Check width of element:
   // From http://james.padolsey.com/javascript/extending-jquerys-selector-capabilities/
    $.extend($.expr[':'],{
        width: function(a,i,m) {
            if(!m[3]||!(/^(<|>)\d+$/).test(m[3])) {return false;}
            return m[3].substr(0,1) === '>' ? 
                     $(a).width() > m[3].substr(1) : $(a).width() < m[3].substr(1);
        }
    });
    
   $("img:width(>48)").lazyload({ // Only runs on images wider than 48px, so it will ignore twitter avatars
		placeholder : "/images/grey.gif"
   });
});

// Functions that deal with users
users = new Object();
users.doAfterLogin = null;
users.isLoggedIn = null;
users.screenName = null;
users.updateLoginStatus = function(callback) {
    $.getJSON('/login/user.json',function(data) {
        if (!data.login) {
            users.isLoggedIn = false;
        } else {
            users.isLoggedIn = true;
            users.screenName = data.screen_name;
        }
        if (callback !== undefined) callback();
	 var event = jQuery.Event('updateLoginStatus');
	 event.isLoggedIn = users.isLoggedIn;
	 event.screenName = users.screenName;
	 $(document).trigger(event);
    });
}
users.updateLoginElements = function() {
    var topbar = $('#login-status');
    if (!users.isLoggedIn) {
        topbar.html('<a href="javascript:users.loginAndDo(function(){})" id="login_link" class=\'login\'>Sign in with Twitter</a>');
    } else {
        topbar.html('Welcome '+users.screenName +'! <a id="logout_link" href="/login/logout">Logout</a>');  
    }
    $('a.login').each(function(i) {
        var elem = $(this);
        users.updateLoginLink(elem);
   });
}
users.loginAndDo = function(callback) {
    if (users.isLoggedIn === null) return false;
    if (!users.isLoggedIn) {
        users.doAfterLogin = function() {
           users.updateLoginStatus(function() {
		users.updateLoginElements();
		callback();
	   });
        }
        var w=window.open('/login', 'loginWindow','width=800,height=400,left=150,top=100,scrollbar=no,resize=no');
        w.focus();
    } else {
        callback();
    }
}
users.updateLoginLink = function(elem) {  
    if (elem == undefined) return;
    var link_text = $(elem).attr('shmitle');
    var text = null;
    var text_login = null;
    if (link_text) {
        link_text = link_text.split('&');
        if (link_text.length > 0) {
            text_login = unescape(link_text[0]);
            text = unescape(link_text[1]);
        }
    }    
    if (!users.isLoggedIn) {
        if (text_login) $(elem).html(text_login); 
    } else {
        if (text) $(elem).html(text);
     
    }
}

$(document).ready(function() {
   users.updateLoginStatus(users.updateLoginElements);
   // Update new login links as they appear
   $('a.login').livequery(function() {
        if (users.isLoggedIn !== null) {     // Don't allow live updates until users.updateLoginElements() has run once
            users.updateLoginLink(this);
        }
    });   
    
    // Drop down menus for top bar
    $('#sitebar .site').hover(function(){
    	$('#now_trending').remove();
		var siteUrl = $(this).attr('href');
		$(this).after('<div id="now_trending"><ul><li><a href="'+siteUrl+'">Tweets</a></li><li><a href="'+siteUrl+'/links">Links</a></li><li><a href="'+siteUrl+'/pictures">Pictures</a></li></ul>Now trending<ul id="trending"></ul></div>');
    	$.getJSON(siteUrl+'/api/trending.json?callback=?', function(json){
    		$('#now_trending ul#trending').html('');
    		$.each(json.trends, function(i, item) {
    			$('#now_trending ul#trending').append('<li><a href="'+siteUrl+'/search/'+escape(item)+'">'+item+'</a></li>');
    		})
    	});
    	$('#now_trending').css('left', $(this).offset().left);
    });
});

twitterclient = new Object();
twitterclient.boxy = null;
twitterclient.login = function() {
    var pop = function() { 
        var w=window.open('/login', 'Child','width=800,height=400,left=150,top=100,scrollbar=no,resize=no');
        w.focus(); 
    }
    var login = false;
    $.getJSON('/login/user.json',function(data) {
        if (data.login) login = true;
    });   
}
twitterclient.createBoxy = function(html, options) {
   var boxy = new Boxy(html, options);
    boxy.modalBlackout.click(function() {
        boxy.hide();
        boxy.unload();
    });
    twitterclient.boxy = boxy;
}

twitterclient.follow = function(twitter_screen_name) {
    if (Boxy.isModalVisible()) return;
    var title = "Follow "+twitter_screen_name;
    var url = '/twitterclient/follow_popup?twitter_screen_name='+encodeURIComponent(twitter_screen_name);
 
    var options = {'title':title,'modal':true,'closeable':true,'unloadOnHide':true,'closeText':'close'}; 
    var ajax = {
            url: url, type: 'GET', dataType: 'html', cache: false, success: function(html) {
                html = jQuery(html);
                twitterclient.createBoxy(html,options);
            }
    };
    
    jQuery.ajax(ajax);
}
twitterclient.followMultiple = function(twitter_screen_names) {
    if (twitter_screen_names.length == 0) return;
    var options = {'title':'Follow','modal':true,'closeable':true,'unloadOnHide':true,'closeText':'close'}; 
    twitterclient.createBoxy('<div class="message">Following up to '+twitter_screen_names.length+' user' + (twitter_screen_names.length>1?'s':'' ) +' on Twitter...</div>',options);
    $.getJSON('/twitterclient/follow_multiple.json',{twitter_screen_names:twitter_screen_names.join(',')},function(data) {
         if (twitterclient.boxy) {
            message = 'Done!';
            var content = twitterclient.boxy.getContent();
            content.html('<div class="message">'+message+'</div>');           
            twitterclient.boxy.hide();
            twitterclient.boxy.unload();
         }
    });  
}

twitterclient.follow.submit = function(twitter_screen_name) {
    if (twitterclient.boxy) {
        var content = twitterclient.boxy.getContent();
        content.html('<div class="message">Following...</div>');
    }     
    $.getJSON('/twitterclient/follow.json',{twitter_screen_name:twitter_screen_name},function(data) {
         if (twitterclient.boxy) {
            if (data.success) {
                message = 'Followed!';
            } else {
                message = '';
            }
            var content = twitterclient.boxy.getContent();
            content.html('<div class="message">'+message+'</div>');           
            twitterclient.boxy.hide();
            twitterclient.boxy.unload();
            
         }
    });  
}

// Functions corresponding to specific views
elements = new Object();
elements.link = new Object();
elements.link.vote = function(status,title,link_id,message) {
    var elem = $('#'+link_id);
    if (!elem.hasClass('link-vote-total')) {
        elem = null;
    }
    var url = '/commenting/link_voting.json?id='+link_id;
    $.getJSON(url,function(data) {
        if (elem) $(elem).html(data.votes).show(); 
        elements.tweet.popup(status,title,message);
    });
}

elements.tweet = new Object();
elements.tweet.boxy = null;
elements.tweet.popup = function(status,title,message) {
    if (Boxy.isModalVisible()) return;
    if (!title) title = "Send a Tweet";
    if (!message) message = '';
    var url = '/elements/tweet?status='+encodeURIComponent(status);
	if (message) {
		url = url + '&message='+encodeURIComponent(message);
	}
    var options = {'title':title,'modal':true,'closeable':true,'unloadOnHide':true,'closeText':'close'}; 
    var ajax = {
            url: url, type: 'GET', dataType: 'html', cache: false, success: function(html) {
                html = jQuery(html);
                var boxy= new Boxy(html, options);
                boxy.modalBlackout.click(function() {
                    boxy.hide();
                    boxy.unload();
                });
                elements.tweet.boxy = boxy;
                $('#twitter_counter').text(140 - status.length);
            }
    };
    jQuery.ajax(ajax);
}
elements.tweet.send = function(status,title,status_id,message) {
    var url = '/commenting/status_button/'+title.toLowerCase()+'/'+status_id+'.json'
    $.getJSON(url,function(data) {
    });
    elements.tweet.popup(status,title,message);
}
elements.tweet.submit = function(status) {
    if (elements.tweet.boxy) {
        var content = elements.tweet.boxy.getContent();
        content.html('<div class="message">Sending tweet...</div>');
    }
    $.getJSON('/elements/tweet/status.json',{status:status},function(data) {
        if (data.success) {
            if (content) {
                content.html('<div class="message">Sent!</div>');    
            }
        }
        if (elements.tweet.boxy) { 
        	elements.tweet.boxy.hide();
        	elements.tweet.boxy.unload(); 
        }
    });

}
elements.tweet.getTweetFromTag = function(tag) {
    text = $(tag).attr('href');
    text = $(tag).attr('href');
    text = unescape(text.replace('http://twitter.com/home?status=','').replace(/\+/g,' '));
    return text;
}
elements.tweet.fromLink = function(elem,title,status_id) {
    var tweet = elements.tweet.getTweetFromTag(tag);
    elements.tweet.send(tweet,title,status_id);
    return false;
}
elements.tweet.showTip = function(e) {
    $(this).append('<div id="status_tooltip" style="display:none"></div>');
    var status_id = $(this).attr('id');
    $('#status_tooltip').css({
        'left':$(this).width()-10,
        'top':-1,
        'zIndex':99
    }).load('/elements/tweet/tooltip/'+status_id,function() {$(this).show()});
};
elements.tweet.hideTip = function(e) {
     $('#status_tooltip').hide().remove();
}

$(document).ready(function() {
    $('.status').livequery(function() {
        if ($(this).attr('id')) {
            $(this).hover(elements.tweet.showTip,elements.tweet.hideTip);
        }
    });
});
