// 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 + " ) " );

    // hack for Matthew : if the value that's being live updated
    // is coming from a slider, then bail out.
    if( path == "nonCSS.tracking" ) {
        document.tracking = newValue == "slider_tracking_now";

        if( !document.tracking ) {
            // this will cause a reload
            return "failed";
        }
    }
    // for Matthew
    // added all sliders in this section
    //Juergen
    if( document.tracking
    
            || path == "nonCSS.imageGap"
            || path == "nonCSS.numIm"
            || path == "nonCSS.logoTop"

    ) {
        // this will not cause a reload
        return "invalidateAllContent";
    }

    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);
        }
        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 if( path == "nonCSS.bg" ) {
        success = "failed";
    }
    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";
}

//------------------------------------------------------------

