function isEmpty(object) {
for(var attribute in object){
return false;
}
return true;
}
BF_Editor = function() {
this.init = function() {
this.poller = new cookie_poller();
var editor_links = $$('.editor-admin');
var delete_reaction = $$('.editor-delete_reaction');
var delete_related_links = $$('.editor-delete_related_links');
var user = new BF_User();
var isa = false;
var terminal_user = false;
var basic_edit_functionality = false;
var userinfo;
if( user && user.isLoggedIn() ) {
userinfo = user.getUserInfo();
if(userinfo && userinfo.isa && userinfo.isa=='true') {
isa = true;
}
if(userinfo && userinfo.terminal_user && userinfo.terminal_user =='true') {
terminal_user = true;
}
else {
basic_edit_functionality = true;
}
}
if ( isa ) {
for( var i = 0; i < editor_links.length; i++ ) {
editor_links[i].stopObserving('click');
editor_links[i].observe('click',bf_editor.load_editor);
editor_links[i].show();
}
delete_reaction.each( function(el){
el.stopObserving('click',bf_editor.delete_reaction);
el.observe('click',bf_editor.delete_reaction);
el.show();
} );
delete_related_links.each( function(el){
el.stopObserving('click',bf_editor.delete_related_links);
el.observe('click',bf_editor.delete_related_links);
el.show();
} );
}
else if ( terminal_user ) {
// parse username out of URL
var pathname = window.location.pathname;
if ( BF_STATIC.web_root.length > 0 ) pathname = pathname.replace(BF_STATIC.web_root,'');
var user_page = pathname.split('/');
if ( user_page.length > 0 ) user_page = user_page[1];
else user_page = '';
// only parse DOM if logged-in user matches username on URL
var current_user = user.getUserInfo().username;
if ( current_user == user_page ) {
terminal_links = $$('.terminal-admin');
for( var i = 0; i < terminal_links.length; i++ ) {
var obj = terminal_links[i];
// Even if we're on the user's page, make sure it's her buzz (eg not someone else's contribution to her buzz)
var owner = obj.getAttribute('rel:owner');
if ( owner == current_user ) {
obj.stopObserving('click',bf_editor.load_editor);
obj.observe('click',bf_editor.load_editor);
obj.show();
}
}
}
}
if ( isa || terminal_user || basic_edit_functionality ) {
var basic_admin = $$('.basic-admin');
var username = ( new BF_User() ).getUserInfo().username;
var regex = new RegExp('/'+username+'(/?|$)');
if (! window.location.href.match(regex) && !isa ) return;
for( var i = 0; i < basic_admin.length; i++ ) {
var el = $(basic_admin[i]);
var owner = el.getAttribute('rel:owner');
var buzz_data = el.getAttribute('rel:data');
var buzz_data = eval('('+buzz_data+')');
var buzz_id = buzz_data.buzz_id;
var buzz_type = buzz_data.type;
if ( owner == username || (isa && $('user_post_edit'))) {
el.setAttribute('editor-style','basic');
el.stopObserving('click',bf_editor.load_editor_in_dialog);
el.observe('click',bf_editor.load_editor_in_dialog);
el.show();
var parent = el;
while ( parent.parentNode && parent.tagName!='LI' ) parent = parent.parentNode;
$(parent).observe( 'mouseout', function(e){
var username = ( new BF_User() ).getUserInfo().username;
var owner = this.obj.getAttribute('rel:owner');
if ( username == owner || isa ) if ($(this.obj.parentNode)) $(this.obj.parentNode).hide();
}.bind({obj:el}) );
$(parent).observe( 'mouseover', function(e){
var username = ( new BF_User() ).getUserInfo().username;
var owner = this.obj.getAttribute('rel:owner');
if ( username == owner || isa ) if ($(this.obj.parentNode)) $(this.obj.parentNode).show();
}.bind({obj:el}) );
}
}
var delete_links = $$('.basic-admin-delete');
for( var i = 0; i < delete_links.length; i++ ) {
delete_links[i].observe('click',function(e){
bf_editor.delete_quickpost(e);
});
}
$$('.qe2').each(function(el){ el.addClassName('with-stats'); });
var stats_links = $$('.basic-admin-stats');
for( var i = 0; i < stats_links.length; i++ ) {
stats_links[i].observe('click',function(e){
bf_editor.load_stats(e);
});
}
}
var username = ( new BF_User() ).getUserInfo().username;
var hide_edit_for_other_buzzes = new RegExp('(/submissions)?/'+username);
var hide_me = new RegExp('with-stats');
if (window.location.href.match(hide_edit_for_other_buzzes)) {
$$('.qe3').each( function(el){
if ( el.className.match(hide_me) ) {
var owner = '';
var a = el.getElementsByTagName('A');
owner = a[0].getAttribute('rel:owner');
if ( owner != username ) el.parentNode.removeChild(el);
}
});
}
}
this.delete_reaction = function(e) {
e.stop();
var buzz_name = e.target.getAttribute('rel:buzz_name');
var buzz_id = e.target.getAttribute('rel:buzz_id');
var user_id = e.target.getAttribute('rel:user_id');
var responses = e.target.getAttribute('rel:responses');
BF_UI.showDialog('user_post_delete', 'Delete');
$('user_post_delete_iframe').setAttribute('src','/buzzfeed/editbuzz/delete_reaction?id='+buzz_id+'&responses='+responses+'&buzz_name='+buzz_name+'&user_id='+user_id);
}
this.delete_related_links = function(e) {
e.stop();
var campaignid = e.target.getAttribute('rel:campaignid');
var related_campaignid = e.target.getAttribute('rel:related_campaignid');
var buzz_name = e.target.getAttribute('rel:buzz_name');
BF_UI.showDialog('user_post_delete', 'Delete');
$('user_post_delete_iframe').setAttribute('src','/buzzfeed/editbuzz/delete_related_links?campaignid='+campaignid+'&related_campaignid='+related_campaignid+'&buzz_name='+buzz_name);
}
this.delete_quickpost = function(e) {
if ( e.event ) e = e.event;
e.stop();
var username = ( new BF_User() ).getUserInfo().username;
var el = e.target;
var owner = el.getAttribute('rel:owner');
var buzz_data = el.getAttribute('rel:data');
var buzz_data = eval('('+buzz_data+')');
var track = eval('('+el.getAttribute('track')+')');
var buzz_id = buzz_data.buzz_id;
var user = new BF_User();
var userinfo = user.getUserInfo();
var isa = false;
if (userinfo && userinfo.isa && userinfo.isa=='true') { isa = true };
if ( username != owner && !isa ) return;
BF_UI.showDialog('user_post_delete', 'Delete');
$('user_post_delete_iframe').setAttribute('src','/buzzfeed/editbuzz/delete?id='+buzz_id);
}
this.load_stats = function(e) {
var user_info = ( new BF_User() ).getUserInfo();
var buzz_info = e.target.getAttribute('rel:data').evalJSON();
var owner = el.getAttribute('rel:owner');
var track = eval('('+el.getAttribute('track')+')');
window.location.href = BF_STATIC.web_root + '/dashboard/' + owner + '/' + track.buzz;
}
this.edit_from_stats = function( e ) {
e.stop();
BF_UI.closeDialog('user_post_stats',{onComplete: bf_editor.close_user_stats });
bf_editor.load_editor_in_dialog( e );
};
this.fill_stats_panel_shell = function(o) {
var shell = $$('#user_post_stats .bf_dialog_content').first();
$$('#user_post_stats .bf_dialog_content').first().innerHTML = o.responseText;
// setup buttons
$('user-stats-cancel-button').observe('click',function(){
BF_UI.closeDialog('user_post_stats',{onComplete: bf_editor.close_user_stats });
});
$('user-stats-snapshot-button').observe('click', function(){
if(bf_editor.snapshot){
Element.setStyle('user-stats-left-snapshot', {display:'none'})
Element.setStyle('user-stats-left', {display:'block'})
$('user-stats-snapshot-button').setAttribute('value', 'Snapshot')
bf_editor.snapshot = 0
}
else {
Element.setStyle('user-stats-left', {display:'none'})
Element.setStyle('user-stats-left-snapshot', {display:'block'})
$('user-stats-snapshot-button').setAttribute('value', 'Current')
bf_editor.snapshot = 1
}
});
$$('.edit-buzz-from-stats').each(function(el){
el.observe('click', bf_editor.edit_from_stats);
});
// prep other buzz links to load stats
$$('a.stats-loader').each(function(el){
el.observe('click', bf_editor.load_stats);
});
bf_editor.stats_shell_loaded = true;
}
this.pivot_stats = function( stats ) {
new_ar = [];
stats.each(function(el){
new_ar[el.type] = el;
});
$R(0,100).each(function(i){
if (!new_ar[ i ])
{
new_ar[i] = { total: 0, totals: [0,0,0,0,0,0,0] };
}
});
return new_ar;
};
/*
* Get stats from amazon ec2 and put values into html
*/
this.fill_stats_panel_stats = function() {
index = this.index ? this.index : '';
// this call could come as xss or a setTimeout call
if (arguments.length == 1 && typeof arguments[0] == 'object')
{
if(isEmpty(arguments[0])){
return;
}
if(arguments[0].snapshot){
index = '-snapshot'
}
bf_editor.stats_panel = bf_editor.stats_panel ? bf_editor.stats_panel : {};
bf_editor.stats_panel[index] = arguments[0];
bf_editor.stats_panel[index].week_impressions = bf_editor.pivot_stats(bf_editor.stats_panel[index].week_impressions);
if (bf_editor.stats_panel[index].all_impressions)
bf_editor.stats_panel[index].all_impressions = bf_editor.pivot_stats(bf_editor.stats_panel[index].all_impressions);
}
// defer stats loading until the shell containing buzzfeed data
// has been returned by our controller
if ( !bf_editor.stats_shell_loaded && !bf_editor.secret_stats )
{
return setTimeout(bf_editor.fill_stats_panel_stats.bind({index: index}), 100);
}
else
{
var domain_template = new Template($F('referring-domain'));
var domain_html = bf_editor.stats_panel[index].domains.map(function(d){
if (d && d.total)
return domain_template.evaluate({
total: bf_editor.add_commas( d.total ),
domain: d.domain
});
}).join('');
$('domains-list' + index).update(domain_html);
var search_template = new Template($F('search-term'));
var search_html = bf_editor.stats_panel[index].search.map(function(d){
if (d && d.total)
return search_template.evaluate({
total: bf_editor.add_commas( d.total ),
query: d.query
});
}).join('');
$('search-terms-list' + index).update(search_html);
var stash = {};
// weekly numbers
stash['direct-week'] = bf_editor.stats_panel[index].week_impressions['0'].total;
stash['internal-week'] = bf_editor.stats_panel[index].week_impressions['1'].total;
stash['link-week'] = bf_editor.stats_panel[index].week_impressions['2'].total;
stash['search-week'] = bf_editor.stats_panel[index].week_impressions['3'].total;
stash['network-week'] = bf_editor.stats_panel[index].week_impressions['4'].total;
stash['total-week'] = stash['direct-week'] + stash['internal-week'] + stash['link-week'] + stash['search-week'] + stash['network-week'];
stash['viral-week'] = stash['direct-week'] + stash['link-week'] + stash['search-week'];
// today's numbers
stash['direct-today'] = bf_editor.stats_panel[index].week_impressions['0'].totals[6];
stash['internal-today'] = bf_editor.stats_panel[index].week_impressions['1'].totals[6];
stash['link-today'] = bf_editor.stats_panel[index].week_impressions['2'].totals[6];
stash['search-today'] = bf_editor.stats_panel[index].week_impressions['3'].totals[6];
stash['network-today'] = bf_editor.stats_panel[index].week_impressions['4'].totals[6];
stash['total-today'] = stash['direct-today'] + stash['internal-today'] + stash['link-today'] + stash['search-today'] + stash['network-today'];
stash['viral-today'] = stash['direct-today'] + stash['link-today'] + stash['search-today'];
// all time numbers
if (bf_editor.stats_panel[index].all_impressions)
{
stash['direct-all-time'] = bf_editor.stats_panel[index].all_impressions['0'].total;
stash['internal-all-time'] = bf_editor.stats_panel[index].all_impressions['1'].total;
stash['link-all-time'] = bf_editor.stats_panel[index].all_impressions['2'].total;
stash['search-all-time'] = bf_editor.stats_panel[index].all_impressions['3'].total;
stash['network-all-time'] = bf_editor.stats_panel[index].all_impressions['4'].total;
stash['total-all-time'] = stash['direct-all-time'] + stash['internal-all-time'] + stash['link-all-time'] + stash['search-all-time'] + stash['network-all-time'];
stash['viral-all-time'] = stash['direct-all-time'] + stash['link-all-time'] + stash['search-all-time'];
}
$('traffic-summary-body' + index).update((new Template($F('traffic-summary'))).evaluate(stash));
$('traffic-breakdown-body' + index).update((new Template($F('traffic-breakdown'))).evaluate(stash));
$('chart_image' + index).src = bf_editor.get_graph( bf_editor.stats_panel[index].week_impressions );
if(bf_editor.stats_panel[index].snapshot){
Element.setStyle('user-stats-snapshot-button',{display:'block'})
}
}
}
/*
* Returns url for google charts image
*/
this.get_graph = function(data) {
var type_names = ['1','4','2','3','0'];
var totals = {};
type_names.each( function($_) {
if ( typeof data[$_] == 'undefined' ) data[$_] = {};
if (!data[$_].totals)
data[$_].totals = [0,0,0,0,0,0,0];
if (!data[$_].total)
data[$_].total = 0;
});
var chd = [];
var chm = [];
var chco = []
var max_val = 0;
var i = 0;
var day_total = [0,0,0,0,0,0,0];
type_names.each(function($k){
i++;
if (data[$k].totals)
{
// duplicate each total 3 times like #1,#1,#1,#2,#2,#2
// find the min and max values along the way
var triples = data[$k].totals.map(function($_,index){
day_total[index] += $_;
$_ = day_total[index];
if ($_ > max_val)
max_val = $_;
return [$_,$_,$_].join(',');
});
chd.push( triples.join(',') );
}
else
{
empty_array = [];
for (j=0; j<21; j++)
{
empty_array.push(0);
}
chd.push( empty_array.join(',') );
}
});
return "http://chart.apis.google.com/chart?cht=ls&chs=170x105&chds=" + [0,max_val].join(',') +
"&chd=t:0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0|" + chd.join('|') +
"&chco=ffffff,0077ee,44bbff,ee3322,ff5544,ff7777&chm=b,0077ee,0,1,0|b,44bbff,1,2,0|b,ee3322,2,3,0|b,ff5544,3,4,0|b,ff7777,4,5,0&chf=bg,s,ffffff"
// OLD "&chco=ffffff,ee3322,ff6655,0077ee,6633ff,99bbee&chm=b,ee3322,0,1,0|b,ff6655,1,2,0|b,0077ee,2,3,0|b,6633ff,3,4,0|b,99bbee,4,5,0&chf=bg,s,ffffff"
}
this.add_commas = function(num) {
num += "";
num = num.replace(/(\d)(\d{3,3})?(\d{3,3})?(\d{3,3})?(\d{3,3})?(\d{3,3})?(\d{3,3})$/,"$1,$2,$3,$4,$5,$6,$7");
num = num.replace(/,{2,}/,",");
return num;
}
this.close_user_stats = function() {
bf_editor.stats_shell_loaded = false;
$$('#user_post_stats .bf_dialog_content').first().innerHTML = '
';
}
this.load_editor_in_dialog = function(e) {
var tag = e.target;
var tag_data = tag.getAttribute( 'rel:data' );
var tag_data_obj = eval( '('+ tag_data +')' );
var buzz_id = tag_data_obj.buzz_id;
var buzz_type = tag_data_obj.type;
BF_UI.showDialog('user_post_edit','Edit');
if (/^super.*/.test(buzz_type))
{
buzz_type = 'super';
window.location.href = BF_STATIC.web_root + '/post?id=' + buzz_id;
}
else
{
$('user_post_edit_iframe').setAttribute('src','/buzzfeed/editbuzz/'+buzz_type+'?id='+buzz_id+'&cb='+(new Date()).getTime());
}
}
// load_editor method for use with event_handler.js
this._load_editor_in_dialog = function(data) {
BF_UI.showDialog('user_post_edit','Edit');
var buzz_type = data.type;
if (/^super.*/.test(buzz_type))
buzz_type = 'super';
$('user_post_edit_iframe').setAttribute('src','/buzzfeed/editbuzz/'+buzz_type+'?id='+data.id+'&cb='+(new Date()).getTime());
}
this.load_editor = function( e ) {
if( bf_editor.poller.active ) {
alert( 'Please close the existing dialog before opening another.' );
return;
}
if ( e.event ) e = e.event;
var tag = e.target;
var tag_data = tag.getAttribute( 'rel:data' );
var tag_data_obj = eval( '('+ tag_data +')' );
var buzz_id = tag_data_obj.buzz_id;
var buzz_type = tag_data_obj.type;
var poller_id = (new Date()).getTime();
BF_Editor.editor_div_id = ''+poller_id;
var div_id = BF_Editor.editor_div_id;
var editor_div = $( div_id );
if ( !editor_div ) {
editor_div = document.createElement( 'div' );
editor_div.id = div_id;
bf_editor.bodyTag().appendChild( editor_div );
editor_div.className = 'qwik_edit';
var close_button = document.createElement('a');
close_button.className = 'close_editor';
close_button.update('
');
close_button.href = '#';
close_button.observe('click',function(e){
e.stop();
bf_editor.close_editor(e);}
);
editor_div.appendChild( close_button );
}
bf_editor.start_spinner();
var style = e.target.getAttribute('editor-style') ;
if ( !style ) style = 'terminal';
bf_editor.load_iframe(buzz_id, { style : style, type : buzz_type } );
bf_editor.poller.add_poller_callback(buzz_id,bf_editor.close_window);
var terminal_url = BF_STATIC.terminal_root_url;
terminal_domain = terminal_url.replace(/(http:\/\/.*?)\/.*/, "$1");
bf_editor.poller.start({
callback_string: buzz_id,
poll_url: terminal_domain + '/static/js/poller/cookie.js',
pollid: poller_id,
arguments: {id: div_id}
});
}
this.close_editor = function( e ) {
e.stop();
var div = $(BF_Editor.editor_div_id);
if( div ) {
div.parentNode.removeChild( div );
bf_editor.poller.stop_polling();
}
}
this.close_window = function( args ) {
if ( $(args.pollid) ) {
$(args.pollid).parentNode.removeChild($(args.pollid));
}
}
this.load_iframe = function(buzz_id, args) {
if ( !args ) {args = {style:'terminal'}};
var style = args.style ? args.style : 'terminal';
var type = args.type ? args.type : 'link';
var iframe_id = this.generate_id('iframe');
var iframe = $( iframe_id );
if( !iframe ) {
iframe = document.createElement( 'iframe' );
iframe.id = iframe_id;
$(BF_Editor.editor_div_id).appendChild( iframe );
iframe.observe( 'load', bf_editor.iframe_loaded );
iframe.className = 'qwik_edit';
}
iframe.style.display = 'none';
if ( style == 'terminal' ) {
iframe.setAttribute( 'src', BF_STATIC.terminal_root_url+'?editor=qwik_edit&buzz_id='+buzz_id+'&cb='+(new Date()).getTime() );
}
else {
var buzz_type = type;
if (/^super.*/.test(buzz_type))
buzz_type = 'super';
iframe.setAttribute( 'src', '/bf2/editbuzz/'+buzz_type+'?id='+buzz_id+'&cb='+(new Date()).getTime() );
}
}
this.iframe_loaded = function() {
bf_editor.stop_spinner();
$( bf_editor.generate_id( 'iframe' ) ).show();
// register click events
}
this.start_spinner = function() {
var spinner_id = this.generate_id('spinner');
var spinner = $( spinner_id );
if( ! spinner ) {
var spinner = document.createElement( 'div' );
spinner.id = spinner_id;
spinner.className = 'qwik_edit-spinner';
spinner.appendChild( document.createTextNode( 'Loading...' ) );
$(BF_Editor.editor_div_id).appendChild( spinner );
spinner.style.display = 'none';
}
var iframe = $( this.generate_id('iframe') );
if( iframe ) iframe.hide();
spinner.show();
}
this.stop_spinner = function() {
$(this.generate_id('spinner')).hide();
}
this.bodyTag = function() {
return document.getElementsByTagName( 'BODY' )[0];
}
this.generate_id = function( key ) {
return BF_Editor.editor_div_id + '_' + key;
}
}
BF_Editor.editor_div_id = '_editor_div_' + Math.random() * 100000;
bf_editor = new BF_Editor();
// load editor with priority 1
BuzzLoader.register( function() { bf_editor.init(); }, 1 );
window.setTimeout( function(){if(typeof bf_editor.poller=='undefined'){bf_editor.init();}}, 3000);