var base_dir = 'http://www.techcrunch.com/wp-content/cb_widget/';

var top_image_preload = new Image();
top_image_preload.src = base_dir+'cb_widget_top_min.png';
var toggle_image_preload = new Image();
toggle_image_preload.src = base_dir+'cb_widget_toggle_min.png';

var cb_widgets = new Array();
var cb_widgets_pieces = new Array();
var cb_widgets_loaded = false;
var cb_widgets_toggle_indicator = false;

function cb_widget_report_widget(element_id)
{
	var index = cb_widgets.length;
	cb_widgets[index] = element_id;
}

function cb_widget_report_element(element_id,company)
{
	var index = cb_widgets_pieces.length;
	cb_widgets_pieces[index] = new Array();
	cb_widgets_pieces[index][0] = element_id;
	cb_widgets_pieces[index][1] = company;
}

function load_cb_widgets()
{
	if(!cb_widgets_loaded)
	{
		cb_widgets_loaded = true;
	
		if(cb_widgets_toggle_indicator)
		{
			cb_widgets_toggle();
		}
	
		var first_pair = true;
		var pairs = '';
	
		for(var i=0; i<cb_widgets_pieces.length; i++)
		{
			if(first_pair)
				first_pair = false;
			else
				pairs += ';';
				
			pairs += cb_widgets_pieces[i][0]+','+cb_widgets_pieces[i][1];	
		}
		
		if(pairs)
		{
			var ajax = initAjax();
			ajax.open('GET',base_dir+'company_feed.php?timeStamp='+new Date().getTime()+'&c='+pairs,true);
			ajax.onreadystatechange = function() { load_cb_widgets_callback(ajax) };
			ajax.send(null);
		}
	}
}

function load_cb_widgets_callback(ajax)
{
	if(ajax.readyState == 4)
	{
		if(ajax.status == 200)
		{
			var xml = ajax.responseXML;
			var companies = xml.getElementsByTagName('company');
			
			for(var i=0; i<companies.length; i++)
			{
				if(companies[i].childNodes.length)
				{
					//var name = elementText(companies[i].getElementsByTagName('name')[0]);
					var cb_url = elementText(companies[i].getElementsByTagName('cb_url')[0]);
					var logo_url = elementText(companies[i].getElementsByTagName('logo_url')[0]);
					var url = elementText(companies[i].getElementsByTagName('url')[0]);
					var city = elementText(companies[i].getElementsByTagName('city')[0]);
					var founded = elementText(companies[i].getElementsByTagName('founded')[0]);
					var investments = elementText(companies[i].getElementsByTagName('investments')[0]);
					var acquisition = elementText(companies[i].getElementsByTagName('acquisition')[0]);
					var overview = elementText(companies[i].getElementsByTagName('overview')[0]);
					var element_id = elementText(companies[i].getElementsByTagName('element_id')[0]);
					var logo_height = elementText(companies[i].getElementsByTagName('logo_height')[0]);
					var logo_width = elementText(companies[i].getElementsByTagName('logo_width')[0]);
					
					
					var body_element = $(element_id);
					
					if(body_element)
					{
						
						body_element.style.padding = '0px';
					
						var element = document.createElement('div');
						element.className = 'cb_widget_content_info';
					
						removeChildren(body_element);
						
						if(logo_url)
						{
							var logo_link = document.createElement('a');
							logo_link.href = cb_url;
							
							var logo = document.createElement('img');
							logo.src = logo_url;
							logo.className = 'cb_widget_content_logo';
							logo.style.width = logo_width+'px';
							logo.style.height = logo_height+'px';
							logo_link.appendChild(logo);
							
							body_element.appendChild(logo_link);
						}
					
						if(url)
						{
							var factoid_div = document.createElement('div');
							factoid_div.className = 'cb_widget_content_factoid';
							
							var factoid_div_label = document.createElement('span');
							factoid_div_label.className = 'cb_widget_content_factoid_label';
							factoid_div_label.innerHTML = 'Website: ';
							factoid_div.appendChild(factoid_div_label);
							
							var factoid_div_content = document.createElement('span');
							factoid_div_content.innerHTML = '<a href="'+url+'">'+url+'</a>';
							factoid_div.appendChild(factoid_div_content);
							
							element.appendChild(factoid_div);
						}
						
						if(city)
						{
							var factoid_div = document.createElement('div');
							factoid_div.className = 'cb_widget_content_factoid';
							
							var factoid_div_label = document.createElement('span');
							factoid_div_label.className = 'cb_widget_content_factoid_label';
							factoid_div_label.innerHTML = 'Location: ';
							factoid_div.appendChild(factoid_div_label);
							
							var factoid_div_content = document.createElement('span');
							factoid_div_content.innerHTML = city;
							factoid_div.appendChild(factoid_div_content);
							
							element.appendChild(factoid_div);
						}
						
						if(founded)
						{
							var factoid_div = document.createElement('div');
							factoid_div.className = 'cb_widget_content_factoid';
							
							var factoid_div_label = document.createElement('span');
							factoid_div_label.className = 'cb_widget_content_factoid_label';
							factoid_div_label.innerHTML = 'Founded: ';
							factoid_div.appendChild(factoid_div_label);
							
							var factoid_div_content = document.createElement('span');
							factoid_div_content.innerHTML = founded;
							factoid_div.appendChild(factoid_div_content);
							
							element.appendChild(factoid_div);
						}
						
						if(investments && !acquisition)
						{
							var factoid_div = document.createElement('div');
							factoid_div.className = 'cb_widget_content_factoid';
							
							var factoid_div_label = document.createElement('span');
							factoid_div_label.className = 'cb_widget_content_factoid_label';
							factoid_div_label.innerHTML = 'Total Funding: ';
							factoid_div.appendChild(factoid_div_label);
							
							var factoid_div_content = document.createElement('span');
							factoid_div_content.innerHTML = investments;
							factoid_div.appendChild(factoid_div_content);
							
							element.appendChild(factoid_div);
						}
						
						if(acquisition)
						{
							var factoid_div = document.createElement('div');
							factoid_div.className = 'cb_widget_content_factoid';
							
							var factoid_div_label = document.createElement('span');
							factoid_div_label.className = 'cb_widget_content_factoid_label';
							factoid_div_label.innerHTML = 'Acquisition Price: ';
							factoid_div.appendChild(factoid_div_label);
							
							var factoid_div_content = document.createElement('span');
							factoid_div_content.innerHTML = acquisition;
							factoid_div.appendChild(factoid_div_content);
							
							element.appendChild(factoid_div);
						}
						
						if(overview)
						{
							var overview_div = document.createElement('div');
							overview_div.className = 'cb_widget_content_desc';
							
							if(cb_url)
								overview_div.innerHTML = overview+' <a href="'+cb_url+'">Learn more</a>';
							else
								overview_div.innerHTML = overview;
		
							element.appendChild(overview_div);
						}
						
						body_element.appendChild(element);
					}
				}
				else
				{				
					var element = $(element_id);
					
					if(element)
					{
						removeChildren(element);
						element.innerHTML = '<div class="cb_widget_loading">Sorry, information about this company could not be loaded. Please <a href="mailto:admin@techcrunch.com">email us</a> if this occurs repeatedly.</div>';
					}
				}
			}
		}
	}
}


function cb_widget_toggle(element_id)
{
	var widget = $(element_id);
	
	if(!widget.getAttribute('toggle') || widget.getAttribute('toggle') == 'on')
	{
		widget.setAttribute('toggle','off');
		var toggle = 'off';
		var display = 'none';
		var top_image = base_dir+'cb_widget_top_min.png';
		var toggle_image = base_dir+'cb_widget_toggle_min.png';
	}
	else
	{
		widget.setAttribute('toggle','on');
		var toggle = 'on';
		var display = 'block';
		var top_image = base_dir+'cb_widget_top.png';
		var toggle_image = base_dir+'cb_widget_toggle_max.png';
	}
	
	widget.style.backgroundImage = 'url('+top_image+')';
	
	var children = widget.childNodes;
	for(var i=0; i < children.length; i++)
	{
		if(children[i] && children[i].style)
		{
			if(children[i].className == 'cb_widget_toggle')
				children[i].style.backgroundImage = 'url('+toggle_image+')';
			else
				children[i].style.display = display;
		}
	}
	
	var ajax = initAjax();
	ajax.open('GET',base_dir+'cb_widget_toggle.php?timeStamp='+new Date().getTime()+'&toggle='+toggle,true);
	ajax.send(null);
}

function cb_widgets_toggle()
{
	for(var i=0; i<cb_widgets.length; i++)
	{
		cb_widget_toggle(cb_widgets[i]);
	}
}



 

/**
 * Shorthand function for document.getElementById().
 * @param {String} element_id Element ID
 * @return Element object
 */
function $(element_id)
{
	return document.getElementById(element_id);
}

/**
 * Stops the propogation of an event to prevent unwanted consequences.
 * @param {Object} event Event object
 */
function stopPropagation(event)
{
	if(!event)
		var event = window.event;

	if(event.stopPropagation) 
		event.stopPropagation();
	else if(window.event.cancelBubble == false) 
		window.event.cancelBubble = true;
}

/**
 * Removes all the children nodes of an element.
 * @param {Object} element Element object
 */
function removeChildren(element)
{
	if(element)
	{
		var children = element.childNodes;
		var children_length = children.length; 
	
		for(var i=0; i<children_length; i++)
		{
			element.removeChild(children[i]);
		}
	}
}

/**
 * Returns the first "real" (non-whitespace) element of an element.
 * @param {Object} parent Element object
 * @return Element or null
 */
function firstElement(parent)
{
	var children = parent.childNodes;
	for(var i=0; i < children.length; i++)
	{
		if(children[i].nodeType == '1')
			return children[i];
	}
	return null;
}

/**
 * Returns the text contained within an element.
 * @param {Object} parent Element object
 * @return Element or null
 */
function elementText(parent)
{
	var children = parent.childNodes;
	for(var i=0; i < children.length; i++)
	{
		if(children[i].nodeType == '3')
			return children[i].nodeValue;
	}
	return null;
}

/**
 * Appends one element to another as a node.
 * @param {Object} parent Element object to be appended
 * @param {Object} target Element object that will be appended to
 */
function appendNode(parent,target)
{
	if(parent.nodeType == 1)
	{
		var node = document.createElement(parent.tagName);

		if(parent.attributes)
		{
			for(var i=0; i<parent.attributes.length; i++)
				setNodeAttribute(node,parent.attributes[i].name,parent.attributes[i].value);
		}

		if(parent.hasChildNodes())
		{
			for(var i=0; i<parent.childNodes.length; i++)
				appendNode(parent.childNodes[i],node);
		}

		target.appendChild(node);
	}
	else if(parent.nodeType == 3)
	{
		var node = document.createTextNode(parent.nodeValue);
		target.appendChild(node);
	}
}

/**
 * Sets the value of a node's attribute.
 * NOTE: This function is mostly useful for its "special case" attribute assignments and should be reviewed thoroughly. These special case assignments are those that don't work through normal means with one or more browsers.
 * @param {Object} node Element object
 * @param {String} attribute_name Attribute name
 * @param {String) attribute_value New attribute value
 */
function setNodeAttribute(node,attribute_name,attribute_value)
{
	if(attribute_name == 'href' || attribute_name == 'onclick' || attribute_name == 'onClick')
	{
		attribute_value = attribute_value.replace(/&amp;/g,'&');
		attribute_value = attribute_value.replace(/&#38;/g,'&');
	}
	
	if(attribute_name == 'class')
		node.className = attribute_value;
	else if(attribute_name == 'style')
		node.style.cssText = attribute_value;
	else if(attribute_name == 'colspan')
		node.colSpan = attribute_value;
	else if(attribute_name == 'valign')
		node.vAlign = attribute_value;
	else if(attribute_name == 'onClick' || attribute_name == 'onclick')
		node.onclick = function(event) { eval(attribute_value); };
	else if(attribute_name == 'onMouseOver' || attribute_name == 'onmouseover')
		node.onmouseover = function(event) { eval(attribute_value); };
	else if(attribute_name == 'onChange' || attribute_name == 'onchange')
		node.onchange = function(event) { eval(attribute_value); };
	else if(attribute_name == 'onMouseOut' || attribute_name == 'onmouseout')
		node.onmouseout = function(event) { eval(attribute_value); };
	else if(attribute_name == 'onMouseDown' || attribute_name == 'onmousedown')
		node.onmousedown = function(event) { eval(attribute_value); };
	else if(attribute_name == 'onMouseUp' || attribute_name == 'onmouseup')
		node.onmouseup = function(event) { eval(attribute_value); };
	else
		node.setAttribute(attribute_name,attribute_value);
}

/**
 * This appends a node to an element before another node already in that element.
 * @param {Object} parent Element object to be appended
 * @param {Object} target Element object that will be appended to
 * @param {Object} sub_target Element object within the target before which should be appended the parent
 */
function appendNodeBefore(parent,target,sub_target)
{
	var temp_container = document.createElement('div');
	appendNode(parent,temp_container);
	target.insertBefore(temp_container.firstChild,sub_target);
}

/**
 * Returns the target of an event (element clicked on, moved over, etc.)
 * @param {Object} event Event object
 * @return Element object
 */
function getEventTarget(event)
{
	var target;

	// Gecko
	if(event.target)
		target = event.target;
	// IE
	else if(event.srcElement)
		target = event.srcElement;
	
	// Fix for Safari bug
	if(target && target.nodeType == 3)
		target = target.parentNode;

	return target;
}

/**
 * Returns the related target of an event (for example, element just left by cursor [for mouseover events] or just entered by cursor [for mouseout events])
 * @param {Object} event Event object
 * @return Element object
 */
function getEventRelatedTarget(event)
{
	var related_target;

	// Gecko
	if(event.relatedTarget)
		related_target = event.relatedTarget;
	// IE
	else if(event.toElement)
		related_target = event.toElement;
	else if(event.fromElement)
		related_target = event.fromElement;
	
	// Fix for Safari bug
	if(related_target && related_target.nodeType == 3)
		related_target = related_target.parentNode;

	return related_target;
}


/**
 * Generate an XMLHttpRequest object.
 * @return XMLHttpRequest object.
 */
function initAjax()
{
	if(window.XMLHttpRequest)
		return new XMLHttpRequest();
	else if(window.ActiveXObject)
		return new ActiveXObject("Microsoft.XMLHTTP");
}

