
/*
    Intruments an existing form

parameters
    portletId;used to fire events
    formId: the form id to instrument
    containerId: (optional) the container to reload when form is submitted (the form itself if not assigned)
    uploadStatusCheckCallback (optional): callback called on interval to check if upload finisched, it must return a number from 0 to 100 so show progress


  
  javascript events:
  submit_success: if submit has success without errors
  submit_errors: if submit has errors
  form_reset: if form has been reset

*/
function PE_Form(portletId,formId,containerId,uploadStatusCheckCallback) {

    this.uploadStatusCheckCallback=uploadStatusCheckCallback;
    this.portletId=portletId;
    var formObj=$(formId);
    this.formId=formId;
    

    if (containerId) {
        this.containerId=containerId;
        
    } else {
        this.containerId=formId;
        
    }

    if (!$(this.containerId)) {
        alert("No container element for form found for id:"+this.containerId);
        return;
    }

    //adds events to forms
    if (formObj) {
        formObj.onsubmit=this.submit.bind(this);
        formObj.onreset=this.reset.bind(this);

        this._prepareInputs();
    }

}
PE_Form.Events=new Object();
PE_Form.Events.SUBMIT_SUCCESS="submit_success";
PE_Form.Events.SUBMIT_ERRORS="submit_errors";
PE_Form.Events.FORM_RESET="form_reset";


PE_Form.prototype._prepareInputs=function() {

    var inputs=$(this.formId).select("input, select, textarea");
    for (i=0;i<inputs.length;i++) {

        if (!inputs[i].onkeypress)
            inputs[i].onkeypress=function(ev) { this.addClassName("inputchanged")};

        if (!inputs[i].onchange)
            inputs[i].onchange=function(ev) { this.addClassName("inputchanged")};

        if (inputs[i].type=="checkbox" || inputs[i].type=="radio") {
            inputs[i].style.border="none";
            inputs[i].style.width="auto";
        }
    }
}

PE_Form.prototype._prepareErrors=function() {
    var errors=$(this.formId).select("span.error");
    for (i=0;i<errors.length;i++) {
        var error=errors[i];
        var parent=error.parentNode;
        var himg=$(document.createElement("img"));
        himg.src="../components/ajax/form/exclamation.gif";
        himg.style.height="10px";
        himg.style.width="10px";
        parent.appendChild(himg);

        var singleinput=$(parent.getAttribute("for"));
        var allinputs=new Array(0);
        if (singleinput) {
            allinputs=parent.select("input, textbox, select");
            if (!allinputs)
                allinputs=new Array(0);
            allinputs.push(singleinput);
        }

        for (j=0;j<allinputs.length;j++) {
            allinputs[j].addClassName("errorinput");
        }
    }
}


/*
 * Call this to make the submit of the form 
 */   
PE_Form.prototype.submit=function() {

    var formObj=$(this.formId);

    if (formObj.select("input[type='file']").length>0)
        return this.fileSubmit();


    for (i=0;i<formObj.elements.length;i++)
             if (window.FCKeditorAPI && FCKeditorAPI.GetInstance(formObj.elements[i].name)) {
                formObj.elements[i].value=FCKeditorAPI.GetInstance(formObj.elements[i].name).GetXHTML();

            }
    var legends=formObj.select("legend");
    for (i=0;i<legends.length;i++) {
        legends[i].insert({"top":"<img class='loading_icon' src='../components/ajax/form/loading.gif'/>"});
    }

    PEAjaxUtils.scheduleSessionRefresh();
    $(formObj).request(
        {
            parameters: { pe_ajaxform_request:'true', tmt:(new Date()).getTime()},
            onComplete: function(transport) {

               

               if (transport.status==200) {
                   $(this.containerId).update(PEAjaxUtils.selectHtml(transport.responseText, this.containerId));

                   $$("img.loading_icon").each(function (e) {e.remove()});

                   this._prepareErrors();
                   this._prepareInputs();

                   var formObj=$(this.formId);

                   
                   //adds events to forms
                   formObj.onsubmit=this.submit.bind(this);
                   formObj.onreset=this.reset.bind(this);


                   if (transport.getHeader("pe_formerrors_present"))
                       PEEventManager.fireEvent(this.portletId,this.formId,'submit_errors');
                   else
                       PEEventManager.fireEvent(this.portletId,this.formId,'submit_success');
               }



            }.bind(this)
        }
    );
    
    return false;
}

/*
 * Call this to make the submit of the form to alternative action
 */
PE_Form.prototype.submitAction=function(action) {

   var formObj=$(this.formId);

   var params=formObj.serialize(true);
   params.pe_ajaxform_request="true";
   params.tmt=(new Date()).getTime();
   PEAjaxUtils.scheduleSessionRefresh();
    new Ajax.Request(this.portletId+"_"+action+".pe",
        {
            parameters: params,
            onSuccess: function(transport) {

                if (transport.status==200) {
                   $(this.containerId).update(PEAjaxUtils.selectHtml(transport.responseText, this.containerId));

                   $$("img.loading_icon").each(function (e) {e.remove()});

                   this._prepareErrors();
                   this._prepareInputs();

                   var formObj=$(this.formId);


                   //adds events to forms
                   formObj.onsubmit=this.submit.bind(this);
                   formObj.onreset=this.reset.bind(this);


                   if (transport.getHeader("pe_formerrors_present"))
                       PEEventManager.fireEvent(this.portletId,this.formId,'submit_errors');
                   else
                       PEEventManager.fireEvent(this.portletId,this.formId,'submit_success');
               } else
                   alert("error:"+transport.status);
            }.bind(this)
        }
    );


}


//Public called to submit the form
PE_Form.prototype.fileSubmit= function() {

    var formObj=$(this.formId);

     var submits=formObj.select('input[type="submit"]');
    if (submits.length>0 && this.uploadStatusCheckCallback) {
        Element.replace(submits[0],"<div  class=\"statusbar\"><div id='"+this.formId+"_prog'></div></div><input type='reset' value='reset'/>");
    }


     var iframeId="_pe_hidden_supportframe";
     var theDiv=$(iframeId);

     if (!theDiv) {
         theDiv= document.createElement('div');
         theDiv.style.display = 'none';
         theDiv.innerHTML =
           '<iframe id="'+iframeId+'" name="'+iframeId+'" src=""><div id="_form_submit_check"></div></iframe>';
         document.body.appendChild(theDiv);
     }

     formObj.target=iframeId;
     formObj.method="post";
     formObj.setAttribute("enctype", "multipart/form-data");

     var fileElement=formObj.findFirstElement();

     if (!fileElement)
        alert("no element found into the upload form");

     formObj.submit();

  
     if (this.uploadStatusCheckCallback)
        window.setTimeout(function() {this.checkUploadStatus()}.bind(this),500);
     else
        PEEventManager.fireEvent(this.portletId,this.formId,"submit_success");
}
PE_Form.prototype.checkUploadStatus=function() {
    if (this.uploadStatusCheckCallback) {
        var progress=this.uploadStatusCheckCallback();
        if (progress<100)
        {

            var prog=$(this.formId+"_prog");
            if (prog){
                prog.style.width=progress+"%";
                prog.update(progress+"%");
            }
            window.setTimeout(function() {this.checkUploadStatus()}.bind(this),1000);
            
        }
        else if ($('_form_submit_check')) { //if this element is present it means that the form has not been completely submitted yet
            window.setTimeout(function() {this.checkUploadStatus()}.bind(this),500);
        } else
            this.reset();
    }
}








/**
 * reloads the form completely
 */
PE_Form.prototype.reset=function() {

     var iframeId="_pe_hidden_supportframe";
     var theDiv=$(iframeId);

     if (theDiv) {
        theDiv.parentNode.removeChild(theDiv);
     }
    PEAjaxUtils.loadPortlet(this.portletId,function(markup) {

       $(this.containerId).update(PEAjaxUtils.selectHtml(markup, this.containerId));


       var formObj=$(this.formId);

       if (formObj) {
           //adds events to forms
           formObj.onsubmit=this.submit.bind(this);
           formObj.onreset=this.reset.bind(this);

           this._prepareInputs();
       }

       PEEventManager.fireEvent(this.portletId,this.formId,'form_reset');
    }.bind(this));

    return false;
}
