/*
 *  Copyright 2011 Wolfgang Koller - http://www.gofg.at/
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

/**
 * FileError interface
 * http://www.w3.org/TR/file-system-api/#the-fileerror-interface
 */
function FileError() {
}

FileError.cast = function( p_code ) {
            var fe = new FileError();
            fe.code = p_code;

            return fe;
        }
FileError.prototype.code = 0;
FileError.NOT_FOUND_ERR = 1;
FileError.SECURITY_ERR = 2;
FileError.ABORT_ERR = 3;
FileError.NOT_READABLE_ERR = 4;
FileError.ENCODING_ERR = 5;
FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
FileError.INVALID_STATE_ERR = 7;
FileError.SYNTAX_ERR = 8;
FileError.INVALID_MODIFICATION_ERR = 9;
FileError.QUOTA_EXCEEDED_ERR = 10;
FileError.TYPE_MISMATCH_ERR = 11;
FileError.PATH_EXISTS_ERR = 12;

/**
 * FileException interface
 * http://www.w3.org/TR/FileAPI/#dfn-FileException
 */
//use this one as FileError name conflict
function FileException() {
}

FileException.cast = function( p_code ) {
            var fe = new FileException();
            fe.code = p_code;

            return fe;
        }
FileException.prototype.code = 0;
FileException.NOT_FOUND_ERR = 1;
FileException.SECURITY_ERR = 2;
FileException.ABORT_ERR = 3;
FileException.NOT_READABLE_ERR = 4;
FileException.ENCODING_ERR = 5;
FileException.NO_MODIFICATION_ALLOWED_ERR = 6;
FileException.INVALID_STATE_ERR = 7;
FileException.SYNTAX_ERR = 8;
FileException.INVALID_MODIFICATION_ERR = 9;
FileException.QUOTA_EXCEEDED_ERR = 10;
FileException.TYPE_MISMATCH_ERR = 11;
FileException.PATH_EXISTS_ERR = 12;


/**
 * FileMetadata (Metadata) interface
 * http://www.w3.org/TR/file-system-api/#idl-def-Metadata
 */
function Metadata(p_modificationDate ) {
    this.modificationTime = p_modificationDate || null;
    return this;
}

Metadata.cast = function( p_modificationDate ) {
            var md = new Metadata(p_modificationDate);
            return md;
        }


function Flags(create, exclusive) {
    this.create = create || false;
    this.exclusive = exclusive || false;
};

Flags.cast = function( p_modificationDate ) {
            var md = new Metadata(p_modificationDate);
            return md;
        }
Flags.cast = function(create, exclusive) {
            var that = new Flags(create, exclusive);
            return that;
        };



/**
 * Entry interface
 * http://www.w3.org/TR/file-system-api/#idl-def-Entry
 */
function Entry() {
}
Entry.prototype.isFile = false;
Entry.prototype.isDirectory = false;
Entry.prototype.name = "";
Entry.prototype.fullPath = "";//fullpath for cordova-test = realFullPath - "/"
Entry.prototype.filesystem = null;
Entry.prototype.getMetadata = function( successCallback, errorCallback ) {
            // Get metadata for this entry
            Cordova.exec(successCallback, errorCallback, "com.cordova.File", "getMetadata", [this.fullPath]);
        }
Entry.prototype.moveTo = function( parent, newName, successCallback, errorCallback ) {
        }
Entry.prototype.copyTo = function( parent, newName, successCallback, errorCallback ) {
        }
Entry.prototype.toURL = function( mimeType ) {
            return "file://" + this.fullPath;
        }
Entry.prototype.remove = function( successCallback, errorCallback ) {
            // Remove this entry
            Cordova.exec(successCallback, errorCallback, "com.cordova.File", "remove", [this.fullPath]);
        }
Entry.prototype.getParent = function( successCallback, errorCallback ) {
            // Ask the system for our parent
            Cordova.exec(successCallback, errorCallback, "com.cordova.File", "getParent", [this.fullPath]);
        }

/**
 * FileInfo (File) interface
 * (had to call the 'File' object FileInfo since there were name conflicts)
 * http://dev.w3.org/2006/webapi/FileAPI/#dfn-file
 */
function FileInfo() {
}

FileInfo.cast = function( p_name, p_fullPath, p_type, p_lastModifiedDate, p_size ) {
            var f = new FileInfo();
            f.name = p_name;
            f.fullPath = p_fullPath;
            f.type = p_type;
            f.lastModifiedDate = p_lastModifiedDate;
            f.size = p_size;

            return f;
        }
FileInfo.prototype.name = "";
FileInfo.prototype.fullPath = "";
FileInfo.prototype.type = "unknown/unknown";
FileInfo.prototype.lastModifiedDate = null;
FileInfo.prototype.size = 0;

/**
 * FileSaver interface
 * http://www.w3.org/TR/file-writer-api/#idl-def-FileSaver
 */
function FileSaver() {
}

FileSaver.createEvent = function( p_type, p_target ) {
            var evt = {
                "type": p_type,
                "target": p_target
            };

            return evt;
        }

FileSaver.prototype.abort = function() {
            if( this.readyState == FileSaver.INIT || this.readyState == FileSaver.DONE ) throw FileException.cast(FileException.INVALID_STATE_ERR);

            this.error = FileError.cast(FileError.ABORT_ERR);
            this.readyState = FileSaver.DONE;

            if( typeof this.onerror === "function" ) this.onerror(FileSaver.createEvent("error", this));
            if( typeof this.onabort === "function" ) this.onabort(FileSaver.createEvent("abort", this));
            if( typeof this.onwriteend === "function" ) this.onwriteend(FileSaver.createEvent("writeend", this));
        }

FileSaver.INIT = 0;
FileSaver.WRITING = 1;
FileSaver.DONE = 2;

FileSaver.prototype.readyState = FileSaver.INIT;
FileSaver.prototype.error = new FileError();
FileSaver.prototype.onwritestart = null;
FileSaver.prototype.onprogress = null;
FileSaver.prototype.onwrite = null;
FileSaver.prototype.onabort = null;
FileSaver.prototype.onerror = null;
FileSaver.prototype.onwriteend = null;

FileSaver.prototype.fullPath = "";		// Not W3C conform, but we need the path for handling!

/**
 * FileWriter interface
 * (derives from FileSaver)
 * http://www.w3.org/TR/file-writer-api/#idl-def-FileWriter
 */
function FileWriter() {
}

FileWriter.cast = function( p_fullPath, p_length ) {
            var fw = new FileWriter();
            fw.fullPath = p_fullPath;
            fw.length = p_length;

            return fw;
        }

FileWriter.prototype = new FileSaver();
FileWriter.prototype.position = 0;
FileWriter.prototype.length = 0;
FileWriter.prototype.write = function( data ) {
            //console.log( 'Calling write: ' + this.position + " / " + this.length );

            // Check if we are able to write
            if( this.readyState == FileSaver.WRITING ) throw FileException.cast(FileException.INVALID_STATE_ERR);
            // We are writing now
            this.readyState = FileSaver.WRITING;
            // Emit the start event
            if( typeof this.onwritestart === "function" ) this.onwritestart( FileSaver.createEvent("writestart", this) );

            // Finally do the writing
            var me = this;
            Cordova.exec(function(p_position, p_length) {
                             // Update position & length for file
                             me.position = p_position;
                             me.length = p_length;

                             // Update state
                             me.readyState = FileSaver.DONE;

                             // Dispatch missing events
                             if( typeof me.onwrite === "function" ) me.onwrite( FileSaver.createEvent("write", me) );
                             if( typeof me.onwriteend === "function" ) me.onwriteend( FileSaver.createEvent("writeend", me) );
                         }, function( p_fileError, p_position, p_length ) {
                             // Update position & length for file
                             me.position = p_position;
                             me.length = p_length;

                             // Set error object & update state
                             me.error = p_fileError;
                             me.readyState = FileSaver.DONE;

                             // Dispatch missing events
                             if( typeof me.onerror === "function" ) me.onerror( FileWriter.createEvent("error", me) );
                             if( typeof me.onwriteend === "function" ) me.onwriteend( FileWriter.createEvent("writeend", me) );
                         }, "com.cordova.File", "write", [this.fullPath, this.position, data]);
        }

FileWriter.prototype.seek = function( offset ) {
            //console.log( 'Calling seek: ' + offset + " / " + this.position + " / " + this.length + " / " + this.readyState );

            if( this.readyState == FileSaver.WRITING ) throw FileException.cast(FileException.INVALID_STATE_ERR);

            if( offset < 0 ) {
                this.position = offset + this.length;
            }
            else if( offset > this.length ) {
                this.position = this.length;
            }
            else {
                this.position = offset;
            }
        }

FileWriter.prototype.truncate = function( size ) {
            // Check if we are able to write
            if( this.readyState == FileSaver.WRITING ) throw FileException.cast(FileException.INVALID_STATE_ERR);
            // We are writing now
            this.readyState = FileSaver.WRITING;
            // Emit the start event
            if( typeof this.onwritestart === "function" ) this.onwritestart( FileSaver.createEvent("writestart", this) );

            // Finally do the writing
            var me = this;
            Cordova.exec(function(p_position, p_length) {
                             // Update position & length for file
                             me.position = p_position;
                             me.length = p_length;

                             // Update state
                             me.readyState = FileSaver.DONE;

                             // Dispatch missing events
                             if( typeof me.onwrite === "function" ) me.onwrite( FileSaver.createEvent("write", me) );
                             if( typeof me.onwriteend === "function" ) me.onwriteend( FileSaver.createEvent("writeend", me) );
                         }, function( p_fileError, p_position, p_length ) {
                             // Update position & length for file
                             me.position = p_position;
                             me.length = p_length;

                             // Set error object & update state
                             me.error = p_fileError;
                             me.readyState = FileSaver.DONE;

                             // Dispatch missing events
                             if( typeof me.onerror === "function" ) me.onerror( FileSaver.createEvent("error", me) );
                             if( typeof me.onwriteend === "function" ) me.onwriteend( FileSaver.createEvent("writeend", me) );
                         }, "com.cordova.File", "truncate", [this.fullPath, size]);
        }

/**
 * FileReader interface
 * http://www.w3.org/TR/FileAPI/#dfn-filereader
 */
function FileReader() {
}

FileReader.EMPTY = 0;
FileReader.LOADING = 1;
FileReader.DONE = 2;

FileReader.prototype.readyState = FileReader.EMPTY;
FileReader.prototype.result = "";
FileReader.prototype.error = new FileError();
FileReader.prototype.onloadstart = null;
FileReader.prototype.onprogress = null;
FileReader.prototype.onload = null;
FileReader.prototype.onabort = null;
FileReader.prototype.onerror = null;
FileReader.prototype.onloadend = null;

FileReader.prototype.readAsArrayBuffer = function( file ) {
        }
FileReader.prototype.readAsBinaryString = function( file ) {
        }
FileReader.prototype.readAsText = function( file ) {
            this.readyState = FileReader.EMPTY;
            this.result = null;

            this.readyState = FileReader.LOADING;

            if( typeof this.onloadstart === "function" ) this.onloadstart( FileSaver.createEvent( "loadstart", this) );

            var me = this;

            // Lets read the file...
            Cordova.exec(function( p_data ) {
                             me.readyState = FileReader.DONE;
                             me.result = atob( p_data );

                             if( typeof me.onload === "function" ) me.onload( FileSaver.createEvent( "load", me) );
                             if( typeof me.onloadend === "function" ) me.onloadend( FileSaver.createEvent( "loadend", me) );
                         }, function( p_fileError ) {
                             me.readyState = FileReader.DONE;
                             me.result = null;
                             me.error = p_fileError;

                             if( typeof me.onloadend === "function" ) me.onloadend( FileSaver.createEvent( "loadend", me) );
                             if( typeof me.onerror === "function" ) me.onerror( FileSaver.createEvent( "error", me) );
                         }, "com.cordova.File", "readAsDataURL", [file.fullPath]);
        }
FileReader.prototype.readAsDataURL = function( file ) {
            this.readyState = FileReader.EMPTY;
            this.result = null;

            this.readyState = FileReader.LOADING;

            if( typeof this.onloadstart === "function" ) this.onloadstart( FileSaver.createEvent( "loadstart", this) );

            var me = this;

            // Lets read the file...
            Cordova.exec(function( p_data ) {
                             me.readyState = FileReader.DONE;
                             me.result = p_data;

                             if( typeof me.onloadend === "function" ) me.onloadend( FileSaver.createEvent( "loadend", me) );
                         }, function( p_fileError ) {
                             me.readyState = FileReader.DONE;
                             me.result = null;
                             me.error = p_fileError;

                             if( typeof me.onloadend === "function" ) me.onloadend( FileSaver.createEvent( "loadend", me) );
                             if( typeof me.onerror === "function" ) me.onerror( FileSaver.createEvent( "error", me) );
                         }, "com.cordova.File", "readAsDataURL", [file.fullPath]);
        }
FileReader.prototype.abort = function() {
            this.readyState = FileReader.DONE;
            this.result = null;
            this.error = FileError.cast( FileError.ABORT_ERR );

            if( typeof this.onerror === "function" ) this.onerror( FileSaver.createEvent( "error", me) ) ;
            if( typeof this.onabort === "function" ) this.onabort( FileSaver.createEvent( "abort", me) ) ;
            if( typeof this.onloadend === "function" ) this.onloadend( FileSaver.createEvent( "loadend", me) ) ;
        }


/**
 * FileEntry interface
 * (derives from Entry)
 * http://www.w3.org/TR/file-system-api/#the-fileentry-interface
 */
function FileEntry() {
    this.isFile = true;
    this.isDirectory = false;
}

FileEntry.cast = function( filename, path ) {
            var fe = new FileEntry();
            fe.name = filename;
            fe.fullPath = path;

            return fe;
        }

FileEntry.prototype = new Entry();
FileEntry.prototype.createWriter = function( successCallback, errorCallback ) {
            this.file( function(p_file) {
                          successCallback(FileWriter.cast(p_file.fullPath, p_file.size));
                      }, errorCallback);
        }
FileEntry.prototype.file = function( successCallback, errorCallback ) {
            // Lets get the fileinfo
            Cordova.exec(successCallback, errorCallback, "com.cordova.File", "file", [this.fullPath]);
        }

/**
 * DirectoryReader interface
 * http://www.w3.org/TR/file-system-api/#the-directoryreader-interface
 */
function DirectoryReader() {
}

DirectoryReader.cast = function( p_fullPath ) {
            var dr = new DirectoryReader();
            dr.fullPath = p_fullPath;

            return dr;
        }

DirectoryReader.prototype.fullPath = "";	// Not W3C conform, but required
DirectoryReader.prototype.readEntries = function( successCallback, errorCallback ) {
            // Get all entries for the directory
            Cordova.exec(successCallback, errorCallback, "com.cordova.File", "readEntries", [this.fullPath]);
        }

/**
 * DirectoryEntry interface
 * (derives from Entry)
 * http://www.w3.org/TR/file-system-api/#the-directoryentry-interface
 */
function DirectoryEntry() {
    this.isFile = false;
    this.isDirectory = true;
}

DirectoryEntry.cast = function( dirname, path ) {
            var de = new DirectoryEntry();
            de.name = dirname;
            de.fullPath = path;
            return de;
        }

DirectoryEntry.prototype = new Entry();
DirectoryEntry.prototype.createReader = function() {
            return DirectoryReader.cast(this.fullPath);
        }
DirectoryEntry.prototype.getFile = function( path, options, successCallback, errorCallback ) {
            var requestPath = path;

            // Check for a relative path
            if( requestPath.charAt(0) != '/' ) requestPath = this.fullPath + "/" + requestPath;

            // Lets get the file
            Cordova.exec(successCallback, errorCallback, "com.cordova.File", "getFile", [requestPath, options]);
        }
DirectoryEntry.prototype.getDirectory = function( path, options, successCallback, errorCallback ) {
            var requestPath = path;

            // Check for a relative path
            if( requestPath.charAt(0) != '/' ) requestPath = this.fullPath + "/" + requestPath;

            // Lets get the directory
            Cordova.exec(successCallback, errorCallback, "com.cordova.File", "getDirectory", [requestPath, options]);
        }
DirectoryEntry.prototype.removeRecursively = function( successCallback, errorCallback ) {
            // Remove the directory
            Cordova.exec(successCallback, errorCallback, "com.cordova.File", "removeRecursively", [this.fullPath]);
        }

/**
 * FileSystem interface
 * http://www.w3.org/TR/file-system-api/#the-filesystem-interface
 */
function FileSystem() {
}

FileSystem.cast = function( fsname, dirname, path ) {
            var fs = new FileSystem();
            fs.name = fsname;
            fs.root = DirectoryEntry.cast(dirname, path);

            return fs;
        }

FileSystem.prototype.name = "";
FileSystem.prototype.root = null;	// Should be a DirectoryEntry

/**
 * LocalFileSystem interface
 * http://www.w3.org/TR/file-system-api/#using-localfilesystem
 */
function LocalFileSystem() {
}

LocalFileSystem.TEMPORARY = 0;
LocalFileSystem.PERSISTENT = 1;

LocalFileSystem.prototype.requestFileSystem = function( type, size, successCallback, errorCallback ) {
            Cordova.exec(successCallback, errorCallback, "com.cordova.File", "requestFileSystem", [type,size]);
        }
LocalFileSystem.prototype.resolveLocalFileSystemURL = function( url, successCallback, errorCallback ) {
            Cordova.exec(successCallback, errorCallback, "com.cordova.File", "resolveLocalFileSystemURL", [url]);
        }

/**
 * Let window implement the localfilesystem
 */
Cordova.addConstructor( "com.cordova.File", function () {
                           var localFileSystem = new LocalFileSystem();
                           window.requestFileSystem = localFileSystem.requestFileSystem;
                           window.resolveLocalFileSystemURI = localFileSystem.resolveLocalFileSystemURL;
                       } );
