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('x'); 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);