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 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',bf_editor.load_editor);
				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();
			} );
		}
		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 his buzz (eg not someone else's contribution to his 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);
				});
			}

			if (userinfo && userinfo.p_access_stats == 'true')
			{
				$$('.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_quickpost = function(e) {
		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 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 cb = Math.round(new Date().getTime() / (1000 * 60 * 15));

		var buzz_request_path = BF_STATIC.web_root + "/prostats/" + user_info.username + "/" + buzz_info.buzz_id + "/" + cb + "?csk=" + user_info.session_key;
		var cloud_request_path = Cloud.report + '/cloud/panel?wrapper='+escape("bf_editor.fill_stats_panel_stats(%25%25)")+'&buzzid=' + buzz_info.buzz_id + "&cb=" + cb;
		var snapshot_request_path = BF_STATIC.web_root + '/stats_snapshot/' + buzz_info.buzz_id + '/' + escape("bf_editor.fill_stats_panel_stats(%25%25)") + "?csk=" + user_info.session_key;

		
		bf_editor.stats_shell_loaded = false;

		BF_XSS.swift_injection( cloud_request_path );	
		BF_XSS.swift_injection( snapshot_request_path );	


		new Ajax.Request(buzz_request_path, {
			method: 'get',
			onSuccess: bf_editor.fill_stats_panel_shell
		});

		BF_UI.showDialog('user_post_stats', 'Stats');
	}
	

	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;
	
		
	};

	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);
			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
			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'})
			}
		}
		
	}
	
	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 = '<img src="' + BF_STATIC.static_root + '/images/public/spinners/loading.gif">';
		
	}
	
	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');
		$('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');
		$('user_post_edit_iframe').setAttribute('src','/buzzfeed/editbuzz/'+data.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;
		}
		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('<img src="http://s.buzzfeed.com/static/images/public/spinners/closebox.png" alt="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 {
			iframe.setAttribute( 'src', '/bf2/editbuzz/'+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 );

