/* standard extraction of a (supposed repeated array of nodes of the same tagname) to an JS array of objects */
function processXMLNodes(xmldom, roottagname)
{
	var obj = {};
	obj[roottagname] = [];
	
	var root = xmldom.getElementsByTagName(roottagname)[0];

	if (!root) {
		return obj;
	}

	for (var i=0; i< root.attributes.length; i++) {
		obj[root.attributes[i].name] = root.attributes[i].value;
	}
	
	for (var i=0; i<root.childNodes.length;i++) {
		if (root.childNodes[i].nodeType==1) {
			obj[roottagname].push(processXMLNode(root.childNodes[i]));
		}
	}
	
	return obj;
	
}

/* very crude processing of XML DOM fragment to JS Object */
function processXMLNode(xmlobj)
{
	var obj = {};

	for (var i=0; i< xmlobj.attributes.length; i++) {
		obj[xmlobj.attributes[i].name] = xmlobj.attributes[i].value;
	}

	if (xmlobj.childNodes) {
		for (var i=0; i<xmlobj.childNodes.length; i++) {
			child = xmlobj.childNodes[i];
			if (child.tagName) {
				if (child.firstChild) {
					if (child.firstChild.nodeType==1 || child.childNodes.length>1) {
						obj[child.tagName] = processXMLNode(child);
					} else {
						obj[child.tagName] = child.firstChild.data;
					}
				} else {
					obj[child.tagName] = '';
				}
			} 
		}
	} 
	
	return obj;
}

function constrainBox(width, height, boxWidth, boxHeight)
{
	width = parseInt(width);
	if (isNaN(width)) width = 0;
	height = parseInt(height);
	if (isNaN(height)) height = 0;
	boxWidth = parseInt(boxWidth);
	if (isNaN(boxWidth)) boxWidth = 0;
	boxHeight = parseInt(boxHeight);
	if (isNaN(boxHeight)) boxHeight = 0;
	
	var ret = { width: boxWidth, height: boxHeight };
	if (height<1 || width<1 || boxWidth<1 || boxHeight<1) return ret;

	var aspect = width / height;
	var boxAspect = boxWidth / boxHeight;
	
	if (aspect>=boxAspect) {
		ret.height = Math.floor(ret.width / aspect);
	} else {
		ret.width = Math.floor(ret.height * aspect);
	}

	return ret;
}

function imageNext()
{
	if (!current_image || !detail_work_media) {
		alert("Error A");
		return false;
	}
	
	if (current_image==detail_work_media.length) {
		alert("Error B");
		return false;
	}
	
	if (detail_work_media[current_image-1]) {
		var media_id = detail_work_media[current_image-1].media_id;
		switchPlugin(media_id, false);
	}
 	current_image++;
	updateWindow();
	return false;
}

function imagePrev()
{
	if (!current_image || !detail_work_media) {
		alert("Error C");
		return false;
	}

	if (current_image==1) {
		alert("Error D");
		return false;
	}
	
	if (detail_work_media[current_image-1]) {
		var media_id = detail_work_media[current_image-1].media_id;
		switchPlugin(media_id, false);
	}
	current_image--;
	updateWindow();
	return false;
}

function getImages()
{
	var url='/shared/mediadb/getMedia?work_id=' + detail_work_id +'&mediadb_type=' + detail_mediadb_type;
	new Ajax.Request(url, {onSuccess: parseImages});
}

function getMediaDetail()
{
	var url='/shared/mediadb/getMediaDetail?media_id=' + detail_media_id;
	new Ajax.Request(url, {onSuccess: parseMediaDetail});
}

function parseImages(req)
{
	detail_work_media = [];
	detail_media_idx = {};

	try {
		var media = eval('(' + req.responseText + ')');
		for (var i=0; i<media.length; i++) {
			detail_work_media.push(media[i]);
			detail_media_idx[media[i].media_id] = media[i];
		}

	} catch (e) {
		DAAP.log("Error loading images: " + e);
	}
	
	createNavLinks();
	updateWindow();
}

function parseMediaDetail(req)
{
    var xml = req.responseXML;
	var xml_media = xml.getElementsByTagName('media');
        
	detail_work_media = [];
	detail_media_idx = {};
		
	for (var i=0; i<xml_media.length; i++) {
		var media = processXMLNode(xml_media[i]);
		detail_work_media.push(media);
		detail_media_idx[media.media_id] = media;
		current_image = media.index;
		switchPlugin(media.media_id, true);
	}
}

function createNavLinks()
{
	if (!$('image_next')) {
		var link = document.createElement('a');
		link.style.display='none';
		link.id = 'image_next';
		var img = document.createElement('img');
		link.appendChild(img);
		img.src = next_image_url;
		img.alt='next';
		
		$('nav_next').appendChild(link);
	}

	$('image_next').href="#";
	$('image_next').onclick=imageNext;
	
	if (!$('image_prev')) {
		var link = document.createElement('a');
		link.style.display='none';
		link.id = 'image_prev';
		var img = document.createElement('img');
		link.appendChild(img);
		img.src = prev_image_url;
		img.alt='previous';

		$('nav_prev').appendChild(link);
	}

	$('image_prev').href="#";
	$('image_prev').onclick=imagePrev;
}

function initDetail()
{
	if (!$('media_frame')) {
		return false;
	}
	
	var divs = $('media_frame').getElementsByTagName('div');
	
	for (var i=0;i<divs.length; i++) {
		var div = divs[i];
		if (re=div.id.match(/media_([TBa-z0-9][a-f0-9]{31})/)) {
			detail_media_id = re[1];
			getMediaDetail();
			return true;
		} else {	
			alert(div.id);
		}
	}
	
	
}

function initGallery()
{
	if ($('media_frame')) {
		initDetail();
	}

	if (!$('gallery_image_window')) {
		return false;
	}
	
	var image_container = $('gallery_image_window').getElementsByTagName('div')[0];
	
	if (!image_container) {
		return false;
	}

	if (re = image_container.id.match(/gallery_images_(.+)_(\d+)/)) {
		detail_work_id = re[1];
		detail_mediadb_type = parseInt(re[2]);
	} else {
		return false;
	}
	
	var divs = image_container.getElementsByTagName('div');
	
	for (var i=0;i<divs.length; i++) {
		var div = divs[i];
		if (re=div.id.match(/gallery_image(\d+)/)) {
			div.idx = parseInt(re[1]);
			if (clre=div.className.match(/(mediadb_.*)/)) {	
				div.mediafile_type = clre[1];
			} else {
				return false;
			}
			
			current_image = div.idx;
			div.style.left=((div.idx-1)*image_gallery_width) + image_gallery_units;
			image_container.style.left= '-'+((div.idx-1)*image_gallery_width) + image_gallery_units;
			getImages();
			return true;
		} 
	}
	
	return false;
}

function insertImage(idx)
{
	if (!idx || !detail_work_media[idx-1]) {
		return false;
	}

	var image_container = $('gallery_images_' + detail_work_id + '_' + detail_mediadb_type);
	
	if (!image_container) {
		return false;
	}

	
	if (!$('gallery_image'+idx)) {
	
		//clone the current node (don't include children yet) set some variables
		var new_div = $('gallery_image'+ current_image).cloneNode(false);
		new_div.id = 'gallery_image'+idx;
		new_div.idx = idx;
		new_div.style.left=((new_div.idx-1)*image_gallery_width) + image_gallery_units;
		new_div.mediafile_type = detail_work_media[idx-1].mediafile_type;
		
		
		//put the container in the window
		beforeIdx = idx+1;
		
		if ($('gallery_image'+beforeIdx)) {
			//the image that will be next is there so insert before has an answer
			image_container.insertBefore(new_div, $('gallery_image'+beforeIdx));
		} else if (idx==detail_work_media.length) {
			//it's the last one so put it at the end;
			image_container.appendChild(new_div);
		} else {
			var divs = image_container.getElementsByTagName('div');
			
			for (var i=0;i<divs.length; i++) {
				if (divs[i].idx>idx) {
					return image_container.insertBefore(new_div, divs[i]);
				}
			}
			image_container.appendChild(new_div);
		}

		var url = detail_work_media[idx-1].media_url+'detailXML?idx=' + idx;
		if (image_gallery_derivative) {
			url += '&detailDerivative=' + image_gallery_derivative;
		}
		new Ajax.Request(url, {onSuccess: updateImage});
		
	} 
	
	return true;
}

function updateImage(req)
{
	var html = req.responseText;
	if (html) {
		var div = document.createElement('div');
		div.innerHTML = html;
		if (div.firstChild) {
			var idx = parseInt(div.firstChild.getAttribute('idx'));
			if (isNaN(idx)) {
				return false;
			}

			if ($('gallery_image'+idx)) {
				$('gallery_image'+idx).innerHTML = html;
				var media_id = detail_work_media[idx-1].media_id;
				switchPlugin(media_id, false);
			} else {
			}
		} else {
		}
	}
}

function switchPlugin(media_id, mode)
{
	if (!$('media_' + media_id)) {
		return false;
	}

	var div_id = 'media_' + media_id;
	var base_url = '/shared/media/';

			
	if (detail_media_idx[media_id]) {
		var idx = parseInt(detail_media_idx[media_id].index)+1;
	} else {
		return false;
	}
	
	var media = detail_work_media[idx-1];
	

	
	var divs = $(div_id).parentNode.getElementsByTagName('div');
	var FO = false;

	for (var i=0; i<divs.length; i++) {
		switch (divs[i].className)
		{
			case 'media':
				var box = constrainBox(media.media_width, media.media_height, image_gallery_width, image_gallery_height);

				var FO =  { 
					movie:"/shared/mediaplayer.swf",
					width:box.width,
					height:box.height,
					majorversion:"7",
					build:"0",
					scale:"showall",
					wmode:"opaque",
					allowfullscreen:"false",
					flashvars:"overstretch=true"
				};
				

				switch (media.mediafile_object)
				{
					case 'mediadb_swffile':
						FO.movie = base_url + media_id + "/orig.swf";
						FO.flashvars = "";
						break;
					case 'mediadb_videofile':
						FO.movie="/shared/mediaplayer.swf";
						FO.flashvars += "&file=" + base_url + media_id + "/video_h264/detail.m4v";
						break;
					case 'mediadb_audiofile':
						FO.movie="/shared/mp3player.swf";
						FO.flashvars += "&file=" + base_url + media_id + "/origmp3/detail.mp3";
						break;

					case 'mediadb_pdffile':
						FO = false;
						divs[i].style.display ='none';
						break;

					default:
						FO = false;
						divs[i].style.display ='block';
				}
				
				if (FO) {
					divs[i].style.display = mode ? 'block' : 'none';
					$(divs[i]).innerHTML='';
				}
				
				break;
				
			case 'media_proxy':
				switch (media.mediafile_object)
				{
					case 'mediadb_swffile':
					case 'mediadb_videofile':
					case 'mediadb_audiofile':
						divs[i].style.display = mode ? 'none' : 'block' ;
						break;

					case 'mediadb_pdffile':
						divs[i].style.display = 'block';
						break;

					default:
						divs[i].style.display = 'none';
						break;
				}
				
				var imgs = divs[i].getElementsByTagName('img');
				if (imgs[0]) {
					var proxy_url = imgs[0].src;
				}
				break;
			default:
				break;
		}
	}
	
	if (FO) {
		if (proxy_url) {
			FO.flashvars+='&image=' + proxy_url
		}
		UFO.create(	FO, div_id);
	}

}

function updateWindow()
{
	if (!$('gallery_image'+ current_image)) {
		return false;
	}
	
	var image_prev = current_image > 1 ? current_image-1 : false;
	var image_next = current_image < detail_work_media.length ? current_image+1 : false;
	
	if (image_prev) insertImage(image_prev);
	if (image_next) insertImage(image_next);
	
	moveWindow(current_image);
	var media_data = detail_work_media[current_image-1];
	if (detail_work_media.length>1) {
		$('nav_count').innerHTML=current_image + '/' + detail_work_media.length;
	} else {
		$('nav_count').innerHTML='';
	}
	
	if ($('gallery_image_title')) {
		$('gallery_image_title').innerHTML=media_data.media_title;
	}
	
	if ($('gallery_image_desc')) {
		$('gallery_image_desc').innerHTML=media_data.media_description;
	}
	
	if ($('gallery_image_type')) {
		$('gallery_image_type').innerHTML=media_data.mediafile_typename;
	}
	
	if ($('gallery_image_rights')) {
		$('gallery_image_rights').innerHTML=media_data.media_rights_holder ? '<label>Rights holder:</label> ' + media_data.media_rights_holder : '';
	}

	if ($('gallery_image_creator')) {
		$('gallery_image_creator').innerHTML=media_data.media_creator ? '<label>Reproduction creator:</label> ' + media_data.media_creator : '';
	}

	if ($('gallery_image_creator')) {
		$('gallery_image_creator').innerHTML=media_data.media_creator ? '<label>Reproduction creator:</label> ' + media_data.media_creator : '';
	}

	if ($('gallery_image_date')) {
		var create_date;
		if (create_date = new Date(media_data.media_creation_date*1000)) {
			$('gallery_image_date').innerHTML='<label>Reproduction created:</label>' + create_date.formatDate('F n, Y');
		} else {
			$('gallery_image_date').innerHTML='';
		}
	}
	
	
	
	if ($('gallery_image_dims')) {
		if (media_data.media_duration_string) {
			$('gallery_image_dims').innerHTML= "Duration: " + media_data.media_duration_string;
		} else {
			$('gallery_image_dims').innerHTML="Size: " + media_data.media_width + ' x ' + media_data.media_height;
		}
	}

	if ($('gallery_image_submitted')) {
		var submitted_timestamp = new Date(media_data.submitted_timestamp*1000);
		$('gallery_image_submitted').innerHTML="Submitted: " + submitted_timestamp.formatDate("M j, Y") + ' by ' + media_data.agent_displayname;
	}

	if ($('gallery_image_creation_date')) {
		var creation_date = new Date(media_data.media_creation_date*1000);
		$('gallery_image_creation_date').innerHTML="Created: " + creation_date.formatDate("M j, Y");
	}
		
	$('image_next').style.display = (image_next ? 'inline' : 'none');
	$('image_prev').style.display = (image_prev ? 'inline' : 'none');

	
}

function windowMoveDone()
{
	if (detail_work_media[current_image-1]) {
		var media_id = detail_work_media[current_image-1].media_id;
		switchPlugin(media_id, true);
	}
}

function moveWindow()
{
	var image_container = $('gallery_images_' + detail_work_id + '_' + detail_mediadb_type);

	if (!image_container) {
		return false;
	}

	var newLeft = parseInt('-'+((current_image-1)*image_gallery_width));
	
	new Effect.Move(image_container, {x: newLeft, afterFinish: windowMoveDone, mode: 'absolute'});
	
	return;
}

var detail_work_media = new Array();
var detail_media_idx = new Array();

var detail_work_id;
var detail_media_id;
var detail_mediadb_type;
var current_image;

var image_gallery_width=501;
var image_gallery_height=375;
var image_gallery_units ='px';
var image_gallery_derivative;
var prev_image_url = '/shared/images/arrow_left.png';
var next_image_url = '/shared/images/arrow_right.png';

DAAP.require('/shared/scripts/ufo.js');
DAAP.require('/shared/scripts/scriptaculous/scriptaculous.js?load=effects,builder');
DAAP.onDOMReady(initGallery);
