YUI.add('get', function (Y, NAME) {

    /**
    * NodeJS specific Get module used to load remote resources.
    * It contains the same signature as the default Get module so there is no code change needed.
    * @module get-nodejs
    * @class GetNodeJS
    */

    var Module = require('module'),

        path = require('path'),
        fs = require('fs'),
        request = require('request'),
        end = function(cb, msg, result) {
            //Y.log('Get end: ' + cb.onEnd);
            if (Y.Lang.isFunction(cb.onEnd)) {
                cb.onEnd.call(Y, msg, result);
            }
        }, pass = function(cb) {
            //Y.log('Get pass: ' + cb.onSuccess);
            if (Y.Lang.isFunction(cb.onSuccess)) {
                cb.onSuccess.call(Y, cb);
            }
            end(cb, 'success', 'success');
        }, fail = function(cb, er) {
            //Y.log('Get fail: ' + er);
            er.errors = [er];
            if (Y.Lang.isFunction(cb.onFailure)) {
                cb.onFailure.call(Y, er, cb);
            }
            end(cb, er, 'fail');
        };


    Y.Get = function() {
    };

    //Setup the default config base path
    Y.config.base = path.join(__dirname, '../');

    YUI.require = require;
    YUI.process = process;

    /**
    * Takes the raw JS files and wraps them to be executed in the YUI context so they can be loaded
    * into the YUI object
    * @method _exec
    * @private
    * @param {String} data The JS to execute
    * @param {String} url The path to the file that was parsed
    * @param {Function} cb The callback to execute when this is completed
    * @param {Error} cb.err=null Error object
    * @param {String} cb.url The URL that was just parsed
    */

    Y.Get._exec = function(data, url, cb) {
        if (data.charCodeAt(0) === 0xFEFF) {
            data = data.slice(1);
        }

        var mod = new Module(url, module);
        mod.filename = url;
        mod.paths = Module._nodeModulePaths(path.dirname(url));
        if (typeof YUI._getLoadHook === 'function') {
            data = YUI._getLoadHook(data, url);
        }
        mod._compile('module.exports = function (YUI) {' +
            'return (function () {'+ data + '\n;return YUI;}).apply(global);' +
        '};', url);

        /*global YUI:true */
        YUI = mod.exports(YUI);

        mod.loaded = true;

        cb(null, url);
    };

    /**
    * Fetches the content from a remote URL or a file from disc and passes the content
    * off to `_exec` for parsing
    * @method _include
    * @private
    * @param {String} url The URL/File path to fetch the content from
    * @param {Function} cb The callback to fire once the content has been executed via `_exec`
    */
    Y.Get._include = function (url, cb) {
        var cfg,
            mod,
            self = this;

        if (url.match(/^https?:\/\//)) {
            cfg = {
                url: url,
                timeout: self.timeout
            };
            request(cfg, function (err, response, body) {
                if (err) {
                    Y.log(err, 'error', 'get');
                    cb(err, url);
                } else {
                    Y.Get._exec(body, url, cb);
                }
            });
        } else {
            try {
                // Try to resolve paths relative to the module that required yui.
                url = Module._findPath(url, Module._resolveLookupPaths(url, module.parent.parent)[1]);

                if (Y.config.useSync) {
                    //Needs to be in useSync
                    mod = fs.readFileSync(url,'utf8');
                } else {
                    fs.readFile(url, 'utf8', function (err, mod) {
                        if (err) {
                            cb(err, url);
                        } else {
                            Y.Get._exec(mod, url, cb);
                        }
                    });
                    return;
                }
            } catch (err) {
                cb(err, url);
                return;
            }

            Y.Get._exec(mod, url, cb);
        }
    };


    /**
    * Override for Get.script for loading local or remote YUI modules.
    * @method js
    * @param {Array|String} s The URL's to load into this context
    * @param {Object} options Transaction options
    */
    Y.Get.js = function(s, options) {
        var urls = Y.Array(s), url, i, l = urls.length, c= 0,
            check = function() {
                if (c === l) {
                    pass(options);
                }
            };


        /*jshint loopfunc: true */
        for (i=0; i<l; i++) {
            url = urls[i];
            if (Y.Lang.isObject(url)) {
                url = url.url;
            }

            url = url.replace(/'/g, '%27');
            Y.log('URL: ' + url, 'info', 'get');
            Y.Get._include(url, function(err, url) {
                if (!Y.config) {
                    Y.config = {
                        debug: true
                    };
                }
                if (options.onProgress) {
                    options.onProgress.call(options.context || Y, url);
                }
                Y.log('After Load: ' + url, 'info', 'get');
                if (err) {
                    fail(options, err);
                    Y.log('----------------------------------------------------------', 'error', 'get');
                    Y.log(err, 'error', 'get');
                    Y.log('----------------------------------------------------------', 'error', 'get');
                } else {
                    c++;
                    check();
                }
            });
        }

        //Keeping Signature in the browser.
        return {
            execute: function() {}
        };
    };

    /**
    * Alias for `Y.Get.js`
    * @method script
    */
    Y.Get.script = Y.Get.js;

    //Place holder for SS Dom access
    Y.Get.css = function(s, cb) {
        Y.log('Y.Get.css is not supported, just reporting that it has loaded but not fetching.', 'warn', 'get');
        pass(cb);
    };



}, '@VERSION@');
