
/*  compatibility between NodeJS and Rhino  */
if (typeof print === 'undefined')
    print = console.log;
if (typeof console === 'undefined')
    console = { log: print };
if (typeof process !== 'undefined')
    arguments = process.argv.splice(2); 
if (typeof quit === 'undefined')
    quit = process.exit;
if (typeof readFile === 'undefined') {
    var fs = require("fs");
    readFile = function (filename) { return fs.readFileSync(filename, "utf-8"); };
}

(function (a) {
    var options = {
        anon       : false, // if the space may be omitted in anonymous function declarations
        bitwise    : false, // if bitwise operators should be allowed
        browser    : false, // if the standard browser globals should be predefined
        cap        : false, // if upper case HTML should be allowed
        confusion  : false, // if types can be used inconsistently
        'continue' : false, // if the continuation statement should be tolerated
        css        : false, // if CSS workarounds should be tolerated
        debug      : false, // if debugger statements should be allowed
        devel      : false, // if logging should be allowed (console, alert, etc.)
        eqeq       : false, // if == should be allowed
        es5        : false, // if ES5 syntax should be allowed
        evil       : false, // if eval should be allowed
        forin      : false, // if for in statements need not filter
        fragment   : false, // if HTML fragments should be allowed
        indent     : 10,    // the indentation factor
        maxerr     : 1000,  // the maximum number of errors to allow
        maxlen     : 256,   // the maximum length of a source line
        newcap     : false, // if constructor names capitalization is ignored
        node       : false, // if Node.js globals should be predefined
        nomen      : false, // if names may have dangling _
        on         : false, // if HTML event handlers should be allowed
        passfail   : false, // if the scan should stop on first error
        plusplus   : false, // if increment/decrement should be allowed
        properties : false, // if all property names must be declared with /*properties*/
        regexp     : false, // if the . should be allowed in regexp literals
        rhino      : false, // if the Rhino environment globals should be predefined
        undef      : false, // if variables can be declared out of order
        unparam    : false, // if unused parameters should be tolerated
        sloppy     : false, // if the 'use strict'; pragma is optional
        sub        : false, // if all forms of subscript notation are tolerated
        vars       : false, // if multiple var statements per function should be allowed
        white      : false, // if sloppy whitespace is tolerated
        widget     : false, // if the Yahoo Widgets globals should be predefined
        windows    : false  // if MS Windows-specific globals should be predefined
    };

    var k;
    var m
    for (k = 0; k < a.length; k++) {
        if (   a[k].substring(0, 1) != '-'
            && a[k].substring(0, 1) != '+')
            break;
        var name = a[k]
        var value = name.substring(0, 1) == "+" ? true : false;
        name = name.substring(1)
        if ((m = name.match(/^(.+)=(.+)$/))) {
            name  = m[1]
            value = m[2]
        }
        if (options[name] == undefined) {
            print("jslint: ERROR: invalid command line option \"" + a[k] + "\"");
            quit(1);
        }
        options[name] = value
    }

    var e, i, input;
    if (!a[k]) {
        var o = "";
        for (opt in options) {
            if (typeof options[opt] == "boolean")
                o += " [+|-" + opt + "]"
            else
                o += " [+" + opt + "=<value>]"
        }
        print("jslint: USAGE: jslint" + o + " <javascript-file>");
        quit(1);
    }
    input = readFile(a[k]);
    if (!input) {
        print("jslint: ERROR: couldn't open file '" + a[k] + "'.");
        quit(1);
    }
    if (!JSLINT(input, options)) {
        for (i = 0; i < JSLINT.errors.length; i += 1) {
            e = JSLINT.errors[i];
            if (e) {
                print('jslint: ERROR: line ' + e.line + ' character ' +
                        e.character + ': ' + e.reason);
                print(e.evidence || '');
                var prefix = "";
                for (var j = 0; j < e.character - 1; j++)
                    prefix += " ";
                print(prefix + '^');
            }
        }
        quit(2);
    } else
        quit();
}(arguments));

