/*
 * Helma License Notice
 *
 * The contents of this file are subject to the Helma License
 * Version 2.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://adele.helma.org/download/helma/license.txt
 *
 * Copyright 1998-2006 Helma Software. All Rights Reserved.
 *
 * $RCSfile: Image.js,v $
 * $Author: zumbrunn $
 * $Revision: 8714 $
 * $Date: 2007-12-13 13:21:48 +0100 (Don, 13. Dez 2007) $
 */

/**
 * @fileoverview Methods of the helma.Image module.
 * <br /><br />
 * To use this optional module, its repository needs to be added to the 
 * application, for example by calling app.addRepository('modules/helma/Image.js')
 */

if (!global.helma) {
    global.helma = {};
}

/**
 * Returns an Image object, generated from the specified source. 
 * <br /><br />
 * If the JIMI package is installed, an instance of 
 * helma.image.jimi.JimiGenerator will be returned. Otherwise, 
 * if the javax.imageio package is available, an instance of 
 * helma.image.imageio.ImageIOGenerator is returned. 
 * Additionally, the class of the ImageGenerator implementation
 * to be used can be set using the <code>imageGenerator</code> 
 * property in either the app.properties or server.properties 
 * file.
 * 
 * 
 * @param {helma.File|java.io.File|String} arg image source, filename or url
 * @return a new Image object
 * @singleton
 * @see Packages.helma.image.ImageGenerator
 * @see Packages.helma.image.jimi.JimiGenerator
 * @see Packages.helma.image.imageio.ImageIOGenerator 
 */
helma.Image = function(arg) {
    // according to 
    // http://grazia.helma.org/pipermail/helma-dev/2004-June/001253.html
    var generator = Packages.helma.image.ImageGenerator.getInstance();
    return generator.createImage(arg);
}

/** @ignore */
helma.Image.toString = function() {
    return "[helma.Image]";
};


/**
 * Returns an ImageInfo object for the specified image file. 
 * 
 * @param {helma.File|java.io.File|String} arg image source, filename or url
 * @returns an ImageInfo object
 * @memberof helma.Image
 * @see Packages.helma.image.ImageInfo
 */
helma.Image.getInfo = function(arg) {
    if (arguments.length != 1) {
        throw new java.lang.IllegalArgumentException(
            "Image.getInfo() expects one argument"
        );
    }

    var inp, result;
    var info = new Packages.helma.image.ImageInfo();
    // FIXME: we need a byte array for class comparison
    var b = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 0);

    try {
        if (arg instanceof java.io.InputStream) {
            inp = new java.io.InputStream(arg);
        // FIXME: here comes a dirty hack to check for a byte array
        } else if (arg.getClass && arg.getClass() == b.getClass()) {
            inp = new java.io.ByteArrayInputStream(arg);
        } else if (arg instanceof java.io.File) {
            inp = new java.io.FileInputStream(arg);
        } else if (arg instanceof helma.File) {
            inp = new java.io.FileInputStream(arg.getFile());
        } else if (typeof arg == "string") {
            var str = arg;
            // try to interpret argument as URL if it contains a colon,
            // otherwise or if URL is malformed interpret as file name.
            if (str.indexOf(":") > -1) {
                try {
                    var url = new java.net.URL(str);
                    inp = url.openStream();
                } catch (mux) {
                    inp = new java.io.FileInputStream(str);
                }
            } else {
                inp = new java.io.FileInputStream(str);
            }
        }
        if (inp == null) {
            var msg = "Unrecognized argument in Image.getInfo(): ";
            msg += (arg == null ? "null" : arg.getClass().toString());
            throw new java.lang.IllegalArgumentException(msg);
        }
        info.setInput(inp);
        if (info.check()) {
            result = info;
        }
    } catch (e) {
        // do nothing, returns null later
    } finally {
        if (inp != null) {
            try {
                inp.close();
            } catch (e) {}
        }
    }

    return result;
};


/**
 * Writes a 1x1 pixel transparent spacer GIF image to the
 * response buffer and sets the content type to image/gif.
 * 
 * @memberof helma.Image
 */
helma.Image.spacer = function() {
    res.contentType = "image/gif";
    res.writeBinary([71,73,70,56,57,97,2,0,2,0,-128,-1,0,-64,-64,-64,0,0,0,33,-7,4,1,0,0,0,0,44,0,0,0,0,1,0,1,0,64,2,2,68,1,0,59]);
    return;
};

helma.lib = "Image";
helma.dontEnum(helma.lib);
for (var i in helma[helma.lib])
    helma[helma.lib].dontEnum(i);
for (var i in helma[helma.lib].prototype)
    helma[helma.lib].prototype.dontEnum(i);
delete helma.lib;



