// a constant used to indicate a function that does nothing

var NOOP = function() {}



// ------------------------------------------------------------------------

//   Find the font family, size and face for the provided node in the

//   HTML dom.  The result object contains fontSize, fontFamily and

//   fontFace entries.

//

function findFont( obj )

{

	var result = new Object();

	if ( obj.currentStyle ) {

		result.fontSize = obj.currentStyle[ 'fontSize' ];

		result.fontFamily = obj.currentStyle[ 'fontFamily' ];

		result.fontFace = obj.currentStyle[ 'fontFace' ];

	} else if ( document.defaultView && document.defaultView.getComputedStyle ) {

		var computedStyle = document.defaultView.getComputedStyle( obj, "" );

		result.fontSize = computedStyle.getPropertyValue( 'font-size' );

		result.fontFamily = computedStyle.getPropertyValue( 'font-family' );

		result.fontFace = computedStyle.getPropertyValue( 'font-face' );

	}

	return result;

}



// ---------------------------------------------------------------------------



/*

	Find the bounds of the specified node in the DOM.  This returns

	an objct with x,y, height and width fields

*/

function findBounds( obj )

{

	var bounds = new Object();

	bounds.x = 0;

	bounds.y = 0;

	bounds.width = obj.scrollWidth;

	bounds.height = obj.scrollHeight;

	if( obj.x != null ) {

		bounds.x = obj.x;

		bounds.y = obj.y;

	}

	else {

		while( obj.offsetLeft != null ) {

			bounds.x += obj.offsetLeft;

			bounds.y += obj.offsetTop;

			if( obj.offsetParent ) {

				obj = obj.offsetParent;

			}

			else {

				break;

			}

		}

	}

			

	// subtract the amount the page is scrolled from position

	if (self.pageYOffset) // all except Explorer

	{

		bounds.x -= self.pageXOffset;

		bounds.y -= self.pageYOffset;

	}

	else if (document.documentElement && document.documentElement.scrollTop)

		// Explorer 6 Strict

	{

		bounds.x -= document.documentElement.scrollLeft;

		bounds.y -= document.documentElement.scrollTop;

	}

	else if (document.body) // all other Explorers

	{

		bounds.x -= document.body.scrollLeft;

		bounds.y -= document.body.scrollTop;

	}



	return bounds;

}



// ---------------------------------------------------------------------------



var isFirefoxPat = /Firefox\/([0-9]+)[.]([0-9]+)[.]([0-9]+)/;

var firFoxArr = isFirefoxPat.exec( navigator.userAgent );

var isSafariPat = /AppleWebKit\/([0-9]+)[.]([0-9]+)/;

var safariArr = isSafariPat.exec( navigator.userAgent );



// ---------------------------------------------------------------------------



/*

	Default implementation does nothing when viewing the webpage normally

*/

var clickTarget = NOOP;

var tellLightroomWhatImagesWeAreUsing = NOOP;

var setActiveImageSize = NOOP;



// ---------------------------------------------------------------------------



var callCallback = NOOP;

var WIN_ENV = false;

var MAC_ENV = false;



// ---------------------------------------------------------------------------



if( window.myCallback != null ){

	MAC_ENV = true;



	// We're being previewed on Mac.  Create a callback

	// function for communicating from the web page into Lightroom.

	callCallback = function() {

		// On Mac we use a special javascript to talk to Lightroom.

		var javascript = 'myCallback.' + arguments[ 0 ] + "( ";

		var j = arguments.length;

		var c = j - 1;

		for( var i = 1; i < j; i++ ) {

			var arg = arguments[ i ];

			if( typeof( arg ) == 'string' ) {

				javascript = javascript + '"' + arg + '"';

			}

			if( typeof( arg ) == 'number' ) {

				javascript = javascript + arg

			}

			if( typeof( arg ) == 'undefined' ) {

				javascript = javascript + 'undefined'

			}

			if( i < c ) {

				javascript = javascript + ", "

			}

		}

		javascript = javascript + " )"

		eval( javascript )

	}

	

	pushresult = function( result ) {

		callCallback( "pushresult", result )

	}

}



// ---------------------------------------------------------------------------



else if( window.AgMode == 'preview' ) {

	WIN_ENV = true;

	// We're being previewed on Windows.  Create a callback

	// function for communicating from the web page into Lightroom.

	callCallback = function() {

		// On windows we use a special lua: URL to talk to Lightroom.

		var lua = arguments[ 0 ] + "( ";

		var j = arguments.length;

		var c = j - 1;

		for( var i = 1; i < j; i++ ) {

			var arg = arguments[ i ];

			if( typeof( arg ) == 'string' ) {

				lua = lua + '"' + arg + '"';

			}

			if( typeof( arg ) == 'number' ) {

				lua = lua + arg

			}

			if( typeof( arg ) == 'undefined' ) {

				lua = lua + 'undefined'

			}

			if( i < c ) {

				lua = lua + ", "

			}

		}

		lua = lua + ")"

		location.href = "lua:" + lua

	}

	

	pushresult = function( result ) {

		location.href = "rsl:" + result;	

	}

}



// ---------------------------------------------------------------------------



/*

	Set up live feedback between Lightroom and the previewed web page.

*/

if( callCallback != NOOP ) {

	setActiveImageSize = function( size ) {

		document.activeImageSize = size;

		callCallback( "setActiveImageSize", size );

	}



	tellLightroomWhatImagesWeAreUsing = function() {



		if( window.myCallback != null ) {

			var imgElements = document.getElementsByTagName( "img" );

			var elsLen = imgElements.length;

			var result = new Array()

			for( i = 0; i < elsLen; i++ ) {

				var element = imgElements[ i ];

				var imageID = element.id;

				// for html validation purposes, we've prepended "ID" to the GUID for this

				// image, so now we strip that off.

				imageID = imageID.substring( 2 );

				result[ i ] = imageID;

			}

			myCallback.setUsedFiles( result );

		}

	}



	clickTarget = function( obj, target, imageID ) {

		if( imageID != null ) {

			// for html validation purposes, we've prepended "ID" to the GUID for this

			// image, so now we strip that off.

			imageID = imageID.substring( 2 );

		}

		var bounds = findBounds( obj );

		var font = findFont( obj );

		callCallback( 'inPlaceEdit', target, bounds.x, bounds.y, bounds.width, bounds.height, font.fontFamily, font.fontSize, imageID )

	}



	AgDebugPrint = function( message ) {

		callCallback( 'AgDebugPrint', message );

	}

}



// ---------------------------------------------------------------------------



if( firFoxArr && ( firFoxArr[1] > 1 || firFoxArr[2] > 4 ) ||

      safariArr ) {

	window.gridOn = NOOP;

	window.gridOff= NOOP;

}

else {

	window.gridOn = function( t, id ) {

		t.agOriginalClassName = t.className;

		t.className =  "selectedThumbnail " + t.className;

	};

	window.gridOff= function( t ) {

		t.className = t.agOriginalClassName;

	};

}



var needThumbImgLink = !isFirefoxPat;





var oldOnLoad = window.onload;

window.onload = function() {

	if( window.AgOnLoad ) {

		window.AgOnLoad();

	}

	if( oldOnLoad ) {

		oldOnLoad();

	}

};



//------------------------------------------------------------



document.liveUpdateImageMaxSize = function( id, value ) {

	var targetArr = id.split(/[ \t\r\n]*,[ \t\r\n]*/);

	for( i = 0; i < targetArr.length; i++ ) {

		var target = targetArr[i];

		var idRegex = new RegExp( "^[#](.+$)" );

		var theId = idRegex.exec( target );

		if( theId && theId[ 1 ] ) {

			var item = document.getElementById( theId[ 1 ] );

			if( item ) {



				// scale image size

				var max = item.width;

				if( item.height > max ) {

					max = item.height;

				}

				item.width = item.width * value / max;

				item.height = item.height * value / max;

			}

		}

	}





	return "invalidateAllContent";

}



//------------------------------------------------------------



document.liveUpdatePropertyMac = function( id, property, value ) {



	var targetArr = id.split(/[ \t\r\n]*,[ \t\r\n]*/);

	var clasRegex = new RegExp( "^[.](.+$)" )

	var idRegex = new RegExp( "^[#](.+$)" )

	var comboRegex = new RegExp( "[ \t\r\n]" );



	for( i = 0; i < targetArr.length; i++ ) {

		var target = targetArr[i];

		var theClass = clasRegex.exec( target );

		var theId = idRegex.exec( target );

		if( comboRegex.exec( target ) ) {

			return "failed";

		}

		else if( theClass) {

			var pattern = new RegExp( "(^|\\s)" + theClass[1] + "(\\s|$)" );

			var items = document.getElementsByTagName( '*' );

			for( o = 0; o < items.length; o++ ) { 

				var item = items[ o ];

				if( pattern.test( item.className ) ){

					item.style.setProperty( property, value, "important" );

				}

			}

			return "invalidateAllContent";

		}

		else if( theId ) {

			if( property == "maxSize" ) {

				return document.liveUpdateImageMaxSize( id, value );

			}

			var item = document.getElementById( theId[ 1 ] );

			if( item ) {

				item.style.setProperty( property, value, "important");

			}

			return "invalidateAllContent";

		}   

		else {

			var items = document.getElementsByTagName( target);

			for( i = 0; i < items.length; i++ ) {

				var item = items[i];

				item.style.setProperty( property, value, "important" );

			}

			return "invalidateAllContent";

		}

	}

};



//------------------------------------------------------------



document.liveUpdatePropertyWin = function( id, property, value ) {

//	AgDebugPrint( "document.liveUpdatePropertyWin( " + id + ", " + property + ", " + value + " )\n" );

	if( property == "maxSize" ) {

		return document.liveUpdateImageMaxSize( id, value );

	}

	if( property == 'display' || value == 'inherit' ) {

		return "failed"

	}

	var x = document.styleSheets[0];

	x.addRule(id, property + ": " + value + " !important");

	return "invalidateAllContent";

}

if( MAC_ENV ) {

	document.liveUpdateProperty = document.liveUpdatePropertyMac

}

if( WIN_ENV ) {

	document.liveUpdateProperty = document.liveUpdatePropertyWin

}



//------------------------------------------------------------



document.liveUpdate = function( path, newValue, cssId, property ) {

// AgDebugPrint( "document.liveUpdate( " + path + ", " + newValue + ", " + cssId + " , " + property + " ) " );

	var success = "failed";

	var reg = /(^[^.]+)\./;

	var ar = reg.exec( path );

	if( ar == null ) {



		// override result if we drove this change ourselves

		if( document.LR_modelManipulation ) {

			return "invalidateOldHTML";

		}

		return "failed";

	}

	var area = ar[1];

	if( area == "metadata" ) {

		// our html is built so that the HTML ids are the metadata path

		var a = document.getElementById( path );

		while(a.hasChildNodes()) {

			a.removeChild(a.firstChild);

		}

		newValue = newValue.replace(/&/g, "&amp;" );

		newValue = newValue.replace(/</g, "&lt;" );

		a.innerHTML = newValue;

		success = "invalidateOldHTML";

	}

	else if( area == "appearance" ) {

		success = document.liveUpdateProperty( cssId, property, newValue );

	}

	else if( path == "nonCSS.tracking" ) {

		if( newValue == null || newValue == "null") {

			// force reload by signalling failure to update

			// because we don't properly layout all the nuiances of

			// detail image placement during tracking, we reload at the

			// end to make sure it is correct when mouseup

			success = "failed";

		}

		else {

			// FIX_ME, image won't layout properly during drag w/o this

			success = "invalidateOldHTML";

		}

	}

	else if( path == "nonCSS.imageBorderWidth" ) {

		// FIX_ME, not yet implemented, so image won't layout properly during drag

		// as a workaround, we're reloading on tracking up (see previous block)

		success = "invalidateOldHTML";

	}

	else {

		// AgDebugPrint("How do I update " + path + " to " + newValue )

	}



	// override result if we drove this change ourselves

	if( document.LR_modelManipulation ) {

		return "invalidateOldHTML";

	}

	return success;

}



//------------------------------------------------------------



document.liveUpdateImageSize = function( imageID, width, height ) {



	var img = document.getElementById( 'ID' + imageID );

	img.style.width = width + 'px';

	img.style.height = height + 'px';

	return "invalidateAllContent";

}



//------------------------------------------------------------




