/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is mozilla.org code.
 *
 * The Initial Developer of the Original Code is
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 1998
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *   Akhil Arora <akhil.arora@sun.com>
 *   Tomi Leppikangas <Tomi.Leppikangas@oulu.fi>
 *   Darin Fisher <darin@meer.net>
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

#ifndef NET_PROXY_PROXY_RESOLVER_SCRIPT_H_
#define NET_PROXY_PROXY_RESOLVER_SCRIPT_H_

// The following code was formatted from:
//   'mozilla/netwerk/base/src/nsProxyAutoConfig.js' (1.55)
//
// Using the command:
//   $ cat nsProxyAutoConfig.js |
//       awk '/var pacUtils/,/EOF/' |
//       sed -e 's/^\s*$/""/g' |
//       sed -e 's/"\s*[+]\s*$/"/g' |
//       sed -e 's/"$/" \\/g' |
//       sed -e 's/\/(ipaddr);/\/.exec(ipaddr);/g' |
//       grep -v '^var pacUtils ='
#define PROXY_RESOLVER_SCRIPT \
  "function dnsDomainIs(host, domain) {\n" \
  "    return (host.length >= domain.length &&\n" \
  "            host.substring(host.length - domain.length) == domain);\n" \
  "}\n" \
  "" \
  "function dnsDomainLevels(host) {\n" \
  "    return host.split('.').length-1;\n" \
  "}\n" \
  "" \
  "function convert_addr(ipchars) {\n" \
  "    var bytes = ipchars.split('.');\n" \
  "    var result = ((bytes[0] & 0xff) << 24) |\n" \
  "                 ((bytes[1] & 0xff) << 16) |\n" \
  "                 ((bytes[2] & 0xff) <<  8) |\n" \
  "                  (bytes[3] & 0xff);\n" \
  "    return result;\n" \
  "}\n" \
  "" \
  "function isInNet(ipaddr, pattern, maskstr) {\n" \
  "    var test = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(ipaddr);\n" \
  "    if (test == null) {\n" \
  "        ipaddr = dnsResolve(ipaddr);\n" \
  "        if (ipaddr == null)\n" \
  "            return false;\n" \
  "    } else if (test[1] > 255 || test[2] > 255 || \n" \
  "               test[3] > 255 || test[4] > 255) {\n" \
  "        return false;    // not an IP address\n" \
  "    }\n" \
  "    var host = convert_addr(ipaddr);\n" \
  "    var pat  = convert_addr(pattern);\n" \
  "    var mask = convert_addr(maskstr);\n" \
  "    return ((host & mask) == (pat & mask));\n" \
  "    \n" \
  "}\n" \
  "" \
  "function isPlainHostName(host) {\n" \
  "    return (host.search('\\\\.') == -1);\n" \
  "}\n" \
  "" \
  "function isResolvable(host) {\n" \
  "    var ip = dnsResolve(host);\n" \
  "    return (ip != null);\n" \
  "}\n" \
  "" \
  "function localHostOrDomainIs(host, hostdom) {\n" \
  "    return (host == hostdom) ||\n" \
  "           (hostdom.lastIndexOf(host + '.', 0) == 0);\n" \
  "}\n" \
  "" \
  "function shExpMatch(url, pattern) {\n" \
  "   pattern = pattern.replace(/\\./g, '\\\\.');\n" \
  "   pattern = pattern.replace(/\\*/g, '.*');\n" \
  "   pattern = pattern.replace(/\\?/g, '.');\n" \
  "   var newRe = new RegExp('^'+pattern+'$');\n" \
  "   return newRe.test(url);\n" \
  "}\n" \
  "" \
  "var wdays = {SUN: 0, MON: 1, TUE: 2, WED: 3, THU: 4, FRI: 5, SAT: 6};\n" \
  "" \
  "var months = {JAN: 0, FEB: 1, MAR: 2, APR: 3, MAY: 4, JUN: 5, JUL: 6, AUG: 7, SEP: 8, OCT: 9, NOV: 10, DEC: 11};\n" \
  "" \
  "function weekdayRange() {\n" \
  "    function getDay(weekday) {\n" \
  "        if (weekday in wdays) {\n" \
  "            return wdays[weekday];\n" \
  "        }\n" \
  "        return -1;\n" \
  "    }\n" \
  "    var date = new Date();\n" \
  "    var argc = arguments.length;\n" \
  "    var wday;\n" \
  "    if (argc < 1)\n" \
  "        return false;\n" \
  "    if (arguments[argc - 1] == 'GMT') {\n" \
  "        argc--;\n" \
  "        wday = date.getUTCDay();\n" \
  "    } else {\n" \
  "        wday = date.getDay();\n" \
  "    }\n" \
  "    var wd1 = getDay(arguments[0]);\n" \
  "    var wd2 = (argc == 2) ? getDay(arguments[1]) : wd1;\n" \
  "    return (wd1 == -1 || wd2 == -1) ? false\n" \
  "                                    : (wd1 <= wday && wday <= wd2);\n" \
  "}\n" \
  "" \
  "function dateRange() {\n" \
  "    function getMonth(name) {\n" \
  "        if (name in months) {\n" \
  "            return months[name];\n" \
  "        }\n" \
  "        return -1;\n" \
  "    }\n" \
  "    var date = new Date();\n" \
  "    var argc = arguments.length;\n" \
  "    if (argc < 1) {\n" \
  "        return false;\n" \
  "    }\n" \
  "    var isGMT = (arguments[argc - 1] == 'GMT');\n" \
  "\n" \
  "    if (isGMT) {\n" \
  "        argc--;\n" \
  "    }\n" \
  "    // function will work even without explict handling of this case\n" \
  "    if (argc == 1) {\n" \
  "        var tmp = parseInt(arguments[0]);\n" \
  "        if (isNaN(tmp)) {\n" \
  "            return ((isGMT ? date.getUTCMonth() : date.getMonth()) ==\n" \
  "getMonth(arguments[0]));\n" \
  "        } else if (tmp < 32) {\n" \
  "            return ((isGMT ? date.getUTCDate() : date.getDate()) == tmp);\n" \
  "        } else { \n" \
  "            return ((isGMT ? date.getUTCFullYear() : date.getFullYear()) ==\n" \
  "tmp);\n" \
  "        }\n" \
  "    }\n" \
  "    var year = date.getFullYear();\n" \
  "    var date1, date2;\n" \
  "    date1 = new Date(year,  0,  1,  0,  0,  0);\n" \
  "    date2 = new Date(year, 11, 31, 23, 59, 59);\n" \
  "    var adjustMonth = false;\n" \
  "    for (var i = 0; i < (argc >> 1); i++) {\n" \
  "        var tmp = parseInt(arguments[i]);\n" \
  "        if (isNaN(tmp)) {\n" \
  "            var mon = getMonth(arguments[i]);\n" \
  "            date1.setMonth(mon);\n" \
  "        } else if (tmp < 32) {\n" \
  "            adjustMonth = (argc <= 2);\n" \
  "            date1.setDate(tmp);\n" \
  "        } else {\n" \
  "            date1.setFullYear(tmp);\n" \
  "        }\n" \
  "    }\n" \
  "    for (var i = (argc >> 1); i < argc; i++) {\n" \
  "        var tmp = parseInt(arguments[i]);\n" \
  "        if (isNaN(tmp)) {\n" \
  "            var mon = getMonth(arguments[i]);\n" \
  "            date2.setMonth(mon);\n" \
  "        } else if (tmp < 32) {\n" \
  "            date2.setDate(tmp);\n" \
  "        } else {\n" \
  "            date2.setFullYear(tmp);\n" \
  "        }\n" \
  "    }\n" \
  "    if (adjustMonth) {\n" \
  "        date1.setMonth(date.getMonth());\n" \
  "        date2.setMonth(date.getMonth());\n" \
  "    }\n" \
  "    if (isGMT) {\n" \
  "    var tmp = date;\n" \
  "        tmp.setFullYear(date.getUTCFullYear());\n" \
  "        tmp.setMonth(date.getUTCMonth());\n" \
  "        tmp.setDate(date.getUTCDate());\n" \
  "        tmp.setHours(date.getUTCHours());\n" \
  "        tmp.setMinutes(date.getUTCMinutes());\n" \
  "        tmp.setSeconds(date.getUTCSeconds());\n" \
  "        date = tmp;\n" \
  "    }\n" \
  "    return ((date1 <= date) && (date <= date2));\n" \
  "}\n" \
  "" \
  "function timeRange() {\n" \
  "    var argc = arguments.length;\n" \
  "    var date = new Date();\n" \
  "    var isGMT= false;\n" \
  "\n" \
  "    if (argc < 1) {\n" \
  "        return false;\n" \
  "    }\n" \
  "    if (arguments[argc - 1] == 'GMT') {\n" \
  "        isGMT = true;\n" \
  "        argc--;\n" \
  "    }\n" \
  "\n" \
  "    var hour = isGMT ? date.getUTCHours() : date.getHours();\n" \
  "    var date1, date2;\n" \
  "    date1 = new Date();\n" \
  "    date2 = new Date();\n" \
  "\n" \
  "    if (argc == 1) {\n" \
  "        return (hour == arguments[0]);\n" \
  "    } else if (argc == 2) {\n" \
  "        return ((arguments[0] <= hour) && (hour <= arguments[1]));\n" \
  "    } else {\n" \
  "        switch (argc) {\n" \
  "        case 6:\n" \
  "            date1.setSeconds(arguments[2]);\n" \
  "            date2.setSeconds(arguments[5]);\n" \
  "        case 4:\n" \
  "            var middle = argc >> 1;\n" \
  "            date1.setHours(arguments[0]);\n" \
  "            date1.setMinutes(arguments[1]);\n" \
  "            date2.setHours(arguments[middle]);\n" \
  "            date2.setMinutes(arguments[middle + 1]);\n" \
  "            if (middle == 2) {\n" \
  "                date2.setSeconds(59);\n" \
  "            }\n" \
  "            break;\n" \
  "        default:\n" \
  "          throw 'timeRange: bad number of arguments'\n" \
  "        }\n" \
  "    }\n" \
  "\n" \
  "    if (isGMT) {\n" \
  "        date.setFullYear(date.getUTCFullYear());\n" \
  "        date.setMonth(date.getUTCMonth());\n" \
  "        date.setDate(date.getUTCDate());\n" \
  "        date.setHours(date.getUTCHours());\n" \
  "        date.setMinutes(date.getUTCMinutes());\n" \
  "        date.setSeconds(date.getUTCSeconds());\n" \
  "    }\n" \
  "    return ((date1 <= date) && (date <= date2));\n" \
  "}\n"

// This is a Microsoft extension to PAC for IPv6, see:
// http://blogs.msdn.com/b/wndp/archive/2006/07/13/ipv6-pac-extensions-v0-9.aspx
#define PROXY_RESOLVER_SCRIPT_EX \
  "function isResolvableEx(host) {\n" \
  "    var ipList = dnsResolveEx(host);\n" \
  "    return (ipList != '');\n" \
  "}\n"

#endif  // NET_PROXY_PROXY_RESOLVER_SCRIPT_H_
