var isIE = navigator.appVersion.indexOf("MSIE") >= 0;
var photosArray = new Array();
var peopleHash = new MMHash();
var placesHash = new MMHash();
var totalPhotoCount;
var storyName;
var storyAuthor;
var currentlyDisplayedPhotos;
var THUMBNAIL_HEIGHT = 96;
var PEOPLE_ICON_HEIGHT = 96;

function identifyClient()
{
	isIE = navigator.appVersion.indexOf("MSIE") >= 0
};

function log(aString)
{
	var myTextArea = document.getElementById('consoleTextArea');
		
	if (myTextArea)
	{
		myTextArea.value += '\n' +aString;
	}
};

function loadXMLDataFromURL(aURL)
{
	var myRequest = createHTTPRequest();
	
    myRequest.onreadystatechange = function () {handleXMLDataLoad(myRequest);}

    myRequest.open("GET", aURL, true);
	myRequest.setRequestHeader("Accept-Encoding", "gzip, deflate");

    myRequest.send("");
};

function handleXMLDataLoad(aRequest)
{
	var metaDataDOM;
	
    // only if aRequest shows "loaded"
    if (aRequest.readyState == 4) 
    {
//		log('here in handlXMLDataLoad aRequest.status is ' +aRequest.responseText);
//		log('here in handlXMLDataLoad aRequest.status is ' +aRequest.statusText);

		metaDataDOM = createDOMTreeFromRequest(aRequest);
			
		parseMediaObjectsDOM(metaDataDOM);

		// You only get a status when returned from an http server
		// we need to handle file:// requests as well
    	// only if "OK"
        if (aRequest.status == 200)
        {
        } 
        else
        {
//            log("There was a problem retrieving the XML data:\n" +aRequest.error);
        }
    }
};

function parseMediaObjectsDOM(aDOMTree)
{
	var mmExportRoot = aDOMTree.getElementsByTagName("MMExport")[0];
	var myPhotos = mmExportRoot.getElementsByTagName("photo");
	
	log('will process ' +myPhotos.length +' photos');
	
	totalPhotoCount = myPhotos.length;
	storyName = getElementTextNS("", "exportPackageTitle", mmExportRoot, 0);
	storyAuthor =  getElementTextNS("", "exportPackageAuthor", mmExportRoot, 0);

	document.getElementById('memoryAuthor').innerHTML = storyAuthor;
	document.getElementById('memoryTitle').innerHTML = storyName;

	log('storyName is ' +storyName +' storyAuthor is ' +storyAuthor);

	for (var i = 0; i < myPhotos.length; i++)
    {
		var myHash = new MMHash();
    	var attachmentNodes = myPhotos[i].getElementsByTagName('attachment');
		var photoObjectID = getElementTextNS("", "objectID", myPhotos[i], 0, 'photo');
        
        myHash.setItem('objectID', photoObjectID);
        
    	if (attachmentNodes.length > 0)
    	{
    		var attachmentArray = parseAttachmentNodes(attachmentNodes);
   			myHash.setItem('attachments', attachmentArray);
    	}
    	
		var selectionMarkerNodes = myPhotos[i].getElementsByTagName('selectionMarker');
    	    	
    	if (selectionMarkerNodes.length > 0)
    	{
    		var selectionMarkerArray = parseSelectionMarkerNodes(selectionMarkerNodes);
   			myHash.setItem('selectionMarkers', selectionMarkerArray);
    	}
    	
		var locationNodes = myPhotos[i].getElementsByTagName('location');
    	    	    	
    	if (locationNodes.length > 0)
    	{
			var locationID = getElementTextNS("", "objectID", locationNodes[0], 0);
				
    		parseLocationNodeForPhotoID(locationNodes[0], photoObjectID);
   			myHash.setItem('locationID', locationID);
    	}

        var title = getElementTextNS("", "title", myPhotos[i], 0);
        var relativeFileURL = getElementTextNS("", "relativeFilePath", myPhotos[i], 0);
        var relativeThumbnailURL = getElementTextNS("", "relativeThumbnailPath", myPhotos[i], 0, 'photo');
                
//		log('relativeThumbnailURL is ' +relativeThumbnailURL);
        
//		setTimeout(processThumbnailURL(relativeThumbnailURL), 250);
//		setTimeout("processThumbnail(\'" +relativeThumbnailURL +"\',\'" +photoObjectID +"\')", 250);
		processThumbnail(relativeThumbnailURL, +photoObjectID, 'interactivePictureList', 'pic-', 'loadPictureWithID');

        var pixelsHigh = getElementTextNS("", "pixelsHigh", myPhotos[i], 0);
        var pixelsWide = getElementTextNS("", "pixelsWide", myPhotos[i], 0);
        var uuid = getElementTextNS("", "uuid", myPhotos[i], 0);
        var notes = getElementTextNS("", "notes", myPhotos[i], 0);
        var exportScaleFactor = getElementTextNS("", "exportScaleFactor", myPhotos[i], 0);
        var creationDateString = getElementTextNS("", "creationDateString", myPhotos[i], 0);
		
        myHash.setItem('title', title);
        myHash.setItem('uuid', uuid);
        myHash.setItem('pixelsHigh', pixelsHigh);
        myHash.setItem('pixelsWide', pixelsWide);
        myHash.setItem('relativeFileURL', relativeFileURL);
        myHash.setItem('notes', notes);
        myHash.setItem('exportScaleFactor', exportScaleFactor);
	   	myHash.setItem('creationDateString', creationDateString);
		myHash.setItem('relativeFileURL', relativeFileURL);
	   	myHash.setItem('relativeThumbnailURL', relativeThumbnailURL);

//		log('notes is ' +myHash.getItem('notes'));
				
		photosArray[photosArray.length] = myHash;
	}
	
	currentlyDisplayedPhotos = photosArray;
	
	log('completed parsing of XMLMetadata');
	
	// Maybe this should be passed in?
	didFinishParsing();
};

function parseAttachmentNodes(attachmentNodes)
{
	var myAttachments = new Array();
	
	for (var i = 0; i < attachmentNodes.length; i++)
    {
		var myHash = new MMHash();

        var name = getElementTextNS("", "name", attachmentNodes[i], 0);
        var mediaType = getElementTextNS("", "mediaType", attachmentNodes[i], 0);
        var relativePath = getElementTextNS("", "relativePath", attachmentNodes[i], 0);
		
		myHash.setItem('name', name);
		myHash.setItem('mediaType', mediaType);
		myHash.setItem('url', relativePath);

		myAttachments[myAttachments.length] = myHash;
	}
		
	return myAttachments;
};

function parseLocationNodeForPhotoID(locationNode, photoObjectID)
{	
	var locationObjectID = getElementTextNS("", "objectID", locationNode, 0);
	var locationHash = placesHash.getItem(locationObjectID);
				
	if (!locationHash)
	{
		var name = getElementTextNS("", "name", locationNode, 0);
		var latitude = getElementTextNS("", "latitude", locationNode, 0);
		var longitude = getElementTextNS("", "longitude", locationNode, 0);
		
		locationHash = new MMHash();
		
		locationHash.setItem('photoIDArray', new Array());
		locationHash.setItem('name', name);
		locationHash.setItem('latitude', latitude);
		locationHash.setItem('longitude', longitude);
		
		placesHash.setItem(locationObjectID, locationHash);
	}
		
	var locationPhotoIDArray = locationHash.getItem('photoIDArray');
	
	locationPhotoIDArray[locationPhotoIDArray.length] = photoObjectID;
};

function parseSelectionMarkerNodes(selectionMarkerNodes)
{
	var mySelectionMarkers = new Array();
	
	for (var i = 0; i < selectionMarkerNodes.length; i++)
    {
		var myHash = new MMHash();
		
        var x1 = getElementTextNS("", "x1", selectionMarkerNodes[i], 0);
        var y1 = getElementTextNS("", "y1", selectionMarkerNodes[i], 0);
        var x2 = getElementTextNS("", "x2", selectionMarkerNodes[i], 0);
        var y2 = getElementTextNS("", "y2", selectionMarkerNodes[i], 0);
        var relativePersonIconPath = getElementTextNS("", "relativePersonIconPath", selectionMarkerNodes[i], 0, 'selectionMarker');
        var personObjectID = getElementTextNS("", "personObjectID", selectionMarkerNodes[i], 0);
        var photoObjectID = getElementTextNS("", "photoObjectID", selectionMarkerNodes[i], 0);
		var personName = getElementTextNS("", "personName", selectionMarkerNodes[i], 0);
		var personObjectHash = peopleHash.getItem(personObjectID);
						
		if (personObjectHash == undefined)
		{
			var relativePersonIconURL = getElementTextNS("", "relativePersonIconPath", selectionMarkerNodes[i], 0);
			
			personObjectHash = new MMHash();
			
			personObjectHash.setItem('photoIDArray', new Array());
			personObjectHash.setItem('personName', personName);
			personObjectHash.setItem('relativePersonIconURL', relativePersonIconURL);
			
			peopleHash.setItem(personObjectID, personObjectHash);
			
			processPersonIcon(relativePersonIconURL, personObjectID, personName, 'interactivePersonList', 'person-', 'loadPicturesForPersonID');
		}
		
		var personPhotoIDArray = personObjectHash.getItem('photoIDArray');
		
		personPhotoIDArray[personPhotoIDArray.length] = photoObjectID;
				
/*		myHash.setItem('originX', originX);
		myHash.setItem('originY', originY);
		myHash.setItem('height', height);
		myHash.setItem('width', width);
		*/
		myHash.setItem('x1', x1);
		myHash.setItem('x2', x2);
		myHash.setItem('y1', y1);
		myHash.setItem('y2', y2);
	
		myHash.setItem('relativePersonIconPath', relativePersonIconPath);
		myHash.setItem('personName', personName);
		myHash.setItem('personObjectID', personObjectID);

		mySelectionMarkers[mySelectionMarkers.length] = myHash;
	}
		
	return mySelectionMarkers;
};

function processThumbnail(aURL, aPhotoID, aDivName, idPrefix, jsFunctionName)
{
	$(aDivName).innerHTML += '<a id = \"' +idPrefix +aPhotoID +'\" href = javascript:' +jsFunctionName +'(' +aPhotoID +')><img height = ' +THUMBNAIL_HEIGHT +' src = ' +aURL +' ></a>';
};

function processPersonIcon(aURL, aPersonID, aPersonName, aDivName, idPrefix, jsFunctionName)
{		
	$(aDivName).innerHTML += '<a id = \"' +idPrefix +aPersonID +'\" href = \"javascript:' +jsFunctionName +'(\'' +idPrefix +aPersonID +'\')\"><img width = ' +PEOPLE_ICON_HEIGHT +' src = ' +aURL +' ></a><p>' +aPersonName +'</p>';
};

function getPhotoWithObjectID(aPhotoID)
{	
	for (var i = 0; i < photosArray.length; i++)
	{
		var myHash = photosArray[i];
		var myPhotoID = myHash.getItem('objectID');
				
		if (myPhotoID == aPhotoID)
		{
			return myHash;
		}
	}
	
	return false;
};

function getPhotosWithPersonID(aPersonID)
{
	var myPhotoArray = new Array();
	var myPersonPhotoIDArray = peopleHash.getItem(aPersonID).getItem('photoIDArray');
	
	for (var i = 0; i < myPersonPhotoIDArray.length; i++)
	{
		var myHash = getPhotoWithObjectID(myPersonPhotoIDArray[i]);
		
		myPhotoArray[myPhotoArray.length] = myHash;
	}	
	
	return myPhotoArray;
};

function indexOfPhotoWithID(aPhotoID)
{
	var myIndex = -1;
		
	for (var i = 0; i < currentlyDisplayedPhotos.length; i ++)
	{
		var myPhotoID = currentlyDisplayedPhotos[i].getItem('objectID');
		
		if (myPhotoID == aPhotoID)
		{
			return i;
		}
	}
	
	return myIndex;
};

function createHTTPRequest()
{
    var req = false;

    // branch for native XMLHttpRequest object
    if (isIE)
        req = new ActiveXObject("Microsoft.XMLHTTP")
    else
        req = new XMLHttpRequest();

    return req;
};

function getElementTextNS(prefix, local, parentElem, index, elementNameRestriction) 
{	
	var result = "";
	if (prefix && isIE) 
	{
	// IE/Windows way of handling namespaces
		result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
	} 
	else 
	{
	// the namespace versions of this method
	// (getElementsByTagNameNS()) operate
	// differently in Safari and Mozilla, but both
	// return value with just local name, provided
	// there aren't conflicts with non-namespace element
	// names
		if (elementNameRestriction)
		{
			var possibleNodes = parentElem.getElementsByTagName(local);
		
			for (var j = 0; j < possibleNodes.length; j++)
			{
				if (possibleNodes[j].parentNode.nodeName == elementNameRestriction)
				{
					return possibleNodes[j].childNodes[0].nodeValue;
				}
			}
		}
		else
		{
			result = parentElem.getElementsByTagName(local).item(index);
		}
		
		if (result) 
		{
			// get text, accounting for possible
			// whitespace (carriage return) text nodes
			if (result.childNodes.length == 0) 
			{
				return "";
			}
			
			if (result.childNodes.length > 1) 
			{
				return result.childNodes[1].nodeValue;
			} 
			else 
			{
				return result.firstChild.nodeValue;
			}
		} 
		else 
		{
			return "n/a";
		}
	}
};