exports.executeJsRunner = function(specCollection, done, jasmineEnv, setupFile) {
  var specs,
      specLoader = require('./requirejs-spec-loader'),
      requirejs = require('requirejs'),
      vm = require('vm'),
      fs = require('fs'),
      coffeescript = require('coffee-script'),
      template = fs.readFileSync(
        setupFile || (__dirname + '/requirejs-wrapper-template.js'),
        'utf8'
      ),
      ensureUnixPath = function(path){
        return path.replace(/^(.):/, '/$1').replace(/\\/g, '/');
      },
      buildNewContext = function(spec){
        var context = {
          describe: describe,
          it: it,
          xdescribe: xdescribe,
          xit: xit,
          beforeEach: beforeEach,
          afterEach: afterEach,
          spyOn: spyOn,
          waitsFor: waitsFor,
          waits: waits,
          runs: runs,
          jasmine: jasmine,
          expect: expect,
          require: require,
          console: console,
          process: process,
          module: module,
          specLoader: specLoader,
          __dirname: spec.directory(),
          __filename: spec.path(),
          baseUrl: buildRelativeDirName(spec.directory()),
          csPath: __dirname + '/cs'
        };

        context.global = context;

        return context;
      },
      buildRelativeDirName = function(dir){
        var retVal = "",
            thisDir = ensureUnixPath(process.cwd()),
            toDir = ensureUnixPath(dir).split('/'),
            index = 0;

        thisDir = thisDir.split('/');

        for(; index < thisDir.length || index < toDir.length; index++) {
          if(thisDir[index] != toDir[index]){
            for(var i = index; i < thisDir.length-1; i++){
              retVal += '../';
            }

            for(var i = index; i < toDir.length; i++){
              retVal += toDir[i] + '/';
            }

            break;
          }
        }

        return retVal.trim('/');
      };

  specCollection.getSpecs().forEach(function(s){
    var script = fs.readFileSync(s.path(), 'utf8');

    if (s.filename().substr(-6).toLowerCase() == 'coffee') {
      script = coffeescript.compile(script);
    }

    var newContext = buildNewContext(s);
    newContext.setTimeout = jasmine.getGlobal().setTimeout;
    newContext.setInterval = jasmine.getGlobal().setInterval;

    var vmContext = vm.createContext(newContext);
    vm.runInContext(template, vmContext);
    vm.runInContext(script, vmContext, s.path());
  });

  specLoader.executeWhenAllSpecsAreComplete(jasmineEnv);
};
