class File

def self.basename(path)

def self.basename(path)
  (offset = path.rindex SEPARATOR) ? path[(offset + 1)..-1] : path
end

def self.dirname(path)

def self.dirname(path)
  (offset = path.rindex SEPARATOR) ? path[0..(offset - 1)] : '.'
end

def self.expand_path(path)

def self.expand_path(path)
  path
end

def self.extname(path)

def self.extname(path)
  return '' if path.nil_or_empty?
  last_dot_idx = path[1..-1].rindex('.')
  last_dot_idx.nil? ? '' : path[(last_dot_idx + 1)..-1]
end

def self.file?(path)

TODO use XMLHttpRequest HEAD request unless in local file mode
def self.file?(path)
  true
end

def self.join(*paths)

def self.join(*paths)
  paths * SEPARATOR
end

def self.read(path)

def self.read(path)
  %x{
    var data = ''
    var status = -1;
    try {
      var xhr = new XMLHttpRequest();
      xhr.open('GET', path, false);
      xhr.addEventListener('load', function() {
        status = this.status;
        // status is 0 for local file mode (i.e., file://)
        if (status == 0 || status == 200) {
          data = this.responseText;
        }
      });
      xhr.overrideMimeType('text/plain');
      xhr.send();
    }
    catch (e) {
      status = 0;
    }
    // assume that no data in local file mode means it doesn't exist
    if (status == 404 || (status == 0 && data == '')) {
      throw #{IOError.new `'No such file or directory: ' + path`};
    }
  }
  `data`
end

def each_line(separator = $/, &block)

def each_line(separator = $/, &block)
  if @eof
    return block_given? ? self : [].to_enum
  end
  if block_given?
    lines = File.read(@path)
    %x{
      self.eof = false;
      self.lineno = 0; 
      var chomped  = #{lines.chomp},
          trailing = lines.length != chomped.length,
          splitted = chomped.split(separator);
      for (var i = 0, length = splitted.length; i < length; i++) {
        self.lineno += 1;
        if (i < length - 1 || trailing) {
          #{yield `splitted[i] + separator`};
        }
        else {
          #{yield `splitted[i]`};
        }
      }
      self.eof = true;
    }
    self
  else
    read.each_line
  end
end

def initialize(path, mode = 'r')

def initialize(path, mode = 'r')
  @path = path
  @contents = nil
  @eof = false
  @lineno = 0
end

def read

def read
  if @eof
    ''
  else
    res = File.read(@path)
    @eof = true
    @lineno = res.size
    res
  end
end