// dale_utils.js

// Add array push function
if (typeof Array.prototype.push == 'undefined')
{
	Array.prototype.push = function () {
		var i=0, b=this.length, a=arguments;
		for (i; i<a.length;i++)
		{
			this[b+i]=a[i];
		}
		return this.length;
	};
}

// trim
function trim(str)
{
	return str.replace(/^\s*|\s*$/g,"");
}

// Gets the child elements of a certain tag and type from a dom object.
function getElementsByClassName(dom, tag_name, class_name)
{
	var classRE = new RegExp('\\b'+class_name+'\\b');
	var results = [];
	var temp_tags = dom.getElementsByTagName(tag_name);
	for (var i=0; i < temp_tags.length; i++)
	{
		if (classRE.test(temp_tags[i].className))
		{
			results.push(temp_tags[i]);
		}
	}
	return results;
}

function getElementsByTagAndClass(dom, tag_name, class_name)
{
	if (typeof(tag_name) == 'undefined' || tag_name == null )
	{
		tag_name = '*';
	}
	var children = (dom.getElementsByTagName(tag_name) 
		|| dom.all);

	var results = [];
	var count = 0;
	for (var i=0; i < children.length; i++)
	{
		var child = children[i];
		var classNames = child.className.split(" ");
		for (var j=0; j < classNames.length; j++)
		{
			if (classNames[j] == class_name)
			{
				results[count] = child;
				count++;
				break;
			}
		}
	}
	return results;
}
addClassName = 
function (obj, className)
{
	var cls = obj.className;
	if (!cls)
	{
		obj.className = className;
		return true;
	}
	if (cls == className)
	{
		return false;
	}
	var classes = obj.className.split(" ");
	for (var i = 0; i < classes.length; i++)
	{
		if (classes[i] == className)
		{
			return false;
		}
	}
	obj.className = (cls + " " + className);
	return true;
}

removeClassName =
function (obj, className)
{
	var cls = obj.className;
	if (cls.length == 0)
	{
		return false;
	}
	if (cls == className)
	{
		obj.className = "";
		return true;
	}
	var new_classes = [];
	var classes = obj.className.split(" ");
	var count = 0;
	for (var i=0; i < classes.length; i++)
	{
		if (classes[i] != className)
		{
			new_classes[count] = classes[i];
			count++;
		}
	}
	obj.className = new_classes.join(" ");
	return true;
}
// Creates a javascript object from a <dl>. The <dt>'s function as the
// property name while the <dd>'s the value.
// Exmaple: <dl id="dbml_obj">
//				<dt>Word</dt>
//					<dd>Some value for Word</dd>
//				<dt>some_key</dt>
//					<dd>some value</dd>
//			</dl>
//			This gets turned into { 'Word': 'Some value for Word', 'some_key': 'some value' }
//			So ...
//			var temp = document.getElementById("dbml_obj");
//			var result = createDBObject(temp);
//			alert(result.Word);
//			would popup "Some value for Word"
function createDBObject(dbml_dl)
{
	var dbml_object = new Object();
	dt_list = dbml_dl.getElementsByTagName("dt");
	dd_list = dbml_dl.getElementsByTagName("dd");
	for (var i=0; i<dt_list.length; i++)
	{
		// IE adds a white space for innerHTML. Trim both sides
		var key = trim(dt_list[i].innerHTML);
		var value = dd_list[i].innerHTML;

		// Encode the html entity &amp; into &.
		value = value.replace(/\&amp;/g,"&");

		// Add property to dbObject
		if (value == "")
			value = "&nbsp;";
		dbml_object[key] = value;
		// If this key is the image href, create an Image object from it.
		if (key == 'image_href')
		{
			dbml_object["image"] = new Image();
			dbml_object["image"].loaded = false;
			dbml_object["image"].onload = function() {this.loaded = true;};
			dbml_object["image"].src = value;
		}
	}
	return dbml_object;
}
// Take in a dom object and a dbObject. Populates the dom object based on the classname of it's children
function render_object(dbObject, node)
{
	var fakeNode = {};
	fakeNode.childNodes = [node];
	_render_object(dbObject,fakeNode,true);
}

function _render_object(dbObject, node, first_run)
{
	var cList = node.childNodes;
	for (var i=0; i < cList.length; i++)
	{
		var recursion_flag = true;
		var oChild = cList[i];
		// Get an array of class names for this child
		var classList = [];
		if (oChild.className)
		{
			classList = oChild.className.split(' ');
		}

		for (var j=0; j < classList.length; j++)
		{
			c_name = classList[j];
			if(dbObject)
			{
				if (dbObject[c_name])
				{
					if (c_name == 'image')
					{
						oChild.src = dbObject[c_name].src;
					}
					else if (c_name == 'link')
					{
						oChild.href = dbObject[c_name];
					}
					else if (c_name == 'links')
					{
						oChild.innerHTML = dbObject[c_name];
					}
					else if (c_name == 'downloads')
					{
						oChild.innerHTML = dbObject[c_name];
					}
					else 
					{
						oChild.innerHTML = dbObject[c_name];
					}
				}
				else if (c_name == 'article_viewer' && !first_run)
				{
					recursion_flag = false;
				}
				else if (c_name == 'image_viewer')
				{ // image_viewer is not a property of dbObject
					var image_obj = dbObject['image'];
					var viewer_obj = oChild;
					var func = function () {
						if (image_obj.loaded)
						{
							magic_resize(viewer_obj, dbObject['image']);
						}
						else 
						{
							setTimeout(func, 50);
						}
					}
					func();
				}
			}
		}
		// Recursion is used since childNodes returns only nodes from 1 depth lower.
		if (recursion_flag)
		{
			_render_object(dbObject, oChild, false);
		}
	}
}

magic_resize =
function (viewer, image)
{
	// the actual image tag inside of the image viewer
	// Will use the first one found, but there should only
	// be one img as it stands.
	var viewer_image = viewer.getElementsByTagName('img')[0];

	// Variables to hold dimensions
	var v_height, v_width;
	var i_height, i_width;

	// Get the Viewer dimensions
	if (viewer.offsetHeight) 
	{
		v_height = viewer.offsetHeight;
		v_width = viewer.offsetWidth;
	}
	else if (viewer.style.pixelHeight)
	{
		v_height = viewer.pixelHeight;
		v_width = viewer.pixelWidth;
	}
	
	// Get image dimensions
	i_height = image.height;
	i_width = image.width;
	
	// Varibles to hold ratios
	var v_ratio = v_width / v_height;
	var i_ratio = i_width / i_height;
	
	if (i_ratio > v_ratio)
	{// Image has a wider aspect

		viewer_image.width = v_width;
		viewer_image.height = v_width / i_ratio;
	}
	else if (i_ratio < v_ratio)
	{// Image has a skinnier aspect

		viewer_image.height = v_height;
		viewer_image.width = v_height * i_ratio;
	}
	else 
	{ // Image has same aspect
		viewer_image.height = v_height;
		viewer_image.width = v_width;
	}

	var temp_image = new Image(viewer_image.width, viewer_image.height);
	temp_image.src = image.src;
	viewer_image.parentNode.replaceChild(temp_image,viewer_image);	
//	viewer_image.src = image.src;
};	

/* Cookie Stuff */
function createCookie(name,value,days)
{
	if (days)
	{
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name)
{
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++)
	{
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name)
{
	createCookie(name,"",-1);
}
