/*
 * cookieのサンプルって、どれを見ても名前はURLEncodingしていないのだけど、
 * それってありなのでしょうか？格納するときにすべての値が変換されていない
 * とRFC違反のような気がします。
*/


/**
 * クッキーをセットする。
 * 
 * @method setCookie
 * @param name 名前
 * @param value 値
 * @param expire 有効期限
 * @param domain 対象ドメイン(FQDN可)。
 * クッキーを設定します。
 * IE6 SP、Netscape 7.1、Opera 7.11で確認済みです。
 */
/*
function setCookie(name, value, expire, domain) {
    var e = (expire == null) ? ("") : (";expires=" + expire);
    var content = name + "=" + escape(value) + e;
    document.cookie = content;
}
*/
function setCookie(name, value, expire, domain, path) {
    var e = (expire == null) ? ("") : (";expires=" + expire);
    //var p = (path == null) ? ("") : (";path=" + path);
    var p = ";path=/"; // [*]
    //var p = ";path=/users/yamada/kawaidenki"; // [*]
    var content = name + "=" + escape(value) + e + p;
    document.cookie = content;
}



/**
 * クッキーを削除する。
 * 
 * @method removeCookie
 * @param name 名前
 * クッキーを削除します。
 * IE6 SP、Netscape 7.1、Opera 7.11で確認済みです。
 */
function removeCookie(name) {
    var expire = new Date ();
    expire.setTime(0);
    var content = name + "=;expires=" + expire.toGMTString();
    document.cookie = content;
}

/**
 * クッキーを取得する。
 * unescapeされた値が帰ってくる。
 * 
 * @method getCookie
 * @param name 名前
 * クッキーを取得します。
 * IE6 SP、Netscape 7.1、Opera 7.11で確認済みです。
 */
function getCookie(name) {
    var pattern = name + "=";
    if (document.cookie.length <= 0) {
        return null;
    }
    var cookie = document.cookie;
    var offset = cookie.indexOf(pattern);
    if (offset == -1) {
        return null;
    }
    offset += pattern.length;
    var end = cookie.indexOf(";", offset);
    if (end == -1) {
        end = cookie.length;
    }
    return unescape(document.cookie.substring(offset, end));
}


/**
 * ひとつのcookieにデータを追加する。
 * 
 * @method addToLinerCookie
 * @param name 名前
 * @param value 値
 */
function addToLinerCookie(org, name, value) {
    var datas = getArrayOfLinerCookie(org);
    
    // nameとvalueをorgにくっつける
    var line = "";
    if (datas == null) { // 既存のデータがない時
        line = name + "!" + value;
    } else {                 // 既存のデータがある時
        datas[name] = value;
        for (i in datas) {
            if (i == "") { continue; } // undefinedな値を消す
            
            line += "," + i + "!" + datas[i];
        }
        // 0番目の前についている","を取り除く。
        line = line.substring(1, line.length);
    }
    
    return setCookie(org, line);
}


/**
 * ひとつのcookieからデータを削除する。
 * 
 * @method removeFromLinerCookie
 * @param org もともとのcookieの名前
 * @param name 消したい名前
 * @return 消せた時にはtrue、消せなかった(または存在しなかった時には)falseを返す
 */
function removeFromLinerCookie(org, name) {
    var datas = getArrayOfLinerCookie(org);
    
    // nameとvalueをorgにくっつける
    var line = "";
    var isRemove = false;
    if (datas == null) { // 既存のデータがない時
        return false;
    } else {                 // 既存のデータがある時
        for (i in datas) {
            if (i == "") { continue; } // undefinedな値を消す
            
            if (i == name) {
                isRemove = true;
                continue;
            }
            line += "," + i + "!" + datas[i];
        }
        
        // 0番目の前についている","を取り除く。
        line = line.substring(1, line.length);
    }
    if (isRemove == false) {
        return false;
    }
    
    return setCookie(org, line);
}


/**
 * 1項目に詰まったcookieの中身を表示する。
 * 
 * @method listValue
 * @method name
 * @coMPatibility IE6, NN7.1, NN4.8, Opera7.11
*/
function listValue(name) {
    var list = getArrayOfLinerCookie(name);
    for (i in list) {
        document.writeln(i + ": " + list[i] + "<br>\n");
    }
}


/**
1行にされたcookieを分解して配列を取得する。

@method getArrayOfLinerCookie
@param name
*/
function getArrayOfLinerCookie(name) {
    var value = getCookie(name);
    if (value == null) {
        return null;
    }
    var datas = value.split(",");
    
    // 名前のリストを作る。
    // かぶっている名前はここで消す。
    var names = new Array();
    for (i in datas) {
        var pairs = datas[i].split("!");
        names[pairs[0]] = pairs[1];
    }
    return names;
}



/**
 * 
 *
 * @method getValueFromLinerCookie
 * @param org クッキーの名前
 * @param name クッキー内の項目名
 */
function getValueFromLinerCookie(org, name) {
    var datas = getArrayOfLinerCookie(org);
    
    if (!datas) {
        return null;
    }
    if (datas[name] == undefined) {
        return "";
    }
    return datas[name];
}



/**
 * URLエンコーディングする。
 * 
 * @method doEncoding
 * @param myForm 呼び出すHTML側でthisを指定します。
 * @param src 変換したいタグのnameを指定します。
 * @param dst 変換したいタグのnameを指定します。
 */
function doUrlEcoding(myForm, src, dst) {
    myForm[dst].value = escape(myForm[src].value);
}

/**
 * URLエンコーディングをデコードする。
 * 
 * @method doDencoding
 * @param myForm 呼び出すHTML側でthisを指定します。
 * @param src 変換したいタグのnameを指定します。
 * @param dst 変換したいタグのnameを指定します。
 */
function doUrlDecoding(myForm, src, dst) {
    myForm[dst].value = unescape(myForm[src].value);
}



/**
 * cookieを使ってinputタグの値を補完する
 *
 * 注意：該当の名前のついたタグがないと不明なエラーが出る。
 * エラーメッセージに惑わされずにちゃんと設定しましょう。
 *
 * @method setTagValueByCookie
 * @param cookieName cookieの名前
 * @param formName   フォームの名前
 * @param keys      取りたい項目名一覧が書いてあるタグの名前。値は"name1,name2"といった並びが期待される。
 */
function setTagValueByCookie(cookieName, formName, keys) {
    var myForm = window.document[formName];
    var names = myForm[keys].value;
    var data = names.split(",");
    
    for (x in data) {
        var i = data[x];
        var cookie_value = getValueFromLinerCookie(cookieName, i);
        if (myForm[i].type == "checkbox") {
            myForm[i].checked = cookie_value;
        } else {
            myForm[i].value = cookie_value;
        }
        // myForm[i].value = cookie_value; // IEではダメ
    }
    
    return true;
}
