var time_id;
var time_input; // text Element
var time_value; // original value
var time_hour = 12;
var time_min = 0;
var time_ampm = 'a'; // AM/PM value
var time_flag;       // realm: 0: init; 1: hours; 2: minutes; 3: exit
var time_flag_dec;   // sub-hours: 0: init; 1: ':'-format; 2: '.'-format
var time_flag_hour;  // digits belonging to hours
var time_flag_min;   // digits belonging to minutes
var time_flag_ampm;
var time_prefs = 0;

function time_start(id,prefs) {
    time_id = id;
    time_prefs = prefs;
    time_input = document.getElementById(time_id);
    time_value = time_input.value;
    time_flags();
    time_input.select();
    document.onkeypress=time_key;
    document.onkeydown=time_key;
}

function time_flags() {
    time_flag = 0;
    time_flag_dec = 0;
    time_flag_hour = '';
    time_flag_min = '';
    time_flag_ampm = '';
}

function time_update(focus) {
    if (time_min < 10 && time_min.length != 2) {
        var min = '0'+time_min;
    } else var min = time_min;
    if (time_hour < 10) {
        var hour = '0'+time_hour;
    } else var hour = time_hour;
    time_input.value = hour+":"+min+time_ampm;
    if (focus > 0) time_input.select();
    if (time_prefs > 0 && time_input.value != time_value) { // value changed
        var calc = document.getElementById('prefsCalc'+time_prefs).value;
        if (calc > 0) document.getElementById('blnRecalc').value = calc;
    }
}

function time_calc() {
    if (time_flag == 0) return;

    // 0   1  2 3 4 5 6 7 8 9 10 11 12  13 -- 23
    // 12a 1a --                 -- 12p 1p -- 11p
    if (time_flag_ampm.length > 0) {
        time_ampm = time_flag_ampm;
    } else time_ampm = 'a';
    time_min = 0;
    if (time_flag > 1 && time_flag_min.length > 0) { // minutes realm
        if (time_flag_dec > 1) { // decimal
            time_min = (60 * ('0.'+time_flag_min));
        } else if (time_flag_min.length > 1) {
            time_min = time_flag_min;
        } else if (time_flag_min > 5) {
            time_min = time_flag_min;
        } else time_min = time_flag_min+'0';
    }
    time_hour = 12;
    if (time_flag > 0) { // hours realm
        if (time_flag_hour > 12) {
            time_hour = (time_flag_hour - 12);
            time_ampm = 'p';
        } else time_hour = time_flag_hour;
    }
    time_update(0);
}

function time_add(c) {
    if (time_flag > 1) { // minutes realm
        if (time_flag_min.length < 2) {
            if (time_flag_min.length == 0) {
                time_flag_min = ''+c;
            } else if (time_flag_dec > 1 || time_flag_min.charAt(0) < 6) {
                time_flag_min = time_flag_min+''+c;
            } else return false;
        } else return false;
    } else if (time_flag > 0) { // hours realm
        if (time_flag_hour > 1 && c > 3) {
            time_flag_min = c;
        } else time_flag_hour = time_flag_hour+''+c;
        time_flag++;
    } else { // init
        if (c > 0) {
            if (c > 2) time_flag++; // minutes are next
            time_flag_hour = c;
            time_flag++;
        } else return false;
    }
    return true;
}

function time_del() {
    if (time_flag_ampm.length > 0) {
        time_flag_ampm = '';
    } else if (time_flag > 1 && time_flag_min.length > 0) { // minutes realm
        if (time_flag_min.length > 1) {
            time_flag_min = time_flag_min.substring(0,1);
        } else time_flag_min = '';
    } else if (time_flag > 0) { // hours realm
        if (time_flag > 1) {
            time_flag--;
            time_flag_dec = 0;
        }
        if (time_flag_hour.length > 1) {
            time_flag_hour = time_flag_hour.substring(0,1);
        } else {
            time_flag_hour = '';
            time_flag--;
        }
    }
}

function time_key(evt) {
    if (window.event) {
        var code = window.event.keyCode;
        if (window.event.type == 'keydown') {
            if (code == 8) { // BackSpace
                time_del();
            }
            return true;
        }
    } else {
        if (evt.type == 'keydown') return true;
        if (evt.keyCode) {
            var code = evt.keyCode;
        } else var code = evt.which;
    }

    if (code == 27) { // Esc
        time_flag = 0; // don't run time_calc() on blur
        time_input.value = time_value;
        time_input.blur(); // will call time_end();
        return false;
    }

    if (code == 13 || code == 9 || code == 37 || code == 39) { // Enter / Tab / <= / =>
        time_input.blur(); // will call time_end();
        return false;
    }

    if (code == 43) { // '+'
        time_arrow(time_id,time_prefs,1);
        return false;
    }

    if (code == 45) { // '-'
        time_arrow(time_id,time_prefs,0);
        return false;
    }

    if (code == 32) { // Space
        // if first, then enter now()
        if (time_flag == 0) {
            time_now();
        }
        return false;
    }

    if (code > 47 && code < 58) { // digits 0-9
        if (time_flag_ampm.length > 0 || !time_add((code - 48))) return false;
    } else if (code == 8) { // BackSpace
        time_del();
    } else if (code == 97 || code == 65 || code == 47) { // a / A / '/' (am)
        if (time_flag_ampm.length > 0) return false;
        time_flag_ampm = 'a';
    } else if (code == 112 || code == 80 || code == 42) { // p / P / '*' (pm)
        if (time_flag_ampm.length > 0) return false;
        time_flag_ampm = 'p';
    } else if (code == 58) { // ':'
        if (time_flag == 1) {
            time_flag++;
            time_flag_dec = 1;
        } else if (time_flag == 2 && time_flag_min.length == 0) {
            time_flag_dec = 1;
        }
    } else if (code == 46) { // '.'
        if (time_flag == 1) {
            time_flag++;
            time_flag_dec = 2;
        } else if (time_flag == 2 && time_flag_min.length == 0) {
            time_flag_dec = 2;
        }
    } else {
        //alert("code:"+code+":");
        return false;
    }
}

function time_now() {
    var d = new Date();
    time_ampm = 'a';
    time_hour = d.getHours();
    time_min = d.getMinutes();
    // 0   1  2 3 4 5 6 7 8 9 10 11 12  13 -- 23
    // 12a 1a --                 -- 12p 1p -- 11p
    if (time_hour == 0) {
        time_hour = 12;
    } else if (time_hour > 11) {
        time_ampm = 'p';
        if (time_hour > 12) {
            time_hour = (time_hour - 12);
        }
    }
    time_flag = 0; // don't run time_calc()
    time_update(1);
}

function time_arrow(id,prefs,inc) {
    time_id = id;
    time_prefs = prefs;
    time_input = document.getElementById(time_id);
    time_value = time_input.value;
    var str = time_input.value;
    var fmt = /^(\d{1,2}):(\d{2})(a|p)$/;
    var timeArry = str.match(fmt);
    if (timeArry == null) return;
    time_hour = (1 * timeArry[1]);
    time_min = (1 * timeArry[2]);
    time_ampm = timeArry[3];
    if (time_hour < 0  || time_hour > 12 || time_min < 0 || time_min > 59 || time_ampm == "" || time_ampm == null) return;
    if (inc) {
        time_min++;
        if (time_min > 59) {
            time_min = 0;
            time_hour++;
            if (time_hour > 12) {
                time_hour = 1;
            } else if (time_hour > 11) {
                if (time_ampm == 'a') {
                    time_ampm = 'p';
                } else time_ampm = 'a';
            }
        }
    } else {
        if (time_min < 1) {
            time_min = 60;
            time_hour--;
            if (time_hour == 0) {
                time_hour = 12;
            } else if (time_hour == 11) {
                if (time_ampm == 'a') {
                    time_ampm = 'p';
                } else time_ampm = 'a';
            }
        }
        time_min--;
    }
    time_flag = 0; // don't run time_calc()
    time_update(0);
}

function time_end() {
    time_calc();
    document.onkeypress=function(e) { return e; }
    document.onkeydown=function(e) { return e; }
}


