// 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 callCallback = NOOP;

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

if( window.myCallback != null ){
        // 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 )
        }
}

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

else if( window.AgMode == 'preview' ) {
        // 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 + ")"
                // alert( lua )
                location.href = "lua:" + lua
        }
}

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

/*
        Set up live feedback between Lightroom and the previewed web page.
*/
if( callCallback != NOOP ) {
        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 )
        }
}

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

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();
        }
}


