/*
** Widget format
**
**
*/

( function() {
    //
    // Define global object
    // Widget
    //
    var lGlobalVar  = ""
    for( var i = 0; i < 16; i++ ){
        lGlobalVar  += String.fromCharCode( Math.floor( Math.random() * 26 ) + 97 );
    }

    window[ lGlobalVar ]    = {};
    var lPtr    = window[ lGlobalVar ];

    //
    // Init all functions and return
    //

    lPtr.lFunc  = function() {
        //
        //  Private Variables
        //

        lLocal  = new Object();

        //
        //  Private Methods
        //

        var initialize  = function( lScriptName ){
            // alert( "init" );
	        var lScripts    = document.getElementsByTagName( "script" );

            for( var i = 0; i< lScripts.length; i++ ){
                if( lScripts[ i ].src.match( lScriptName ) ){
                    //
                    // Is there anything between the "script" tags
                    // Parse it for arguments
                    //
                    if( lScripts[ i ].innerHTML ){
                        lLocal.lParams  = parseJSON( lScripts[ i ].innerHTML );
                    
                        if( lLocal.lParams.err ){
                            alert( "Bad JSON" );
                        };

                        // alert( lPtr.lParams[ "album" ] );
                    };

                    loadXml( lLocal.lParams[ "album" ] );
                };
            };
        };

	    //
	    // Get parameters
	    //
	
	    var parseJSON   = function( lStr ){
            // alert( "Parse JSON" );
	        if( typeof( lStr ) !== "string" ){
	            return( { "err": "Attempting to parse non-string JSON obj" } );
	        }
	
	        try{
	            var lFunction   = Function( [
	                // Define some reserved names as local to prevent them
	                // from being messed with.
	                "var document, top, self, window, parent, Number, Date, Object, Function,",
	                "Array, String, Math, RegExp, Image, ActiveXObject;",
	                "return( ",
	                lStr.replace( /<\!--.+-->/gim, "" ).replace( /\bfunction\b/g, "function-" ),
	                ");"
	                ].join( "" ) );
	
	            return( lFunction() );
	        } catch( e ) {
	            return( { "err": "Trouble parsing JSON obj" } );
	        }
	    };

	    //
	    // Load XML
	    //

        var setupPage   = function(){
            // alert( "setupPage" );
            // alert( lPtr.lXmlDoc );

            var lAlbumDiv   = document.getElementById( "album" );

            // Get the photo elements
            var lElements   = lPtr.lXmlDoc.getElementsByTagName( "photo" );
            // alert( lElements.length + " 'photo' elements found" );
            if( lElements.length == 0 ){
                return( false );
            };

            // Define and add the photo elements to the document
            for( var i = 0; i < lElements.length; i++ ){
                // Create the thumbnail div
                try{
                    var lSubElements    = lElements[ i ].getElementsByTagName( "thumbnail" )
                }catch( e ){
                    alert( e );
                }

                if( lSubElements ){
                    lStr    = lSubElements[ 0 ].childNodes.item( 0 ).data;
                };

                var lImage  = document.createElement( "img" );
                lImage.setAttribute( "src", lStr );
                lImage.setAttribute( "border", "0" );

                var lSubSubDiv = document.createElement( "div" );
                lSubSubDiv.setAttribute( "class", "photoFrame" );
                lSubSubDiv.appendChild( lImage );

                var lSubDiv = document.createElement( "div" );
                lSubDiv.setAttribute( "class", "photoContainer" );
                lSubDiv.appendChild( lSubSubDiv );

                var lDiv = document.createElement( "div" );
                lDiv.appendChild( lSubDiv );
                lDiv.setAttribute( "class", "photo" );

                if( lLocal.lParams[ "thumbnailtext" ] == "1" ){
                    lSubElements    = lElements[ i ].getElementsByTagName( "annotation" )
                    if( lSubElements ){
                        lStr    = lSubElements[ 0 ].childNodes.item( 0 ).data;
                    };

                    lSubDiv = document.createElement( "div" );
                    lSubDiv.setAttribute( "class", "photoText" );
                    lSubDiv.appendChild( document.createTextNode( lStr ) );
                    lDiv.appendChild( lSubDiv );
                }

                // Get full picture info
                var lNodes    = lElements[ i ].getElementsByTagName( "image" )
                if( lNodes ){
                    lStr    = lNodes[ 0 ].childNodes.item( 0 ).data;
                };

                var lSpan = document.createElement( "span" );
                lSpan.setAttribute( "onClick", lGlobalVar + ".lFunc.show(\'" + lStr + "\');" );
                lSpan.appendChild( lDiv );

                lAlbumDiv.appendChild( lSpan );
            };
        };

        var loadXml     = function( lFileName ){
            // alert( "loadXml" );
            if( ( document.implementation ) &&
                ( document.implementation.createDocument ) ){
                lPtr.lXmlDoc    = document.implementation.createDocument( "", "", null );
                lPtr.lXmlDoc.onload = setupPage;

            }else if( window.ActiveXObject ){
                lPtr.lXmlDoc    = ActiveXObject( "Microsoft.XMLDOM" );
                lPtr.lXmlDoc.onreadystatechange = function(){
                    if( lPtr.lXmlDoc.readyState == 4 ) setupPage();
                };
            }else{
                alert( "Unable to handle script" );
            };
           // try{
           //     lPtr.lXmlDoc    = document.implementation.createDocument( "", "", null );
           //     lPtr.lXmlDoc.onload = lPtr.lFunc.setupPage();

           // } catch( e ) {
           //     try{
           //         lPtr.lXmlDoc    = ActiveXObject( "Microsoft.XMLDOM" );
           //         lPtr.lXmlDoc.onreadystatechange = function(){
           //             if( lPtr.lXmlDoc.readyState == 4 ) lPtr.lFunc.setupPage();
           //         }
           //     }catch( e ){
           //         alert( e.message );
           //         return;
           //     }
           // };

            lPtr.lXmlDoc.async  = false;
            lPtr.lXmlDoc.load( lFileName );
        };

        var _remove     = function( lNode ){
            var lParentNode = lNode.parentNode;

            if( lParentNode ){
                lParentNode.removeChild( lNode );
            };

            return( true );
        };

        var _show       = function( lImageFile ){
            // Get the photo elements
            var lElements   = lPtr.lXmlDoc.getElementsByTagName( "photo" );
            if( lElements.length == 0 ){
                return( false );
            };

            var lAnnotation = "";

            for( var i = 0; i < lElements.length; i++ ){
                lElement    = lElements[ i ];
                lFileName   = lElement.getElementsByTagName( "image" )[ 0 ];
                lFileName   = lFileName.childNodes.item( 0 ).data;
                lText       = lElement.getElementsByTagName( "annotation" )[ 0 ];
                lText       = lText.childNodes.item( 0 ).data;

                if( lFileName == lImageFile ){
                    lAnnotation = lText;
                };
            };

            var lNode   = document.getElementById( "overlay" );

            if( lNode == null ){
                var lOverlay    = document.createElement( "div" );
                lOverlay.setAttribute( "id", "overlay" );
                lOverlay.setAttribute( "class", "overlay" );
                lOverlay.setAttribute( "onClick", lGlobalVar + ".lFunc.remove( this );" );

                /* Add image */
                lPicture    = document.createElement( "div" );
                lPicture.setAttribute( "id", "picture" );
                lPicture.setAttribute( "class", "picture" );

                var lImage  = document.createElement( "img" );
                lImage.setAttribute( "src", lImageFile );
                lPicture.appendChild( lImage );
                lPicture.appendChild( document.createElement( "br", "" ) );

                /* Add image annotation */
                var lText   = document.createTextNode( lAnnotation );
                var lCenter = document.createElement( "center" );
                lCenter.appendChild( lText );
                lPicture.appendChild( lCenter );

                /* Add slideshow buttons */
                /*
                lSpan   = document.createElement( "span" );
                lSpan.setAttribute( "onClick", "slideshow( "prev" );" );
                lImage  = document.createElement( "img" )
                lImage.setAttribute( "src", "/images/prev.png" );
                lImage.setAttribute( "class", "button" );
                lSpan.appendChild( lImage );
                lPicture.appendChild( lSpan );

                lImage  = document.createElement( "img" )
                lImage.setAttribute( "src", "/images/play.png" );
                lImage.setAttribute( "class", "button" );
                lPicture.appendChild( lImage );
                lImage  = document.createElement( "img" )
                lImage.setAttribute( "src", "/images/next.png" );
                lImage.setAttribute( "class", "button" );
                lPicture.appendChild( lImage );
                */

                lOverlay.appendChild( lPicture );

                /* Add background */
                lNode   = document.createElement( "div" );
                lNode.setAttribute( "id", "background" );
                lNode.setAttribute( "class", "background" );
                lOverlay.appendChild( lNode );

                var lBody   = document.getElementsByTagName( "body" )[ 0 ];
                lBody.appendChild( lOverlay );
            };

            return( true );
        };

        //
        //  Public Methods
        //

	    return {
	        //
	        // Init this script (whatever the filename is)
	        //
	
	        init:   function( lScriptName ){
                initialize( lScriptName );
            },
	
	        show:   function( lImageName ){
                _show( lImageName );
            },
	
	        remove:   function( lNode ){
                _remove( lNode );
            },
	    };
	}();

    //
    //
    //

    var lScriptName = /album.js/;

    if( typeof( window.addEventListener ) !== "undefined" ){
        // Firefox
        //alert( "Firefox" );
        window.addEventListener( "load", function(){ lPtr.lFunc.init( lScriptName ); }, false );

    } else if( typeof( window.attachEvent ) !== "undefined" ){
        // IE
        //alert( "IE" );
        window.attachEvent( "onload", function(){ lPtr.lFunc.init( lScriptName ); } );

    }else{
        alert( "Failed to attache to event listener" );
    };
} )();

