(function() {
  var generator, getSplitName, method, pauseAndRun, _i, _len, _ref;
  var __slice = Array.prototype.slice;

  if (!(typeof jasmine !== "undefined" && jasmine !== null)) {
    throw new Error("jasmine not laoded!");
  }

  if (window.JHW) {
    getSplitName = function(parts) {
      parts.push(String(this.description).replace(/[\n\r]/g, ' '));
      return parts;
    };
    jasmine.Suite.prototype.getSuiteSplitName = function() {
      return this.getSplitName(this.parentSuite ? this.parentSuite.getSuiteSplitName() : []);
    };
    jasmine.Spec.prototype.getSpecSplitName = function() {
      return this.getSplitName(this.suite.getSuiteSplitName());
    };
    jasmine.Suite.prototype.getSplitName = getSplitName;
    jasmine.Spec.prototype.getSplitName = getSplitName;
    jasmine.Spec.prototype.getJHWSpecInformation = function() {
      var parts, specLineInfo;
      parts = this.getSpecSplitName();
      specLineInfo = HeadlessReporterResult.findSpecLine(parts);
      if (specLineInfo.file) {
        parts.push("" + specLineInfo.file + ":" + specLineInfo.lineNumber);
      } else {
        parts.push('');
      }
      return parts.join("||");
    };
    jasmine.Spec.prototype.finishCallback = function() {
      JHW.ping();
      return this.env.reporter.reportSpecResults(this);
    };
    jasmine.Spec.prototype.fail = function(e) {
      var expectationResult, filename, realFilename;
      if (e && e.sourceURL && window.CoffeeScriptToFilename) {
        filename = e.sourceURL.split('/').pop();
        if (realFilename = window.CoffeeScriptToFilename[filename]) {
          e = {
            name: e.name,
            message: e.message,
            lineNumber: "~" + String(e.line),
            sourceURL: realFilename
          };
        }
      }
      expectationResult = new jasmine.ExpectationResult({
        passed: false,
        message: e ? jasmine.util.formatException(e) : 'Exception',
        trace: {
          stack: e.stack
        }
      });
      return this.results_.addResult(expectationResult);
    };
    jasmine.NestedResults.isValidSpecLine = function(line) {
      return line.match(/^\s*expect/) !== null || line.match(/^\s*return\s*expect/) !== null;
    };
    jasmine.NestedResults.parseFunction = function(func) {
      var line, lineCount, lines, _i, _len, _ref;
      lines = [];
      lineCount = 0;
      _ref = func.split("\n");
      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        line = _ref[_i];
        if (jasmine.NestedResults.isValidSpecLine(line)) {
          line = line.replace(/^\s*/, '').replace(/\s*$/, '').replace(/^return\s*/, '');
          lines.push([line, lineCount]);
        }
        lineCount += 1;
      }
      return lines;
    };
    jasmine.NestedResults.parseAndStore = function(func) {
      if (!jasmine.NestedResults.ParsedFunctions[func]) {
        jasmine.NestedResults.ParsedFunctions[func] = jasmine.NestedResults.parseFunction(func);
      }
      return jasmine.NestedResults.ParsedFunctions[func];
    };
    jasmine.NestedResults.ParsedFunctions = [];
    if (!jasmine.WaitsBlock.prototype._execute) {
      jasmine.WaitsBlock.prototype._execute = jasmine.WaitsBlock.prototype.execute;
      jasmine.WaitsForBlock.prototype._execute = jasmine.WaitsForBlock.prototype.execute;
      pauseAndRun = function(onComplete) {
        JHW.timerPause();
        jasmine.getEnv().reporter.reportSpecWaiting();
        return this._execute(function() {
          jasmine.getEnv().reporter.reportSpecRunning();
          JHW.timerDone();
          return onComplete();
        });
      };
      jasmine.WaitsBlock.prototype.execute = pauseAndRun;
      jasmine.WaitsForBlock.prototype.execute = pauseAndRun;
      jasmine.NestedResults.prototype.addResult_ = jasmine.NestedResults.prototype.addResult;
      jasmine.NestedResults.prototype.addResult = function(result) {
        result.expectations = [];
        result.expectations = jasmine.NestedResults.parseAndStore(arguments.callee.caller.caller.caller.toString());
        return this.addResult_(result);
      };
      _ref = ["reportSpecWaiting", "reportSpecRunning"];
      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        method = _ref[_i];
        generator = function(method) {
          return function() {
            var args, reporter, _j, _len2, _ref2, _results;
            args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
            _ref2 = this.subReporters_;
            _results = [];
            for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
              reporter = _ref2[_j];
              if (reporter[method] != null) {
                _results.push(reporter[method].apply(reporter, args));
              } else {
                _results.push(void 0);
              }
            }
            return _results;
          };
        };
        jasmine.MultiReporter.prototype[method] = generator(method);
      }
    }
  }

}).call(this);