// -- Initial coding: Aug 31, 1997 by k16 --//



var cookieName = "HTMLLINT";
var cookieVersion = "134"; // FORM のコントロール数等が変化したら増やす
var nHTMLVersions =  "41"; // HTMLヴァージョンの数
var LOADED = false;
var MSIE = navigator.userAgent.indexOf("MSIE");
var noClear;
if (MSIE != -1) {
  MSIE += 5;
  var c = navigator.userAgent.charAt(MSIE);
  MSIE = (c < "0" || c > "9")? 0:
      parseInt(navigator.userAgent.substring(MSIE, navigator.userAgent.length));
  noClear = (MSIE < 4);
} else {
  MSIE = noClear = 0;
}

function DummyArray() {} // Array() は Mozilla3.0 から
var checkersName = new DummyArray();
var checkersCnt = 0;
checkersName[checkersCnt++] = "cant-get-url";
checkersName[checkersCnt++] = "required-doctype";
checkersName[checkersCnt++] = "prectrl-doctype";
checkersName[checkersCnt++] = "doctype-case-mismatch";
checkersName[checkersCnt++] = "unknown-doctype";
checkersName[checkersCnt++] = "unsupported-doctype";
checkersName[checkersCnt++] = "expired-doctype";
checkersName[checkersCnt++] = "obsoleted-doctype";
checkersName[checkersCnt++] = "doctype-mismatch";
checkersName[checkersCnt++] = "misplaced-doctype";
checkersName[checkersCnt++] = "lower-case-doctype";
checkersName[checkersCnt++] = "upper-case-doctype";
checkersName[checkersCnt++] = "empty-systemid";
checkersName[checkersCnt++] = "illegal-systemid";
checkersName[checkersCnt++] = "systemid-case-mismatch";
checkersName[checkersCnt++] = "ignore-declaration";
checkersName[checkersCnt++] = "marked-section";
checkersName[checkersCnt++] = "badstr-in-marked-section";
checkersName[checkersCnt++] = "unclosed-marked-section";
checkersName[checkersCnt++] = "misplaced-xmldecl";
checkersName[checkersCnt++] = "xhtml-xmldecl";
checkersName[checkersCnt++] = "end-xmldecl";
checkersName[checkersCnt++] = "bad-xmldecl";
checkersName[checkersCnt++] = "processing-instruction";
checkersName[checkersCnt++] = "w-hyphens-in-comment";
checkersName[checkersCnt++] = "excluded-w-hyphens-in-comment";
checkersName[checkersCnt++] = "empty-comment";
checkersName[checkersCnt++] = "illegal-comment";
checkersName[checkersCnt++] = "title-comment";
checkersName[checkersCnt++] = "markup-in-comment";
checkersName[checkersCnt++] = "nested-comment";
checkersName[checkersCnt++] = "space-in-closed-comment";
checkersName[checkersCnt++] = "illegal-closed-comment";
checkersName[checkersCnt++] = "unclosed-comment";
checkersName[checkersCnt++] = "unclosed-tag";
checkersName[checkersCnt++] = "leading-whitespace";
checkersName[checkersCnt++] = "unexpected-open";
checkersName[checkersCnt++] = "endtag-slash";
checkersName[checkersCnt++] = "leading-space-endtag-slash";
checkersName[checkersCnt++] = "contain-no-space";
checkersName[checkersCnt++] = "minimized-endtag";
checkersName[checkersCnt++] = "noempty-endtag-slash";
checkersName[checkersCnt++] = "excluded-element";
checkersName[checkersCnt++] = "deprecated-element";
checkersName[checkersCnt++] = "misplaced-element";
checkersName[checkersCnt++] = "once-only";
checkersName[checkersCnt++] = "once-only-group";
checkersName[checkersCnt++] = "must-follow";
checkersName[checkersCnt++] = "must-follow-slight";
checkersName[checkersCnt++] = "required";
checkersName[checkersCnt++] = "empty-container";
checkersName[checkersCnt++] = "space-container";
checkersName[checkersCnt++] = "br-only-container";
checkersName[checkersCnt++] = "unknown-element";
checkersName[checkersCnt++] = "other-html-element";
checkersName[checkersCnt++] = "deprecated-tag";
checkersName[checkersCnt++] = "deprecated-tag-css";
checkersName[checkersCnt++] = "unsupported-tag";
checkersName[checkersCnt++] = "should-not-use";
checkersName[checkersCnt++] = "required-start-tag";
checkersName[checkersCnt++] = "omit-start-tag";
checkersName[checkersCnt++] = "omit-start-tag-trivial";
checkersName[checkersCnt++] = "required-end-tag";
checkersName[checkersCnt++] = "omit-end-tag";
checkersName[checkersCnt++] = "omit-end-tag-trivial";
checkersName[checkersCnt++] = "closing-attribute";
checkersName[checkersCnt++] = "illegal-closing";
checkersName[checkersCnt++] = "container-whitespace";
checkersName[checkersCnt++] = "mis-match";
checkersName[checkersCnt++] = "element-overlap";
checkersName[checkersCnt++] = "tags-nest";
checkersName[checkersCnt++] = "unclosed-element";
checkersName[checkersCnt++] = "unexpected-pcdata";
checkersName[checkersCnt++] = "illegal-attribute";
checkersName[checkersCnt++] = "xhtml-emptytag";
checkersName[checkersCnt++] = "mixed-case";
checkersName[checkersCnt++] = "lower-case-tag";
checkersName[checkersCnt++] = "lower-case-attribute";
checkersName[checkersCnt++] = "unknown-attribute";
checkersName[checkersCnt++] = "other-html-attribute";
checkersName[checkersCnt++] = "deprecated-attribute";
checkersName[checkersCnt++] = "deprecated-attribute-css";
checkersName[checkersCnt++] = "repeated-attribute";
checkersName[checkersCnt++] = "required-attribute";
checkersName[checkersCnt++] = "required-attribute-pair";
checkersName[checkersCnt++] = "nomixed-attribute";
checkersName[checkersCnt++] = "unsupported-attribute";
checkersName[checkersCnt++] = "leading-space-attribute";
checkersName[checkersCnt++] = "required-value";
checkersName[checkersCnt++] = "no-attribute-value";
checkersName[checkersCnt++] = "across-lines-attribute";
checkersName[checkersCnt++] = "space-around-equal";
checkersName[checkersCnt++] = "unclosed-quotes";
checkersName[checkersCnt++] = "attribute-delimiter";
checkersName[checkersCnt++] = "quote-attribute-value";
checkersName[checkersCnt++] = "recommend-quote-attribute-value";
checkersName[checkersCnt++] = "bare-attribute-value";
checkersName[checkersCnt++] = "whitespace-attribute-value";
checkersName[checkersCnt++] = "deprecated-value";
checkersName[checkersCnt++] = "empty-value";
checkersName[checkersCnt++] = "attribute-length";
checkersName[checkersCnt++] = "attribute-format";
checkersName[checkersCnt++] = "attribute-color";
checkersName[checkersCnt++] = "profile-uri";
checkersName[checkersCnt++] = "unsafe-attribute";
checkersName[checkersCnt++] = "attribute-value-case";
checkersName[checkersCnt++] = "fixed-attribute";
checkersName[checkersCnt++] = "minimized-attribute";
checkersName[checkersCnt++] = "no-minimization";
checkersName[checkersCnt++] = "omit-attribute-name";
checkersName[checkersCnt++] = "required-semicolon";
checkersName[checkersCnt++] = "apos";
checkersName[checkersCnt++] = "lower-x";
checkersName[checkersCnt++] = "bad-entity";
checkersName[checkersCnt++] = "over-ref-charset";
checkersName[checkersCnt++] = "no-ref-charset";
checkersName[checkersCnt++] = "literal-metacharacter";
checkersName[checkersCnt++] = "double-quote-in-text";
checkersName[checkersCnt++] = "html-lang";
checkersName[checkersCnt++] = "lang";
checkersName[checkersCnt++] = "lang-mismatch";
checkersName[checkersCnt++] = "lang-attribute";
checkersName[checkersCnt++] = "lang-pcdata";
checkersName[checkersCnt++] = "mailto-link";
checkersName[checkersCnt++] = "navigation-link";
checkersName[checkersCnt++] = "mistype-links";
checkersName[checkersCnt++] = "robots-content";
checkersName[checkersCnt++] = "content-type";
checkersName[checkersCnt++] = "no-registered-charset";
checkersName[checkersCnt++] = "no-charset";
checkersName[checkersCnt++] = "non-ascii-early";
checkersName[checkersCnt++] = "non-ascii";
checkersName[checkersCnt++] = "ctrl-character";
checkersName[checkersCnt++] = "han-katakana";
checkersName[checkersCnt++] = "bad-jis-x0208";
checkersName[checkersCnt++] = "bom";
checkersName[checkersCnt++] = "xml-encoding";
checkersName[checkersCnt++] = "charset-mismatch";
checkersName[checkersCnt++] = "conflict-charset";
checkersName[checkersCnt++] = "http-head-charset";
checkersName[checkersCnt++] = "no-text-html";
checkersName[checkersCnt++] = "conflict-mime";
checkersName[checkersCnt++] = "unrecommended-mime";
checkersName[checkersCnt++] = "xml-http-equiv";
checkersName[checkersCnt++] = "existing-content-type";
checkersName[checkersCnt++] = "content-xxxx-type";
checkersName[checkersCnt++] = "need-content-xxxx-type";
checkersName[checkersCnt++] = "meta-http-equiv-name";
checkersName[checkersCnt++] = "meta-no-http-equiv-name";
checkersName[checkersCnt++] = "event-pair";
checkersName[checkersCnt++] = "refresh";
checkersName[checkersCnt++] = "refresh-link";
checkersName[checkersCnt++] = "comment-element";
checkersName[checkersCnt++] = "etago-in-cdata";
checkersName[checkersCnt++] = "embedded-in-cdata";
checkersName[checkersCnt++] = "comment-in-stylescript";
checkersName[checkersCnt++] = "no-noscript";
checkersName[checkersCnt++] = "title-length";
checkersName[checkersCnt++] = "body-color";
checkersName[checkersCnt++] = "background";
checkersName[checkersCnt++] = "same-bgcolor";
checkersName[checkersCnt++] = "near-bgcolor";
checkersName[checkersCnt++] = "repeated-id";
checkersName[checkersCnt++] = "undef-id";
checkersName[checkersCnt++] = "repeated-name";
checkersName[checkersCnt++] = "fieldset-whitespace";
checkersName[checkersCnt++] = "multiple-checked";
checkersName[checkersCnt++] = "no-checked";
checkersName[checkersCnt++] = "no-selected";
checkersName[checkersCnt++] = "multiple-selected";
checkersName[checkersCnt++] = "over-select-options";
checkersName[checkersCnt++] = "default-text";
checkersName[checkersCnt++] = "input-type";
checkersName[checkersCnt++] = "button-usemap";
checkersName[checkersCnt++] = "label-control";
checkersName[checkersCnt++] = "label-no-control";
checkersName[checkersCnt++] = "label-for-control";
checkersName[checkersCnt++] = "form-tabindex";
checkersName[checkersCnt++] = "form-accesskey";
checkersName[checkersCnt++] = "recommended-title";
checkersName[checkersCnt++] = "object-text-equivalent";
checkersName[checkersCnt++] = "applet-text-equivalent";
checkersName[checkersCnt++] = "alt-spaces";
checkersName[checkersCnt++] = "img-alt";
checkersName[checkersCnt++] = "img-size";
checkersName[checkersCnt++] = "img-map";
checkersName[checkersCnt++] = "server-side-image-map";
checkersName[checkersCnt++] = "table-summary";
checkersName[checkersCnt++] = "abbr-header-label";
checkersName[checkersCnt++] = "colgroup-span";
checkersName[checkersCnt++] = "overlap-cells";
checkersName[checkersCnt++] = "no-noframes";
checkersName[checkersCnt++] = "same-document-frameset";
checkersName[checkersCnt++] = "frame-image";
checkersName[checkersCnt++] = "frame-title";
checkersName[checkersCnt++] = "existing-target-name";
checkersName[checkersCnt++] = "reserved-target-name";
checkersName[checkersCnt++] = "reserved-target-name-upper";
checkersName[checkersCnt++] = "illegal-target-name";
checkersName[checkersCnt++] = "physical-font";
checkersName[checkersCnt++] = "p-isnot-br";
checkersName[checkersCnt++] = "continuous-brs";
checkersName[checkersCnt++] = "tab-in-pre";
checkersName[checkersCnt++] = "heading-order";
checkersName[checkersCnt++] = "heading-text-equivalent";
checkersName[checkersCnt++] = "link-separation";
checkersName[checkersCnt++] = "link-accesskey";
checkersName[checkersCnt++] = "link-text-equivalent";
checkersName[checkersCnt++] = "d-link";
checkersName[checkersCnt++] = "same-link-text";
checkersName[checkersCnt++] = "here-anchor";
checkersName[checkersCnt++] = "here-anchor-alt";
checkersName[checkersCnt++] = "fragment-id-whitespace";
checkersName[checkersCnt++] = "unsafe-fragment-id";
checkersName[checkersCnt++] = "empty-fragment-id";
checkersName[checkersCnt++] = "existing-fragment-id";
checkersName[checkersCnt++] = "case-insensitive-fragment-id";
checkersName[checkersCnt++] = "same-fragment-id";
checkersName[checkersCnt++] = "id-link";
checkersName[checkersCnt++] = "diff-id-link";
checkersName[checkersCnt++] = "need-id-name";
checkersName[checkersCnt++] = "lower-id";
checkersName[checkersCnt++] = "bad-link";
checkersName[checkersCnt++] = "unref-link";
checkersName[checkersCnt++] = "empty-url";
checkersName[checkersCnt++] = "url-whitespace";
checkersName[checkersCnt++] = "url-backslash";
checkersName[checkersCnt++] = "unsafe-url";
checkersName[checkersCnt++] = "excluded-url";
checkersName[checkersCnt++] = "excluded-url-ref";
checkersName[checkersCnt++] = "no-corresponding-url";
checkersName[checkersCnt++] = "illegal-protocol";
checkersName[checkersCnt++] = "unknown-protocol";
checkersName[checkersCnt++] = "upper-protocol";
checkersName[checkersCnt++] = "local-protocol";
checkersName[checkersCnt++] = "cantuse-protocol";
checkersName[checkersCnt++] = "javascript-url";
checkersName[checkersCnt++] = "illegal-format-url";
checkersName[checkersCnt++] = "trailing-slash";
checkersName[checkersCnt++] = "net-path";
checkersName[checkersCnt++] = "conflict-directory";
checkersName[checkersCnt++] = "index-html";
checkersName[checkersCnt++] = "later-base";
checkersName[checkersCnt++] = "absolute-base-url";
checkersName[checkersCnt++] = "unexpected-end-of-html";
checkersName[checkersCnt++] = "over-file-size";
checkersName[checkersCnt++] = "unsupported-image";
checkersName[checkersCnt++] = "jskyweb-olul";
checkersName[checkersCnt++] = "jskyweb-li";
checkersName[checkersCnt++] = "jpo-no-html";
checkersName[checkersCnt++] = "jpo-shift-jis";
checkersName[checkersCnt++] = "jpo-bad-char";

function SetCookie(name, cookie, expires)
{
  if (expires) {
    expires = new Date();
    expires.setTime(expires.getTime()+(7*24*60*60*1000)); // 有効一週間
    expires = "; expires=" + expires.toGMTString()
  } else {
    expires = "";
  }
  document.cookie = name + "=" + escape(cookie) + expires;
}

function GetCookie(name)
{
  var cookie = " " + document.cookie;
  var search = " " + name + "=";
  var offset = cookie.indexOf(search);
  if (offset == -1) return "";
  offset += search.length;
  var end = cookie.indexOf(";", offset);
  if (end == -1) end = cookie.length;
  return unescape(cookie.substring(offset, end));
}

function GetRadio(radio, n)
{
  while (--n) if (radio[n].checked) return n+"";
  return "0";
}

function GetCheck(checkbox)
{
  return checkbox.checked? "1": "0";
}

// onUnload でこの関数を呼び出すのは危険
function SaveCookies()
{
  if (noClear || !LOADED) return;
  var lintform = document.forms[0];
  var url = lintform.URL.value;
  if (url.indexOf(" ", 0) != -1) return;
  var cookie = cookieVersion+" "+url
             +" "+GetRadio(lintform.Method, 3)
                 +GetRadio(lintform.CharCode, 5)
                 +GetRadio(lintform.TextView, 3)
                 +GetCheck(lintform.NoWarnings)
                 +GetCheck(lintform.ViewSource)
                 +GetCheck(lintform.IgnoreDOCTYPE)
                 +GetCheck(lintform.HTTPHeader)
                 +GetCheck(lintform.OtherWindow)
             +" "+GetRadio(lintform.HTMLVersion, nHTMLVersions)
             +" "+GetCheck(lintform.Pedantic)
                 +GetCheck(lintform.NoReligious)
                 +GetCheck(lintform.NoAccessibility)
                 +GetCheck(lintform.CheckGET);
  for (var k = 0; k < checkersCnt; k++)
    cookie += GetCheck(lintform[checkersName[k]]);
  cookie += " "+lintform.TimeOut.value;
  SetCookie(cookieName, cookie, true);
}

function ClearCookies()
{
  if (noClear) return;
  SetCookie(cookieName, "0", false);
}

function SetRadio(n, i, radio)
{
  n = n.substring(i, i+1);
  if (n != null) radio[n].checked = true;
  return i+1;
}

function SetCheck(n, i, checkbox)
{
  n = n.substring(i, i+1);
  if (n == "0") checkbox.checked = false;
  if (n == "1") checkbox.checked = true;
  return i+1;
}

function CheckZeroOne(str)
{
  for (var i = 0; i < str.length; i++) {
    var v = str.substring(i, i+1);
    if (v != "0" && v != "1") return false;
  }
  return true;
}

function LoadCookies()
{
  if (noClear || LOADED) return;
  var cookie = GetCookie(cookieName);
  var values = new DummyArray();
  var i, j, n;
  i = n = 0;
  while (i < cookie.length) {
    j = cookie.indexOf(" ", i);
    values[n++] = cookie.substring(i, (j == -1)? cookie.length: j);
    i = j + 1;
    if (i == 0) break;
  }
  if (values[0] == cookieVersion) {
    if (CheckZeroOne(values[2]) && CheckZeroOne(values[4])) {
      var lintform = document.forms[0];
      if (values[1] != null) lintform.URL.value = values[1];
      if (values[2] != null) {
        n = values[2]+"";
        i = SetRadio(n, 0, lintform.Method);
        i = SetRadio(n, i, lintform.CharCode);
        i = SetRadio(n, i, lintform.TextView);
        i = SetCheck(n, i, lintform.NoWarnings);
        i = SetCheck(n, i, lintform.ViewSource);
        i = SetCheck(n, i, lintform.IgnoreDOCTYPE);
        i = SetCheck(n, i, lintform.HTTPHeader);
        i = SetCheck(n, i, lintform.OtherWindow);
      }
      if (values[3] != null) lintform.HTMLVersion[values[3]].checked = true;
      if (values[4] != null) {
        n = values[4]+"";
        i = SetCheck(n, 0, lintform.Pedantic);
        i = SetCheck(n, i, lintform.NoReligious);
        i = SetCheck(n, i, lintform.NoAccessibility);
        i = SetCheck(n, i, lintform.CheckGET);
        for (var k = 0; k < checkersCnt; k++)
          i = SetCheck(n, i, lintform[checkersName[k]]);
      }
      if (values[5] != null) lintform.TimeOut.value = values[5];
      SetCookie(cookieName, cookie, true);
    }
  }
  LOADED = true;
}

// クリアの   "ア" のJISコードは 2522 なので 'ア' とする必要がある。
// チェックの "ェ" のJISコードは 2527 なので "ェ" とする必要がある。
// 項目の     "目" のJISコードは 4C5C である。
// ボタンの   "ボ" のJISコードは 255C である。
// JISでは全角半角の間にエスケープが入るので "ボ\" としてもうまくいかない。
function GuideText()
{
  if (!noClear) document.writeln('[クリア] はそれぞれの内容を消去します。');
  document.writeln("現在のチェックオプションは ", checkersCnt, "種類です。");
}

function ClearButton(name)
{
  if (noClear) return;
  var obj = "document.forms[0].elements['"+name+"']";
  document.writeln('　<input type="button" ',
                    'onclick="', obj, ".value = ''; ", obj, '.focus()" ',
                    'onkeypress="', obj, ".value = ''; ", obj, '.focus()" ',
                    'value="クリア">');
}

window.onload = LoadCookies;

