/***********************************************************************
 @ filename            : js/kashbook.js
 @ author              : Ken Wang
 @ description         : KashBook class
 @ created             : 2007-07-01
 @ modified            : 2007-08-05
 @ requires            : mootools.js
 ***********************************************************************/


var KashBook = {
    /* Base */
    cons:{
        ajax_err_max:3
    },
    vars:{
        debug:0,
        ajax_errs:0
    },
    
    /* RegularExpressions */
    RE:{
        account:new RegExp("^[a-zA-Z0-9]{4,}$"),
        date:new RegExp("^20(0|1)[0-9]-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])$"),
        amount:new RegExp("^([1-9]|[1-9]+[0-9]+)$")
    },
    
    Init:function(){
        // initialise forms
        if( $('login-form') ) KashBook.LoginForm.Init();
        if( $('expense-form') ) KashBook.ExpenseForm.Init();
        if( $('income-form') ) KashBook.IncomeForm.Init();
        if( $('translist-form') ) KashBook.TranslistForm.Init();
        if( $('expreport-form') ) KashBook.ExpenseReportForm.Init();
        
        // accordion
        if( $('section-toolbar') ) KashBook.ToolbarAccordion.Init();
        
        // fix ie css:focus
        if( window.ie === true )
        {
            $$('input.input-text','select.input-text','input.kalendar-basic').each(function(el){
                if( el.hasClass('input-text') )
                { 
                    el.addEvent('focus',function(){this.addClass('input-text-focus')});
                    el.addEvent('blur',function(){this.removeClass('input-text-focus')});
                }
                if( el.hasClass('kalendar-basic') )
                {
                    el.addEvent('focus',function(){this.addClass('kalendar-basic-focus')});
                    el.addEvent('blur',function(){this.removeClass('kalendar-basic-focus')});
                }
            })
        }
    },
    
    /* ToolbarAccordion */
    ToolbarAccordion:{
        cons:{},
        vars:{
            obj:false,
            display:0
        },
        Init:function(){
            KashBook.ToolbarAccordion.vars.obj = new Accordion('h3.toolbar-header', 'div.toolbar-body', {
                display: KashBook.ToolbarAccordion.vars.display,
                opacity: false,
                onActive: function(toggler, element) { toggler.addClass('header-on'); },
                onBackground: function(toggler, element) { toggler.removeClass('header-on'); }
            }, $('section-toolbar'));
        }
    },
    
    /* SetFormStatus */
    SetFormStatus:function( form_id, status, desc ) {
        switch( status )
        {
            case 'loading':
                $(form_id+'-status').className = 'status-loading';
                $(form_id+'-status').setText(desc);
                $(form_id+'-status').setStyle( 'opacity', 1 );
                break;
            
            case 'failed':
                var fx = $(form_id+'-status').effects( {duration:500, transition: Fx.Transitions.Quad.easeIn} );
                fx.start({ // hide previous message
                    'opacity':0
                }).chain(function(){
                    $(form_id+'-status').className = 'status-failed';
                    $(form_id+'-status').setText(desc);
                    this.start({'opacity':1});
                }).chain(function(){
                    this.start.delay(3000,this,{'opacity':0});
                });
                break;
            
            case 'done':
                var fx = $(form_id+'-status').effects( {duration:500, transition: Fx.Transitions.Quad.easeIn} );
                fx.start({ // hide previous message
                    'opacity':0
                }).chain(function(){
                    $(form_id+'-status').className = 'status-done';
                    $(form_id+'-status').setText(desc);
                    this.start({'opacity':1});
                }).chain(function(){
                    this.start.delay(3000,this,{'opacity':0});
                });
                break;
        }
    },
    
    /* ShowFormTooltip */
    ShowFormTooltip:function()
    {
        var input_id = this.id;
        if( $(input_id) && $(input_id+'-tooltip') )
        {
            var fx = $(input_id+'-tooltip').effects( {duration:250, transition: Fx.Transitions.Quad.easeIn} );
            fx.start({
                'opacity':0
            }).chain(function(){
                $(input_id+'-tooltip').setText( $(input_id).getProperty('title') );
                $(input_id+'-tooltip').className = 'form-tooltip';
                this.start({'opacity':1});
            });
        }
    },
    
    /* HideFormTooltip */
    HideFormTooltip:function()
    {
        var input_id = this.id;
        if( $(input_id) && $(input_id+'-tooltip') )
        {
            $(input_id+'-tooltip').setOpacity(0);
        }
    },
    
    /* LoginForm */
    LoginForm:{
        Init:function(){
            if( KashBook.ToolbarAccordion.vars.display!=0 ) return;
            $('login-form').login_username.focus();
            $('login-form').onsubmit = function(){ return KashBook.LoginForm.Check() };
        },
        Check:function(){
            var formObj = $('login-form');
            if( !KashBook.RE.account.test( formObj.login_username.value.trim() ) )
            { alert("請填寫帳號"); return false; }
            if( formObj.login_password.value.trim().length < 4 )
            { alert("請填寫密碼"); return false; }
            return true;
        }
    },
    
    /* ExpenseForm */
    ExpenseForm:{
        cons:{},
        vars:{
            ajax:false
        },
        Init:function(){
            $('expense-form').onsubmit = function(){ return KashBook.ExpenseForm.Check() }
            if( KashBook.ToolbarAccordion.vars.display!=0 ) return;
            $('expense-form').expense_amount.focus();
        },  // end Init
        Check:function(){
            if( KashBook.ExpenseForm.vars.ajax && KashBook.ExpenseForm.vars.ajax.running == true )
            { alert("執行中，請稍候..."); return false; }
            var formObj = $('expense-form');
            var err = [];
            if( !KashBook.RE.date.test( formObj.expense_date.value.trim() ) )
            { err[err.length] = "日期"; }
            if( !KashBook.RE.amount.test( formObj.expense_amount.value.trim() ) )
            { err[err.length] = "金額"; }
            else if( parseInt(formObj.expense_amount.value.trim(),10) > 1000000 )
            { err[err.length] = "金額 (最高單筆限 1,000,000)"; }
            if( formObj.expense_desc.value.trim() == "" )
            { err[err.length] = "明細"; }
            if( err.length > 0 )
            { alert("請修正下列欄位:\n- "+err.join("\n- ") ); return false; }
            // all good, send ajax request
            formObj.ajax.value = '1';
            var url = formObj.action;
            KashBook.SetFormStatus( 'expense-form', 'loading', '處理中，請稍候...' );
            KashBook.ExpenseForm.vars.ajax = new Ajax( url,{ 
                    data:$('expense-form'), 
                    update:$('content-container'),
                    onSuccess:KashBook.ExpenseForm.Success,
                    onFailure:KashBook.ExpenseForm.Error 
                }).request();
            formObj.ajax.value = '0';
            return false;
        },  // end Check
        Success:function(){
            var formObj = $('expense-form');
            //$('expense-form').reset();
            // reset individual inputs
            formObj.expense_amount.value = '';
            formObj.expense_acc_id.selectedIndex = 0;
            formObj.expense_desc.value = '';
            formObj.expense_invoices.value = '';
            formObj.expense_amount.focus();
            KashBook.SetFormStatus( 'expense-form', 'done', '處理完成。' );
        },  // end Success
        Error:function(){
            KashBook.ExpenseForm.vars.ajax = false;
            KashBook.vars.ajax_errs++;
            if( KashBook.vars.ajax_errs < KashBook.cons.ajax_err_max ) { alert( "無法執行，請檢查網路是否斷線。" ); }
            else if(confirm( "連線已逾時，請重新登入。" )) { window.location.href = './?mode=logout'; }
        }   // end Error
    },
    
    
    /* Income Form */
    IncomeForm:{
        cons:{},
        vars:{
            ajax:false
        },
        Init:function(){
            $('income-form').onsubmit = function(){ return KashBook.IncomeForm.Check() }
        },  // end Init
        Check:function(){
            if( KashBook.IncomeForm.vars.ajax && KashBook.IncomeForm.vars.ajax.running == true )
            { alert("執行中，請稍候..."); return false; }
            var formObj = $('income-form');
            var err = [];
            if( !KashBook.RE.date.test( formObj.income_date.value.trim() ) )
            { err[err.length] = "日期"; }
            if( !KashBook.RE.amount.test( formObj.income_amount.value.trim() ) )
            { err[err.length] = "金額"; }
            else if( parseInt(formObj.income_amount.value.trim(),10) > 1000000 )
            { err[err.length] = "金額 (最高單筆限 1,000,000)"; }
            if( formObj.income_desc.value.trim() == "" )
            { err[err.length] = "明細"; }
            if( err.length > 0 )
            { alert("請修正下列欄位:\n- "+err.join("\n- ") ); return false; }
            // all good, send ajax request
            formObj.ajax.value = '1';
            var url = formObj.action;
            KashBook.SetFormStatus( 'income-form', 'loading', '處理中，請稍候...' );
            KashBook.IncomeForm.vars.ajax = new Ajax( url,{ 
                    data:$('income-form'), 
                    update:$('content-container'),
                    onSuccess:KashBook.IncomeForm.Success,
                    onFailure:KashBook.IncomeForm.Error 
                }).request();
            formObj.ajax.value = '0';
            return false;
        },  // end Check
        Success:function(){
            $('income-form').reset();
            $('income-form').income_amount.focus();
            KashBook.SetFormStatus( 'income-form', 'done', '處理成功。' );
        },  // end Success
        Error:function(){
            KashBook.IncomeForm.vars.ajax = false;
            KashBook.vars.ajax_errs++;
            if( KashBook.vars.ajax_errs < KashBook.cons.ajax_err_max ) { alert( "無法執行，請檢查網路是否斷線。" ); }
            else if(confirm( "連線已逾時，請重新登入。" )) { window.location.href = './?mode=logout'; }
        }   // end Error
    },  // end IncomeForm
    
    
    /* TranslistForm */
    TranslistForm:{
        cons:{},
        vars:{
            ajax:false
        },
        Init:function(){
            $('translist-form').onsubmit = function(){ return KashBook.TranslistForm.Check(); }
        },
        Check:function(){
            if( KashBook.TranslistForm.vars.ajax && KashBook.TranslistForm.vars.ajax.running == true )
            { alert("執行中，請稍候..."); return false; }
            var formObj = $('translist-form');
            if( !KashBook.RE.date.test( formObj.translist_date_start.value ) ||
                !KashBook.RE.date.test( formObj.translist_date_end.value ) ||
                formObj.translist_date_start.value > formObj.translist_date_end.value )
            { alert("請輸入格式正確的日期範圍。"); return false; }
            // all good, send ajax request
            formObj.ajax.value = '1';
            var url = formObj.action;
            KashBook.SetFormStatus( 'translist-form', 'loading', '處理中，請稍候...' );
            KashBook.TranslistForm.vars.ajax = new Ajax( url,{ 
                    data:$('translist-form'), 
                    update:$('content-container'),
                    onSuccess:KashBook.TranslistForm.Success,
                    onFailure:KashBook.TranslistForm.Error 
                }).request();
            formObj.ajax.value = '0';
            return false;
        },  // end Check
        Success:function(){
            KashBook.SetFormStatus( 'translist-form', 'done', '處理成功。' );
        },
        Error:function(){
            KashBook.TranslistForm.vars.ajax = false;
            KashBook.vars.ajax_errs++;
            if( KashBook.vars.ajax_errs < KashBook.cons.ajax_err_max ) { alert( "無法執行，請檢查網路是否斷線。" ); }
            else if(confirm( "連線已逾時，請重新登入。" )) { window.location.href = './?mode=logout'; }
            KashBook.SetFormStatus( 'translist-form', 'failed', '無法執行。' );
        }
    },  // end TranslistForm
    
    
    /* ExpenseReportForm */
    ExpenseReportForm:{
        cons:{},
        vars:{
            ajax:false
        },
        Init:function(){
            $('expreport-form').onsubmit = function(){ return KashBook.ExpenseReportForm.Check(); }
        },
        Check:function(){
            if( KashBook.ExpenseReportForm.vars.ajax && KashBook.ExpenseReportForm.vars.ajax.running == true )
            { alert("執行中，請稍候..."); return false; }
            var formObj = $('expreport-form');
            formObj.ajax.value = '1';
            var url = formObj.action;
            KashBook.SetFormStatus( 'expreport-form', 'loading', '處理中，請稍候...' );
            KashBook.ExpenseReportForm.vars.ajax = new Ajax( url,{ 
                    data:$('expreport-form'), 
                    update:$('content-container'),
                    onSuccess:KashBook.ExpenseReportForm.Success,
                    onFailure:KashBook.ExpenseReportForm.Error 
                }).request();
            formObj.ajax.value = '0';
            return false;
        },
        Success:function(){
            KashBook.SetFormStatus( 'expreport-form', 'done', '處理成功。' );
        },
        Error:function(){
            KashBook.vars.ajax_errs++;
            if( KashBook.vars.ajax_errs < KashBook.cons.ajax_err_max ) { alert( "無法執行，請檢查網路是否斷線。" ); }
            else if(confirm( "連線已逾時，請重新登入。" )) { window.location.href = './?mode=logout'; }
            KashBook.SetFormStatus( 'expreport-form', 'failed', '無法執行，請檢查網路是否斷線。' );
        }
    },
    
    EOS:0
}


var Kalendar = {
    cons:{
        m01:0,m02:1,m03:2,m04:3,m05:4,m06:5,m07:6,m08:7,m09:8,m10:9,m11:10,m12:11,
        months:['01','02','03','04','05','06','07','08','09','10','11','12']
    },
    Init:function() {
        $$('input.kalendar-basic').each( function(el) {
            el.addEvent( 'keydown', Kalendar.Basic.bindWithEvent(el) );
            el.setProperty( 'title', '可用鍵盤的上下鍵調整日期' );
            el.addEvent( 'focus', KashBook.ShowFormTooltip.bind(el) );
            el.addEvent( 'blur', KashBook.HideFormTooltip.bind(el) );
        });
    },
    RE:{
        date:new RegExp("^20(0|1)[0-9]-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])$")
    },
    
    Basic:function( event ) {
        switch( event.key ) {
            case 'up':
                this.value= Kalendar.DateAdd( this.value, 1, 'day' );
                event.stop(); // stop safari from firing the same event twice
                break;
            case 'down':
                this.value= Kalendar.DateAdd( this.value, -1, 'day' );
                event.stop();
                break;
        }
    },
    
    // public string - php date() wannabe
    Date:function( s_format, i_timestamp ){
        if( typeof i_timestamp != 'number' )
        {
            var today = new Date();
            i_timestamp = today.valueOf(); 
        }
        var time = new Date( i_timestamp );
        var s_output = '';
        for( var i=0; i<s_format.length; i++ )
        {
            switch( s_format.charAt(i) )
            {
                case 'Y': s_output += time.getFullYear().toString(); break;
                case 'm': s_output += Kalendar.cons.months[time.getMonth()]; break;
                case 'd': s_output += ( time.getDate() < 10 ) ? '0'+time.getDate().toString():time.getDate().toString(); break;
                // more, for later...
                default:
                    s_output += s_format.charAt(i).toString();
            }
        }
        return s_output;
    },
    
    DateAdd:function( s_from_date, i_diff, s_unit ) {
        // expecting Y-m-d formatted date string
        // return today's date string if invalid
        if( Kalendar.RE.date.test(s_from_date) == false )
        {
            return Kalendar.Date('Y-m-d');
        }
        d_parts = s_from_date.split('-');
        var from_y = d_parts[0];
        var from_m = Kalendar.cons['m'+d_parts[1]];
        var from_d = (d_parts[2].indexOf('0')==0) ? d_parts[2].substr(1,1):d_parts[2];
        var from_date = new Date( from_y, from_m, from_d, 12 );
        var diff_unit = 1000*3600*24; // milliseconds in a day
        switch( s_unit )
        {
            case 'year': diff_unit = (diff_unit*356); break;
            case 'month': diff_unit = (diff_unit*30); break;
        }
        var new_date = new Date( from_date.valueOf() + (i_diff*diff_unit) );
        return Kalendar.Date( 'Y-m-d', new_date.valueOf() );
    },
    
    EOS:0
}


/* Initialise KashBook */
window.addEvent('domready', KashBook.Init );
window.addEvent('domready', Kalendar.Init );

