
function getForm(formContainer){
    if(!formContainer)
        formContainer=getFormContainer();

    var forms=YAHOO.util.Selector.query('form',formContainer);
    if(forms.length<1)alert('Error, no form found.');

    return forms[0];

}

function setFormResultAsServerError(formContainer){
    showFormResultElement('server-error', formContainer);
}

function setFormResultAsDataInvalid(formContainer){
    showFormResultElement('data-invalid', formContainer);
}
function setFormResultAsSuccess(formContainer){
    showFormResultElement('success', formContainer);
}

function setFormResultAsInProcess(formContainer){
    showFormResultElement('in-process', formContainer);
}

function showFormResultElement(elClassName,formContainer){
    clearFormResult(formContainer);
    var arr=YAHOO.util.Selector.query('.result .'+ elClassName,formContainer);
    if(arr.length<1) alert('Missing '+elClassName +'div in result div.');
    var el=arr[0];
    YAHOO.util.Dom.addClass(el,'show');
}

function clearFormResult(formContainer){
    var d=YAHOO.util.Dom;
    var s=YAHOO.util.Selector;
    if(!formContainer)
        formContainer=getFormContainer();
    var arr=s.query('.result div',formContainer);
    if(arr.length<1) alert ('Missing div in result div or result div itself is missing.');
    var el=null;
    for(var i in arr){
        el=arr[i];
        d.removeClass(el, 'show');
    }
}


function clearAllFormNotices(formContainer){
    if(!formContainer)
        formContainer=getFormContainer();
    var notices=YAHOO.util.Selector.query('.notice',formContainer);
    
    for(var i in notices)
        notices[i].innerHTML='';

}

function getFormContainer(index){
    if(!index || index <0)
        index=0; //if no index is specified, assume 0

    var s=YAHOO.util.Selector;
    var formContainers=s.query('.form-container');

    if(index < formContainers.length){
        return formContainers[index];
    }else{
        alert('Form container is null.');
        return null;
    }
   
}

function findFormTableRowByChild(child){
    var d=YAHOO.util.Dom;
    if(!child) return null;

    var level=1;
    var node=child;
    while(level<=3){

        node=node.parentNode;

        if(!node) return null;

        if(d.hasClass(node,'row'))
            return node;

        level++;
    }
    return null;
}
function processFormResponse(respText,formContainer){
    var s=YAHOO.util.Selector;
    var d=YAHOO.util.Dom;
    var form;
    if(!formContainer)
        formContainer=getFormContainer();

    
    form=getForm(formContainer);    
    clearAllFormNotices(formContainer);
    var respObj = YAHOO.lang.JSON.parse(respText);
    // We can now interact with the data
    if(respObj.serverError){
        setFormResultAsServerError(formContainer);
    }
    else{

        if(respObj.validated){
            setFormResultAsSuccess(formContainer);
            //alert('we are good to go');//success
            form.reset();
        }
        else
        {
            setFormResultAsDataInvalid(formContainer);
            var errObj=respObj.errMsgs;
            for(var i in errObj) {
                if (errObj.hasOwnProperty(i)){
                    var els=new Array();
                    var inputEls=s.query('input[name="'+ i +'"]',formContainer);
                    if(inputEls) els=els.concat(inputEls);
                    var inputEls2=s.query('input[name^="'+ i + "["+'"]',formContainer);
                    if(inputEls2) els=els.concat(inputEls2);
                    var inputEls3=s.query('textarea[name="'+ i +'"]',formContainer);
                    if(inputEls3) els=els.concat(inputEls3);
                    
                    if(els.length>0){ //input elements may contain textarea
                        var inputEl=els[0];
                        var row=findFormTableRowByChild(inputEl);

                        if(!row) continue;
                        var noticeEls=d.getElementsByClassName('notice','div',row);//in fact,there should be only one notice element

                        if(noticeEls.length>0)
                            noticeEls[0].innerHTML=errObj[i];
                        else
                            alert('error');
                    }
                }
            }
        }
    }

    //success or not we still enable back the button
    form.submit.disabled=false;

}


(function(){

    var s=YAHOO.util.Selector;
    var evt=YAHOO.util.Event;
    var rows=s.query('.form-container .form-table .row');
    var inputTexts=s.query('.form-container .form-table .row input[type="text"]');
    var inputCheckboxes=s.query('.form-container .form-table .row input[type="checkbox"]');
    var inputTextareas=s.query('.form-container .form-table .row textarea');
    var inputRadios=s.query('.form-container .form-table .row input[type="radio"]');

    var concats=inputTexts.concat(inputTextareas);

    var removeAllFocusedClass=function(){
        YAHOO.util.Dom.removeClass(rows, 'focused');
    };
    var addFocusedClassToParentRow=function(child){
        if(!child) return;
        var row=findFormTableRowByChild(child);
        if(row)
            YAHOO.util.Dom.addClass(row, 'focused');
         
        return;

    }

    evt.on(concats, "focusin", function(e) {
        removeAllFocusedClass();
        addFocusedClassToParentRow(this);
    });

    evt.on(concats, "focusout", function(e) {
        removeAllFocusedClass();
    });


    evt.on(inputCheckboxes, "change", function(e) {
        removeAllFocusedClass();
        addFocusedClassToParentRow(this);
    });


    evt.on(inputRadios, "click", function(e) {
        removeAllFocusedClass();
        addFocusedClassToParentRow(this);
    });


})();
