/**
 * common.js
 *
 * @description グローバル関数
 * Utility関数を集めたもの
 *
 * @require jquery
 */

/**
 * debug
 * @description console.logを利用したデバッグ用関数
 * @param String mes デバッグ表示対象値
 * @param String name デバックログ名
 */
function debug(mes,name) {
    if (typeof console == 'object'
        && typeof console.log == 'function'
        && is_debug) {
        if (name && typeof name == 'string') {
            console.log('--- Debug : ' + name);
            console.log(mes);
            console.log('-------------');
        } else {
            console.log(mes);
        }
    }
};

/**
 * postHref
 * @description GETではなくPOSTを行う関数
 * @param String url POST先URL
 */
function postHref(url) {
    $('form#postHref').remove();
    var form_html = '<form id="postHref" action="' + url + '" method="POST" >'
        + '</form>'
    $('body').append($('<div>').html(form_html));
    $('form#postHref').submit();
}

/**
 * error_handler
 * @description エラーメッセージ送信用関数
 * @param String e エラーメッセージ
 * @param Object option オプション
 */
function error_handler(e,option) {
    $('form#error_handler').remove();
    if (option == undefined) {
        var option = {
            file:'js',
            line:0,
            error_type:'system'
        };
    }
    var form_html = '<form id="error_handler" action="' + global.baseUrl + 'logs/sys_js_error' + '" method="POST" >'
        + '<input type="hidden" name="message" value="' + e + '" />'
        + '<input type="hidden" name="type" value="' + 99 + '" />'
        + '<input type="hidden" name="file" value="' + option['file'] + '" />'
        + '<input type="hidden" name="line" value="' + option['line'] + '" />'
        + '<input type="hidden" name="error_type" value="' + option['error_type'] + '" />'
        + '</form>'
    $('body').append($('<div>').html(form_html));

    if (document.URL.match(/carts/)) {
        if (is_debug) {
            alert(e);
            debug(option);
        } else {
            //alert(e);
            debug(option);
            $('form#error_handler').submit();
        }
    } else {
        debug(e);
        debug(option);
    }
}

/**
 * Array.map
 * @description IE用にArray.mapを再定義
 *
 */
if (!Array.map) {
    if (!Array.prototype.map) {
        Array.prototype.map = function (callback, thisObject) {
            var length = this.length;
            var result = new Array(length);
            for (var i = 0; i < length; i++)
                result[i] = callback.call(thisObject, this[i], i, this);
            return result;
        };
    }
    Array.map = function (array, callback, thisObject) {
        return Array.prototype.map.call(array, callback, thisObject);
    };
};


/**
 * Array.forEach
 * @description IE用にArray.forEachを再定義
 *
 */
function ArrayForEach(callback,  // @param Function: evaluator
                      thisArg) { // @param ThisObject(= undefined):
    for (var i = 0, iz = this.length; i < iz; ++i) {
        (i in this) && callback.call(thisArg, this[i], i, this);
    }
}
Array.prototype.forEach || (Array.prototype.forEach = ArrayForEach);


/**
 * Object.clone
 * @description Objectをハードコピーする
 * @param Object obj
 * @return Object
 */
Object.clone = function(obj){
    return (typeof uneval == "function") ? eval(uneval(obj)) : eval('(' + $.toJSON(obj) + ')');
};

/**
 * Object.size
 * @description Objectのキーの数をカウントする
 * @param Object obj
 * @return Object
 */
Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

/**
 * toHankakuNumber
 * @description 全角数字を半角数字に変換
 * @param String current
 * @return String 変換後文字列
 */
function toHankakuNumber(current) {
    if (!current) {
        return '';
    }
    han = "0123456789.,-+";
    zen = "０１２３４５６７８９．，－＋";
    str = "";
    for (i=0; i < current.length; i++) {
        c = current.charAt(i);
        n = zen.indexOf(c,0);
        if (n >= 0) {
            c = han.charAt(n);
        }
        str += c;
    }
    return str;
}

/**
 * toKatakanaToHiragana
 * @description 全角カタカナを全角ひらがなに変換
 * @param String current
 * @return String 変換後文字列
 */
function toKatakanaToHiragana(current) {
    var str = new String;
    var len = current.length;
    for (var i = 0; i < len; i++) {
        var c = current.charCodeAt(i);
        if (_isKatakana(c)) {
            str += String.fromCharCode(c - 96);
        } else {
            str += current.charAt(i);
        }
    }
    return str;
}
function _isHiragana(c) { return ((c >= 12353 && c <= 12435) || c == 12445 || c == 12446); }
function _isKatakana(c) { return ((c >= 12449 && c <= 12531) || c == 12541 || c == 12542); }

/**
 * trimHyphen
 * @description ハイフンを削除する
 * @param String current
 * @return String 変換後文字列
 */
function trimHyphen(current) {
    return current.replace(/[-ー−─]/g,'');
}

/**
 * commaNumber
 * @description 千位毎にカンマ (",") を追加する
 * @param String current
 * @return String 変換後文字列
 */
function commaNumber(current) {
    return new String(current).replace(/((?:^[-+])?\d{1,3})(?=(?:\d{3})+(?!\d))/g, '$1,');
}

/**
 * uncommaNumber
 * @description カンマ (",") を取り除く
 * @param String current
 * @return String 変換後文字列
 */
function uncommaNumber(current) {
    return new Number($.trim(current.replace(/,/g, '')));
}

/**
 * date
 * @description PHPのdate()の移植
 */
function date ( format, timestamp ) {
    // Format a local date/time
    //
    // version: 910.813
    // discuss at: http://phpjs.org/functions/date
    // +   original by: Carlos R. L. Rodrigues (http://www.jsfromhell.com)
    // +      parts by: Peter-Paul Koch (http://www.quirksmode.org/js/beat.html)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: MeEtc (http://yass.meetcweb.com)
    // +   improved by: Brad Touesnard
    // +   improved by: Tim Wiel
    // +   improved by: Bryan Elliott
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   improved by: David Randall
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +  derived from: gettimeofday
    // +      input by: majak
    // +   bugfixed by: majak
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   input by: Alex
    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
    // %        note 1: Uses global: php_js to store the default timezone
    // *     example 1: date('H:m:s \\m \\i\\s \\m\\o\\n\\t\\h', 1062402400);
    // *     returns 1: '09:09:40 m is month'
    // *     example 2: date('F j, Y, g:i a', 1062462400);
    // *     returns 2: 'September 2, 2003, 2:26 am'
    // *     example 3: date('Y W o', 1062462400);
    // *     returns 3: '2003 36 2003'
    // *     example 4: x = date('Y m d', (new Date()).getTime()/1000); // 2009 01 09
    // *     example 4: (x+'').length == 10
    // *     returns 4: true
    // *     example 5: date('W', 1104534000);
    // *     returns 5: '53'

    var that = this;
    var jsdate=(
        (typeof(timestamp) == 'undefined') ? new Date() : // Not provided
        (typeof(timestamp) == 'object') ? new Date(timestamp) : // Javascript Date()
        new Date(timestamp*1000) // UNIX timestamp (auto-convert to int)
    ); // , tal=[]
    var pad = function (n, c){
        if ( (n = n + "").length < c ) {
            return new Array(++c - n.length).join("0") + n;
        } else {
            return n;
        }
    };
    var _dst = function (t) {
        // Calculate Daylight Saving Time (derived from gettimeofday() code)
        var dst=0;
        var jan1 = new Date(t.getFullYear(), 0, 1, 0, 0, 0, 0);  // jan 1st
        var june1 = new Date(t.getFullYear(), 6, 1, 0, 0, 0, 0); // june 1st
        var temp = jan1.toUTCString();
        var jan2 = new Date(temp.slice(0, temp.lastIndexOf(' ')-1));
        temp = june1.toUTCString();
        var june2 = new Date(temp.slice(0, temp.lastIndexOf(' ')-1));
        var std_time_offset = (jan1 - jan2) / (1000 * 60 * 60);
        var daylight_time_offset = (june1 - june2) / (1000 * 60 * 60);

        if (std_time_offset === daylight_time_offset) {
            dst = 0; // daylight savings time is NOT observed
        } else {
            // positive is southern, negative is northern hemisphere
            var hemisphere = std_time_offset - daylight_time_offset;
            if (hemisphere >= 0) {
                std_time_offset = daylight_time_offset;
            }
            dst = 1; // daylight savings time is observed
        }
        return dst;
    };
    var ret = '';
    var txt_weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday",
        "Thursday", "Friday", "Saturday"];
    var txt_ordin = {1: "st", 2: "nd", 3: "rd", 21: "st", 22: "nd", 23: "rd", 31: "st"};
    var txt_months =  ["", "January", "February", "March", "April",
        "May", "June", "July", "August", "September", "October", "November",
        "December"];

    var f = {
        // Day
            d: function (){
                return pad(f.j(), 2);
            },
            D: function (){
                var t = f.l();
                return t.substr(0,3);
            },
            j: function (){
                return jsdate.getDate();
            },
            l: function (){
                return txt_weekdays[f.w()];
            },
            N: function (){
                //return f.w() + 1;
                return f.w() ? f.w() : 7;
            },
            S: function (){
                return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th';
            },
            w: function (){
                return jsdate.getDay();
            },
            z: function (){
                return (jsdate - new Date(jsdate.getFullYear() + "/1/1")) / 864e5 >> 0;
            },

        // Week
            W: function (){

                var a = f.z(), b = 364 + f.L() - a;
                var nd2, nd = (new Date(jsdate.getFullYear() + "/1/1").getDay() || 7) - 1;

                if (b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b){
                    return 1;
                }
                if (a <= 2 && nd >= 4 && a >= (6 - nd)){
                    nd2 = new Date(jsdate.getFullYear() - 1 + "/12/31");
                    return that.date("W", Math.round(nd2.getTime()/1000));
                }

                var w = (1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0);

                return (w ? w : 53);
            },

        // Month
            F: function (){
                return txt_months[f.n()];
            },
            m: function (){
                return pad(f.n(), 2);
            },
            M: function (){
                var t = f.F();
                return t.substr(0,3);
            },
            n: function (){
                return jsdate.getMonth() + 1;
            },
            t: function (){
                var n;
                if ( (n = jsdate.getMonth() + 1) == 2 ){
                    return 28 + f.L();
                }
                if ( n & 1 && n < 8 || !(n & 1) && n > 7 ){
                    return 31;
                }
                return 30;
            },

        // Year
            L: function (){
                var y = f.Y();
                return (!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0;
            },
            o: function (){
                if (f.n() === 12 && f.W() === 1) {
                    return jsdate.getFullYear()+1;
                }
                if (f.n() === 1 && f.W() >= 52) {
                    return jsdate.getFullYear()-1;
                }
                return jsdate.getFullYear();
            },
            Y: function (){
                return jsdate.getFullYear();
            },
            y: function (){
                return (jsdate.getFullYear() + "").slice(2);
            },

        // Time
            a: function (){
                return jsdate.getHours() > 11 ? "pm" : "am";
            },
            A: function (){
                return f.a().toUpperCase();
            },
            B: function (){
                // peter paul koch:
                var off = (jsdate.getTimezoneOffset() + 60)*60;
                var theSeconds = (jsdate.getHours() * 3600) +
                                 (jsdate.getMinutes() * 60) +
                                  jsdate.getSeconds() + off;
                var beat = Math.floor(theSeconds/86.4);
                if (beat > 1000) {
                    beat -= 1000;
                }
                if (beat < 0) {
                    beat += 1000;
                }
                if ((String(beat)).length == 1) {
                    beat = "00"+beat;
                }
                if ((String(beat)).length == 2) {
                    beat = "0"+beat;
                }
                return beat;
            },
            g: function (){
                return jsdate.getHours() % 12 || 12;
            },
            G: function (){
                return jsdate.getHours();
            },
            h: function (){
                return pad(f.g(), 2);
            },
            H: function (){
                return pad(jsdate.getHours(), 2);
            },
            i: function (){
                return pad(jsdate.getMinutes(), 2);
            },
            s: function (){
                return pad(jsdate.getSeconds(), 2);
            },
            u: function (){
                return pad(jsdate.getMilliseconds()*1000, 6);
            },

        // Timezone
            e: function () {
/*                var abbr='', i=0;
                if (this.php_js && this.php_js.default_timezone) {
                    return this.php_js.default_timezone;
                }
                if (!tal.length) {
                    tal = this.timezone_abbreviations_list();
                }
                for (abbr in tal) {
                    for (i=0; i < tal[abbr].length; i++) {
                        if (tal[abbr][i].offset === -jsdate.getTimezoneOffset()*60) {
                            return tal[abbr][i].timezone_id;
                        }
                    }
                }
*/
                return 'UTC';
            },
            I: function (){
                return _dst(jsdate);
            },
            O: function (){
               var t = pad(Math.abs(jsdate.getTimezoneOffset()/60*100), 4);
               t = (jsdate.getTimezoneOffset() > 0) ? "-"+t : "+"+t;
               return t;
            },
            P: function (){
                var O = f.O();
                return (O.substr(0, 3) + ":" + O.substr(3, 2));
            },
            T: function () {
/*                var abbr='', i=0;
                if (!tal.length) {
                    tal = that.timezone_abbreviations_list();
                }
                if (this.php_js && this.php_js.default_timezone) {
                    for (abbr in tal) {
                        for (i=0; i < tal[abbr].length; i++) {
                            if (tal[abbr][i].timezone_id === this.php_js.default_timezone) {
                                return abbr.toUpperCase();
                            }
                        }
                    }
                }
                for (abbr in tal) {
                    for (i=0; i < tal[abbr].length; i++) {
                        if (tal[abbr][i].offset === -jsdate.getTimezoneOffset()*60) {
                            return abbr.toUpperCase();
                        }
                    }
                }
*/
                return 'UTC';
            },
            Z: function (){
               return -jsdate.getTimezoneOffset()*60;
            },

        // Full Date/Time
            c: function (){
                return f.Y() + "-" + f.m() + "-" + f.d() + "T" + f.h() + ":" + f.i() + ":" + f.s() + f.P();
            },
            r: function (){
                return f.D()+', '+f.d()+' '+f.M()+' '+f.Y()+' '+f.H()+':'+f.i()+':'+f.s()+' '+f.O();
            },
            U: function (){
                return Math.round(jsdate.getTime()/1000);
            }
    };

    return format.replace(/[\\]?([a-zA-Z])/g, function (t, s){
        if ( t!=s ){
            // escaped
            ret = s;
        } else if (f[s]){
            // a date function exists
            ret = f[s]();
        } else {
            // nothing special
            ret = s;
        }
        return ret;
    });
}

/**
 * strtotime
 * @description PHPのstrtotime()の移植
 */
function strtotime (str, now) {
    // Convert string representation of date and time to a timestamp
    //
    // version: 909.322
    // discuss at: http://phpjs.org/functions/strtotime
    // +   original by: Caio Ariede (http://caioariede.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: David
    // +   improved by: Caio Ariede (http://caioariede.com)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Wagner B. Soares
    // +   bugfixed by: Artur Tchernychev
    // %        note 1: Examples all have a fixed timestamp to prevent tests to fail because of variable time(zones)
    // *     example 1: strtotime('+1 day', 1129633200);
    // *     returns 1: 1129719600
    // *     example 2: strtotime('+1 week 2 days 4 hours 2 seconds', 1129633200);
    // *     returns 2: 1130425202
    // *     example 3: strtotime('last month', 1129633200);
    // *     returns 3: 1127041200
    // *     example 4: strtotime('2009-05-04 08:30:00');
    // *     returns 4: 1241418600

    var i, match, s, strTmp = '', parse = '';

    strTmp = str;
    strTmp = strTmp.replace(/\s{2,}|^\s|\s$/g, ' '); // unecessary spaces
    strTmp = strTmp.replace(/[\t\r\n]/g, ''); // unecessary chars

    if (strTmp == 'now') {
        return (new Date()).getTime()/1000; // Return seconds, not milli-seconds
    } else if (!isNaN(parse = Date.parse(strTmp))) {
        return (parse/1000);
    } else if (now) {
        now = new Date(now*1000); // Accept PHP-style seconds
    } else {
        now = new Date();
    }

    strTmp = strTmp.toLowerCase();

    var __is =
    {
        day:
        {
            'sun': 0,
            'mon': 1,
            'tue': 2,
            'wed': 3,
            'thu': 4,
            'fri': 5,
            'sat': 6
        },
        mon:
        {
            'jan': 0,
            'feb': 1,
            'mar': 2,
            'apr': 3,
            'may': 4,
            'jun': 5,
            'jul': 6,
            'aug': 7,
            'sep': 8,
            'oct': 9,
            'nov': 10,
            'dec': 11
        }
    };

    var process = function (m) {
        var ago = (m[2] && m[2] == 'ago');
        var num = (num = m[0] == 'last' ? -1 : 1) * (ago ? -1 : 1);

        switch (m[0]) {
            case 'last':
            case 'next':
                switch (m[1].substring(0, 3)) {
                    case 'yea':
                        now.setFullYear(now.getFullYear() + num);
                        break;
                    case 'mon':
                        now.setMonth(now.getMonth() + num);
                        break;
                    case 'wee':
                        now.setDate(now.getDate() + (num * 7));
                        break;
                    case 'day':
                        now.setDate(now.getDate() + num);
                        break;
                    case 'hou':
                        now.setHours(now.getHours() + num);
                        break;
                    case 'min':
                        now.setMinutes(now.getMinutes() + num);
                        break;
                    case 'sec':
                        now.setSeconds(now.getSeconds() + num);
                        break;
                    default:
                        var day;
                        if (typeof (day = __is.day[m[1].substring(0, 3)]) != 'undefined') {
                            var diff = day - now.getDay();
                            if (diff == 0) {
                                diff = 7 * num;
                            } else if (diff > 0) {
                                if (m[0] == 'last') {diff -= 7;}
                            } else {
                                if (m[0] == 'next') {diff += 7;}
                            }
                            now.setDate(now.getDate() + diff);
                        }
                }
                break;

            default:
                if (/\d+/.test(m[0])) {
                    num *= parseInt(m[0], 10);

                    switch (m[1].substring(0, 3)) {
                        case 'yea':
                            now.setFullYear(now.getFullYear() + num);
                            break;
                        case 'mon':
                            now.setMonth(now.getMonth() + num);
                            break;
                        case 'wee':
                            now.setDate(now.getDate() + (num * 7));
                            break;
                        case 'day':
                            now.setDate(now.getDate() + num);
                            break;
                        case 'hou':
                            now.setHours(now.getHours() + num);
                            break;
                        case 'min':
                            now.setMinutes(now.getMinutes() + num);
                            break;
                        case 'sec':
                            now.setSeconds(now.getSeconds() + num);
                            break;
                    }
                } else {
                    return false;
                }
                break;
        }
        return true;
    };

    match = strTmp.match(/^(\d{2,4}-\d{2}-\d{2})(?:\s(\d{1,2}:\d{2}(:\d{2})?)?(?:\.(\d+))?)?$/);
    if (match != null) {
        if (!match[2]) {
            match[2] = '00:00:00';
        } else if (!match[3]) {
            match[2] += ':00';
        }

        s = match[1].split(/-/g);

        for (i in __is.mon) {
            if (__is.mon[i] == s[1] - 1) {
                s[1] = i;
            }
        }
        s[0] = parseInt(s[0], 10);

        s[0] = (s[0] >= 0 && s[0] <= 69) ? '20'+(s[0] < 10 ? '0'+s[0] : s[0]+'') : (s[0] >= 70 && s[0] <= 99) ? '19'+s[0] : s[0]+'';
        return parseInt(this.strtotime(s[2] + ' ' + s[1] + ' ' + s[0] + ' ' + match[2])+(match[4] ? match[4]/1000 : ''), 10);
    }

    var regex = '([+-]?\\d+\\s'+
        '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'+
        '|sun\.?|sunday|mon\.?|monday|tue\.?|tuesday|wed\.?|wednesday'+
        '|thu\.?|thursday|fri\.?|friday|sat\.?|saturday)'+
        '|(last|next)\\s'+
        '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'+
        '|sun\.?|sunday|mon\.?|monday|tue\.?|tuesday|wed\.?|wednesday'+
        '|thu\.?|thursday|fri\.?|friday|sat\.?|saturday))'+
        '(\\sago)?';

    match = strTmp.match(new RegExp(regex, 'g'));
    if (match == null) {
        return false;
    }

    for (i = 0; i < match.length; i++) {
        if (!process(match[i].split(' '))) {
            return false;
        }
    }

    return (now.getTime()/1000);
}

/**
 * getdate
 * @description PHPのgetdate()の移植
 */
function getdate (timestamp) {
    // Get date/time information
    //
    // version: 910.813
    // discuss at: http://phpjs.org/functions/getdate
    // +   original by: Paulo Ricardo F. Santos
    // +   input by: Alex
    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: getdate(1055901520);
    // *     returns 1: {'seconds': 40, 'minutes': 58, 'hours': 21, 'mday': 17, 'wday': 2, 'mon': 6, 'year': 2003, 'yday': 167, 'weekday': 'Tuesday', 'month': 'June', '0': 1055901520}
    var _w = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
    var _m = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
    var d=(
        (typeof(timestamp) == 'undefined') ? new Date() : // Not provided
        (typeof(timestamp) == 'object') ? new Date(timestamp) : // Javascript Date()
        new Date(timestamp*1000) // UNIX timestamp (auto-convert to int)
    );
    var w = d.getDay();
    var m = d.getMonth();
    var y = d.getFullYear();
    var r = {};

    r.seconds = d.getSeconds();
    r.minutes = d.getMinutes();
    r.hours = d.getHours();
    r.mday = d.getDate();
    r.wday = w;
    r.mon = m + 1;
    r.year = y;
    r.yday = Math.floor((d - (new Date(y, 0, 1))) / 86400000);
    r.weekday = _w[w];
    r.month = _m[m];
    r['0'] = parseInt(d.getTime() / 1000, 10);

    return r;
}

/**
 * mktime
 * @description PHPのmktime()の移植
 */
function mktime () {
    // Get UNIX timestamp for a date
    //
    // version: 909.322
    // discuss at: http://phpjs.org/functions/mktime
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: baris ozdil
    // +      input by: gabriel paderni
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: FGFEmperor
    // +      input by: Yannoo
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: jakes
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Marc Palau
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +      input by: 3D-GRAF
    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: mktime(14, 10, 2, 2, 1, 2008);
    // *     returns 1: 1201871402
    // *     example 2: mktime(0, 0, 0, 0, 1, 2008);
    // *     returns 2: 1196463600
    // *     example 3: make = mktime();
    // *     example 3: td = new Date();
    // *     example 3: real = Math.floor(td.getTime()/1000);
    // *     example 3: diff = (real - make);
    // *     results 3: diff < 5
    // *     example 4: mktime(0, 0, 0, 13, 1, 1997)
    // *     returns 4: 883609200
    // *     example 5: mktime(0, 0, 0, 1, 1, 1998)
    // *     returns 5: 883609200
    // *     example 6: mktime(0, 0, 0, 1, 1, 98)
    // *     returns 6: 883609200
    var no=0, i = 0, ma=0, mb=0, d = new Date(), dn = new Date(), argv = arguments, argc = argv.length;

    var dateManip = {
        0: function (tt){ return d.setHours(tt); },
        1: function (tt){ return d.setMinutes(tt); },
        2: function (tt){ var set = d.setSeconds(tt); mb = d.getDate() - dn.getDate(); d.setDate(1); return set;},
        3: function (tt){ var set = d.setMonth(parseInt(tt, 10)-1); ma = d.getFullYear() - dn.getFullYear(); return set;},
        4: function (tt){ return d.setDate(tt+mb);},
        5: function (tt){
            if (tt >= 0 && tt <= 69) {
                tt += 2000;
            }
            else if (tt >= 70 && tt <= 100) {
                tt += 1900;
            }
            return d.setFullYear(tt+ma);
        }
        // 7th argument (for DST) is deprecated
    };

    for (i = 0; i < argc; i++){
        no = parseInt(argv[i]*1, 10);
        if (isNaN(no)) {
            return false;
        } else {
            // arg is number, let's manipulate date object
            if (!dateManip[i](no)){
                // failed
                return false;
            }
        }
    }
    for (i = argc; i < 6; i++) {
        switch (i) {
            case 0:
                no = dn.getHours();
                break;
            case 1:
                no = dn.getMinutes();
                break;
            case 2:
                no = dn.getSeconds();
                break;
            case 3:
                no = dn.getMonth()+1;
                break;
            case 4:
                no = dn.getDate();
                break;
            case 5:
                no = dn.getFullYear();
                break;
        }
        dateManip[i](no);
    }

    return Math.floor(d.getTime()/1000);
}

/**
 * checkdate
 * @description PHPのcheckdate()の移植
 */
function checkdate (month, day, year) {
    // Returns true(1) if it is a valid date in gregorian calendar
    //
    // version: 909.322
    // discuss at: http://phpjs.org/functions/checkdate
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Pyerre
    // *     example 1: checkdate(12, 31, 2000);
    // *     returns 1: true
    // *     example 2: checkdate(2, 29, 2001);
    // *     returns 2: false
    // *     example 3: checkdate(03, 31, 2008);
    // *     returns 3: true
    // *     example 4: checkdate(1, 390, 2000);
    // *     returns 4: false
    var myDate = new Date();
    myDate.setFullYear( year, (month - 1), day );

    return month >= 1 && month <= 12 && year >= 1 && year <= 32767 && ((myDate.getMonth()+1) == month && day<32);
}

/**
 * valueFormat
 * @description 各フィールドの特性に合わせたフォーマット定義
 */
var valueFormat = {
    // 姓
    nameFamily: function(value) {
        if (value) {
            value = value.replace(/[ 　]+/g,''); //半角/全角スペース削除
            value = removeNEC(value); //機種依存文字削除
            value = removeMars(value); //Mars禁則文字削除
            value = toZenkaku(value); //全角変換
        }

        return value;
    },

    // 名
    nameGiven: function(value) {
        if (value) {
            value = value.replace(/[ 　]+/g,''); //半角/全角スペース削除
            value = removeNEC(value); //機種依存文字削除
            value = removeMars(value); //Mars禁則文字削除
            value = toZenkaku(value); //全角変換
        }

        return value;
    },

    // せい
    kanaFamily: function(value) {
        if (value) {
            value = value.replace(/[ 　]+/g,''); //半角/全角スペース削除
            value = toZenkaku(value); //全角変換
            value = removeMars(value); //Mars禁則文字削除
            value = toKatakanaToHiragana(value); // ひらがな変換
        }

        return value;
    },

    // めい
    kanaGiven: function(value) {
        if (value) {
            value = value.replace(/[ 　]+/g,''); //半角/全角スペース削除
            value = toZenkaku(value); //全角変換
            value = removeMars(value); //Mars禁則文字削除
            value = toKatakanaToHiragana(value); // ひらがな変換
        }

        return value;
    },

    // 番地
    addressCode: function(value) {
        if (value) {
            value = value.replace(/^[ 　]+$/,''); //スペースのみ削除
            value = value.replace(/[ ]+/g,''); //半角スペース削除
            value = removeMars(value); //Mars禁則文字削除
            value = removeNEC(value); //機種依存文字削除
        }

        return value;
    },

    // 建物名
    building: function(value) {
        if (value) {
            value = value.replace(/^[ 　]+$/,''); //スペースのみ削除
            value = value.replace(/[ ]+/g,''); //半角スペース削除
            value = removeMars(value); //Mars禁則文字削除
            value = removeNEC(value); //機種依存文字削除
        }

        return value;
    },

    // 電話番号
    telNo: function(value) {
        if (value) {
            value = value.replace(/[ 　]+/g,''); //半角/全角スペース削除
            value = toHankakuNumber(value); //全角数字>半角数字
            value = removeMars(value); //Mars禁則文字削除
            value = trimHyphen(value); //ハイフン削除
        }

        return value;
    },

    // メールアドレス
    email: function(value) {
        if (value) {
            value = value.replace(/[ 　]+/g,''); //半角/全角スペース削除
            value = removeMars(value); //Mars禁則文字削除
            value = toHankaku(value); //半角変換
        }

        return value;
    },

    // メールアドレス（確認用）
    emailConfirm: function(value) {
        if (value) {
            value = value.replace(/[ 　]+/g,''); //半角/全角スペース削除
            value = removeMars(value); //Mars禁則文字削除
            value = toHankaku(value); //半角変換
        }

        return value;
    }
}

function chkProductQty(product_id, qty) {
	$('#qtyMsg' + product_id).hide();
	// バリデーション
	var validate = true;
	// 数値チェック
	if (qty.match(/[^0-9]/g)) {
		validate = false;
		$('#qtyMsg' + product_id + ' .qtyMsg').text('数字でご指定ください');
	}
	// 1個以下または999個以上の場合はエラー
	if (qty > 999 || qty < 1) {
		validate = false;
		$('#qtyMsg' + product_id + ' .qtyMsg').text('1～999でご指定ください');
	}

	// 入力チェックエラー時はエラー吹き出しメッセージ表示
	if (validate == false) {
		$('#qtyMsg' + product_id).fadeIn();
	}

	return validate;
}

