   /***************************************************************************/
   /*                                                                         */
   /*  Class Helpers                                                          */
   /*                                                                         */
   /*  General form helpers:                                                  */
   /*                                                                         */
   /*  getOptions(target_id, pars, oncomplete)                                */
   /*  getCheckboxes(target_id, pars, oncomplete)                             */
   /*  getCheckboxesGrouped(target_id, pars, oncomplete)                      */
   /*  collectFormElements(id)                                                */
   /*  fillFormElements(form_id, allValues)                                   */
   /*  enableAllFormElements(form_id)                                         */
   /*  disableAllFormElements(form_id)                                        */
   /*  toggleSubForm(elem_id)                                                 */
   /*  fillWithCurrentDateTime(elem_id, pars)                                 */
   /*                                                                         */
   /*  Helpers for specific forms:                                            */
   /*                                                                         */
   /*  ()                                                        */
   /*  prepareUpload()                                                        */
   /*  stopUpload()                                                           */
   /*                                                                         */
   /*                                                                         */
   /*                                                                         */
   /*  additionalInfoSaveAll(form_id)                                         */
   /*  additionalInfoLoadAll(form_id)                                         */
   /*                                                                         */
   /*  fortbildungLoadFormValues(form_id, fortbildung_id)                     */
   /*  fortbildungSaveFormValues(form_id, fortbildung_id)                     */
   /*  fortbildungSaveSubmission(form_id, fortbildung_id, ..)                 */
   /*  fortbildungDelete(fortbildung_id)                                      */
   /*  fortbildungApprove(fortbildung_id)                                     */
   /*  ------- specials functions to join "fortbildungen"-------------------  */
   /*  fortbildungJoin(fortbildungs_id, container_id, fortbildung_last)       */
   /*  fortbildungJoin_detail(join_type)                                      */
   /*  fortbildungUserhasrealyattended(fortbildungs_id)                       */
   /*  fortbildungUserhasnotattended(fortbildungs_id)                         */
   /*                                                                         */
   /*  externatLoadFromValues(form_id, externat_id)                           */
   /*  externatSaveFormValues(form_id, externat_id, ignore_validation)        */
   /*  externatSaveSubmission(form_id, externat_id, ignore_validation)        */
   /*  externatApprove(externat_id)                                           */
   /*  externatDelete(externat_id)                                            */
   /*                                                                         */
   /*  messeterminLoadFormValues(form_id, event_id)                           */
   /*  messeterminSaveFormValues(form_id, event_id)                           */
   /*  messeTerminDelete(event_id)                                            */
   /*  messeTerminJoin(event_id)                                              */
   /*                                                                         */
   /*  kleinanzeigeLoadFormValues(form_id, kleinanzeige_id)                   */
   /*  kleinanzeigeSaveFormValues(form_id, kleinanzeige_id)                   */
   /*  kleinanzeigeDelete(kleinanzeige_id)                                    */
   /*                                                                         */
   /*  kolleginnenbytag(target_id, pars, oncomplete)                          */
   /***************************************************************************/
   
   
   var Helpers = Class.create();
   
   Helpers.prototype = {
   
      // constructor
      initialize: function() {
         this.noconfirmmsg = false;
      },
      
         
      // write HTML block of <option> tags   
      getOptions: function(target_id, pars, oncomplete) {
         
         var url = 'ajax/helpers-getoptions.php';
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: $H(pars).toQueryString(),
                  onComplete: function(transport) {
                     
                     var response = transport.responseJSON;
                     
                     if (response) {
                        gui.handleResponse(response);
                        $(target_id).update(response.html);
                     } else {
                        $(target_id).update("no response object from ajax");
                     }
                     if (oncomplete) {
                        eval('('+oncomplete+')');
                     }
                     
                  }.bind(this)
         });
         
      },
      
      
      // write HTML block of <checkbox> elements surrounded by <div> containers   
      getCheckboxes: function(target_id, pars, callbackfunctions) {
         
         var url = 'ajax/helpers-getcheckboxes.php';
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: $H(pars).toQueryString(), 
                  onComplete: function(transport) {
                     
                     var response = transport.responseJSON;
                     
                     if (response) {
                        gui.handleResponse(response);
                        $(target_id).update(response.html);
                     } else {
                        $(target_id).update("no response object from ajax");
                     }
                     if (callbackfunctions) {
                        callbackfunctions.onComplete();
                     }
                  }.bind(this)
         });
         
      },
      
      
      
      // write HTML block of <checkbox> elements surrounded by <div> containers   
      getCheckboxesGrouped: function(target_id, pars, callbackfunctions) {
         
         var url = 'ajax/helpers-getcheckboxes-grouped.php';
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: $H(pars).toQueryString(), 
                  onComplete: function(transport) {
                     
                     var response = transport.responseJSON;
                     
                     if (response) {
                        gui.handleResponse(response);
                        $(target_id).update(response.html);
                     } else {
                        $(target_id).update("no response object from ajax");
                     }
                     if (callbackfunctions) {
                        callbackfunctions.onComplete();
                     }
                  }.bind(this)
         });
         
      },      
      
      
       
      // checks, if tinyMCE is available and returns an instance of it for given textarea id
      _tinyMCEinst: function(id) {
         try {
            inst = tinyMCE.getInstanceById(id);
            return inst;
         } catch(e) {
            return false;
         }
      },
      
      
      // return Hash with all form fields/values found in given form
      collectFormElements: function(form_id) {
         
         var allValues = new Hash();
      
         $(form_id).getElements().each(function(elem) {
        
            if (elem.type=="text" || elem.type=="password" || elem.type=="select-one" || elem.type=="hidden" || elem.type=="textarea") {
               
               if ((elem.type=="textarea") && (inst=this._tinyMCEinst(elem.id))) {
                  allValues.set(elem.name, inst.getContent());
               } else {
                  allValues.set(elem.name, elem.value);
               }
               
            } else
            
            if (elem.type=="checkbox") {
               allValues.set(elem.name, elem.checked);
            } else
            
            if (elem.type=="button") {
               // nop
            } else
            
            if (elem.type=="radio") {
               if(elem.checked == true) {
                  allValues.set(elem.name, elem.value);
               }
            } else 
            
            dump.add("Helpers:collectFormElements() : unsupported type: "+elem.type);
            
         }.bind(this));
         
         return allValues;
      },
      
      
      // fill given form with values from given array
      fillFormElements: function(form_id, allValues) {
         
         $(form_id).getElements().each(function(elem) {
         
            if (allValues[elem.name] || allValues[elem.name]=='') {   
               
               if (elem.type=="text" || elem.type=="password" || elem.type=="textarea") {
                  if ((elem.type=="textarea") && (inst=this._tinyMCEinst(elem.id))) {
                     inst.setContent(allValues[elem.name]);
                  } else {
                     elem.value = allValues[elem.name];
                  }
               } else
               
               if (elem.type=="radio" && elem.value == (allValues[elem.name])) {
                  elem.checked = true;
                  
               } else
               
               if (elem.type=="select-one") {
                  // elem.selectedIndex = allValues[elem.name]-1;
                  // alert("trying to write: " + allValues[elem.name]);
                  elem.value = (allValues[elem.name]);
                  
               } else
               
               if (elem.type=="checkbox") {
                  
                  if (allValues[elem.name]=="1" || allValues[elem.name]=="on") {
                     elem.checked = true;
                  } else { 
                     elem.checked = false;
                  }
                  
               }
               
            }
            
         }.bind(this));
         
      },
      
      
      // enable all elements within given form
      enableAllFormElements: function(form_id) {
         $(form_id).getElements().each(function(elem) {
               
               // strange hack to really enable textareas in Safari/Chrome
               if (elem.type=="textarea" && $F(elem)=="") {
                  elem.value=" ";
               }
               
               elem.enable();
               
               if (elem.type=="textarea" && $F(elem)==" ") {
                  elem.clear();
               }
               
               
         });
      },
      
      
      // disable all elements within given form
      disableAllFormElements: function(form_id) {
         $(form_id).getElements().each(function(elem) {
               elem.disable();
         });
      },
      
      
      // toggle visibility of given element (subform div)
      toggleSubForm: function(elem_id) {
         try {
            new Effect.toggle(elem_id, 'blind', {duration:0.5});
         } catch(e) { 
            alert("Helpers::toggleSubForm() could not toggle " + elem_id);
         }
      },
      
      
      
      
      /*
      
         <div id="flog_article_newcomment_image" style="display:none;clear:both;">
            <form action="upload.php" method="post" enctype="multipart/form-data" target="upload_target" onsubmit="new FlogArticleComment({$article.info.id}).startUpload();" >
            
                     <p id="flog_upload_process">Loading...<br/><img src="gfx/loader.gif" /><br/></p>
                     
                     <div id="flog_upload_form"><br/>
                     
                        <p id="flog_upload_formelements">
                           <input type="hidden" name="flog_article_id" value="{$article.info.id}" />
                           <input type="hidden" name="subfolder" value="images" />
                           <label>Datei:</label><br /> 
                           <input name="myfile" type="file" size="63" />
                           <label>
                           <input type="submit" name="submitBtn" value="Upload" style="float:right;margin-top: 6px;margin-right: 65px;"  />
                           </label>
                        </p>
                        <div id="flog_upload_resultcontainer"></div>
                            
                     </div>
                     
                     <iframe id="upload_target" name="upload_target" src="#" style="width:0;height:0;border:0px solid #fff;"></iframe>
             </form>
         </div>
      
      */
      
      
      
      
      toggleImageUploadForm: function(prefix) {
         
         $(prefix+'_upload_process').show();
         $(prefix+'_upload_form').hide();
         
      },
      
      
      
      
      // pseudo-callback after upload completed (called from js inserted via upload php script 
      afterImageUpload: function(status, prefix, target_form_field, thumbnail, filename, preview_container_id) {
         
         var statusMsg = '';
         var previewImage = '';
         
         if (status == 1) {
            statusMsg = '<p class="msg">Datei wurde erfolgreich hochgeladen.</p>';
            previewImage = '<br/><a href="'+filename+'" rel="lightbox"><img src="'+thumbnail+'" alt="userpicture" style="margin:4px;" /></a>';
         } else if (status == 2) {
            statusMsg = '<p class="msg">Dateityp unbekannt. Bitte verwende .jpg oder .png Dateien.</p><br/>';
         } else {
            statusMsg = '<p class="emsg">Es tut uns leid, aber es trat ein Fehler während des Hochladens auf.<br />Bitte versuche es nocheinmal oder probiere eine andere Datei.</p><br/>';
         }
         
         
         // target form field : 'flog_article'+this.article_id+'_newcomment_image'
         
         try {
            window.top.window.$(target_form_field).setAttribute('value', filename);
         } catch(e) {
            alert('target form field ('+target_form_field+') not found');
         }
         
         
         try {
            window.top.window.$(prefix+'_upload_process').hide(); 
         } catch(e) {
            alert(e);
         }
         
         
         try {
         
            if (preview_container_id) {
            
               window.top.window.$(preview_container_id).setStyle({
                  backgroundImage: 'url('+thumbnail+')'
               });
               
               try {
                   window.top.window.$(prefix+'_upload_resultcontainer').update(statusMsg);
                   window.top.window.$(prefix+'_upload_resultcontainer').show();
               } catch(e) {
                  confirm(e);
               }
               
            
            } else {
               
               try {
                   window.top.window.$(prefix+'_upload_resultcontainer').update(statusMsg + previewImage);
                   window.top.window.$(prefix+'_upload_resultcontainer').show();
               } catch(e) {
                  confirm(e);
               }
               
            }
         
         } catch(e) { confirm(e); }
         
         
         /*
         try {
            window.top.window.$(prefix+'_upload_formelements').hide();
         } catch(e) {
            alert(e);
         }
         */
         
         try {
            window.top.window.$(prefix+'_upload_form').show();
         } catch(e) {
            alert(e);
         }
         
         
         
         
         return true;   
         
      },
      
      
      
      renderImageUploadForm: function(targetcontainer, prefix, target_form_field, params) {
         
         /* params 
         
            hidden_fields : {
               subfolder: 'images'
            }
         
         */
         
         var form_el = new Element('form', { action: 'image_upload.php', method: 'post', enctype: 'multipart/form-data', target: prefix+'_upload_target', className: 'image_upload_form' });
         
         // form_el.insert(new Element('p', { id: prefix+'_upload_process' }).update('<p style="padding-top: 10px;"><em>Übertrage Daten...</em></p><img src="gfx/loader.gif" /><br/>').hide());
         
         var p1 = new Element('p', { id: prefix+'_upload_process' });
         
         p1.update(new Element('p').update(new Element('em').update("Übertrage Daten. . . ")).setStyle({'padding-top':'10px'}));
        
         p1.insert(new Element('img', { src: 'gfx/loader.gif' })).insert(new Element('br'));
         
         p1.hide();
         
         form_el.insert(p1);
         
         
         var form_container = new Element('div', { id: prefix+'_upload_form' }).update('<br />');
         
         var p = new Element('p', { id: prefix+'_upload_formelements' });
         
         if (params && params.hidden_fields) {
            for (field in params.hidden_fields) {
               p.insert(new Element('input', { type: 'hidden', name: field, value: params.hidden_fields[field] }));
            }
         }
                 
         p.insert(new Element('input', { type: 'hidden', name: 'prefix', value: prefix }));
         p.insert(new Element('input', { type: 'hidden', name: 'target_form_field', value: target_form_field }));
         
         p.insert(new Element('h3').update('Bild auswählen (upload):'));
         // p.insert(new Element('br'));
         
         var imagebutton = new Element('input', { name: 'myfile', type: 'file', size: 33, className: 'image_upload_form_button_select' });
         
         imagebutton.observe('change', function(ev) {
            new Helpers().toggleImageUploadForm(prefix);
            form_el.submit();
         });
         
         
         var result_container = new Element('div', {id: prefix+'_upload_resultcontainer'}).hide();
         
         p.insert(result_container);
         
         p.insert(imagebutton);
         
         /* p.insert(new Element('input', { type: 'submit', name: 'submitBtn', value: 'Hochladen', className: 'image_upload_form_button_submit' })); */
         
         var iframe = new Element('iframe', { id: prefix+'_upload_target', name: prefix+'_upload_target', src: '#' }).setStyle({ 'width': 0, 'height': 0, 'border': '0px solid #fff'});
         
         form_container.insert(p);
         // form_container.insert(result_container);
         
         form_el.insert(form_container);
         form_el.insert(iframe);
         
         try {
            $(targetcontainer).insert(form_el);
            $(targetcontainer).show();
         } catch(e) { }
         
         
         try {
            params.onComplete();
         } catch(e) {}
         
         
         return form_el;
      },
  
      
           
      
      
      
      // fill given form field with current date/time info
      fillWithCurrentDateTime: function(elem_id, pars) {
         
         var url = 'ajax/tools-getdatetime.php';
      
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: pars, 
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {
                        $(elem_id).setValue(response.datestring);
                     }
                  }
         });
         
      },
      
      
      // save custom user properties to user_info
      // collect all form elements in Hash Array and send to ajax 
      additionalInfoSaveAll: function(form_id) {

         var url = 'ajax/user-additionalinfo-save.php';
      
         pars = {
            values: Object.toJSON(this.collectFormElements(form_id))
         };
      
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: pars, 
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {
                        gui.handleResponse(response);
                        if (response.message) { alert(response.message); }
                     }
                  }.bind(this)
         });
   
      },
      
      
      // load custom user properties from user_info into form
      additionalInfoLoadAll: function(form_id) {
        
         var url = 'ajax/user-additionalinfo-load.php';
         
         new Ajax.Request(url, {
                  method: 'post',
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {
                        gui.handleResponse(response);
                        this.fillFormElements(form_id, response.values);
                        this.enableAllFormElements(form_id);
                     }
                  }.bind(this)
         });
         
      },
      
      
      
      /* ---------------- special form: fortbildung ------------------------- */
      
      
      // load subform 'fortbildung_tags' with checkboxes, then fill in data from db 
      fortbildungLoadFormValues: function(form_id, fortbildung_id) {
        
         pars_tags = {
            tablename: 'fortbildungen_tags',
            values: 'id',
            label: 'label',
            group: 'group',
            prefix: 'tag_'
         };
         
         this.getCheckboxesGrouped('fortbildung_tags', pars_tags, {
               
               onComplete: function() {
                  
                  var url = 'ajax/service-fortbildung-loadformvalues.php';
         
                  pars = { 
                     fortbildung_id: fortbildung_id
                  };
                  
                  new Ajax.Request(url, {
                           method: 'post',
                           parameters: pars, 
                           onComplete: function(transport) {
                              var response = transport.responseJSON;
                              if (response) {
                                 gui.handleResponse(response);
                                 this.fillFormElements(form_id, response.values);
                                 if (form_id=='fortbildungsubmission') {
                                    $('starttime_field', 'endtime_field', 'anmeldeschluss_field').invoke("clear");                                   
                                 }
                                 this.enableAllFormElements(form_id);
                              }
                           }.bind(this)
                  });
                  
                  
               }.bind(this)
               
         });
         
      },
      
      
      // save form values to table 'fortbildungen'
      // collect all form elements in Hash Array and send to ajax responder
      fortbildungSaveFormValues: function(form_id, fortbildung_id, ignore_validation) {
         
         var url = 'ajax/service-fortbildung-saveformvalues.php';
      
         pars = {
            values: this.collectFormElements(form_id),
            fortbildung_id: fortbildung_id
         };
         
         if (ignore_validation) { pars.ignore_validation = true; }
      
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: { 
                     params: Object.toJSON(pars)
                  },
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {
                        gui.handleResponse(response);
                        gui.handleFormMessages(response);
                        if (response.message) { alert(response.message); }
                     }
                  }.bind(this)
         });
         this.noconfirmmsg = true;   
      },
      
      
      // save new submission to table 'fortbildungen'
      // collect all form elements in Hash Array and send to ajax responder
      fortbildungSaveSubmission: function(form_id) {
         
         var url = 'ajax/service-fortbildung-savesubmission.php';
         
         pars = {
            values: this.collectFormElements(form_id)
         };
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: { 
                     params: Object.toJSON(pars)
                  },
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {
                        gui.handleResponse(response);
                        
                        if (response.message) { 
                           alert(response.message);
                        }
                        
                        first_error = gui.handleFormMessages(response);
                        
                        if (first_error) {
                           try {
                              $(first_error).up().scrollTo();
                           } catch(e) {}
                        } else {
                        
                           if (response.success && response.fortbildung_id) { 
                              window.location = 'http://'+baseurl+'service/fortbildungen/vorschlagen/vorschlagen.html?fortbildung_id='+response.fortbildung_id+'&fortbildung_code='+response.fortbildung_code+'&fortbildung_email='+response.fortbildung_email;
                           }
                           
                        }
                        
                     }
                  }.bind(this)
         });
         
      },
      
      
      //  remove one entry from database and HTML list
      fortbildungDelete: function(fortbildung_id) {
         
         var container_id = "fortbildung_"+fortbildung_id;
         
         $(container_id).setStyle({
            backgroundColor: '#fadddd',
            opacity: 0.5
         });
                  
         if (confirm("Eintrag wirklich löschen?\r\r Diese Aktion kann nicht rückgängig gemacht werden!")) {
            
            var url = 'ajax/service-fortbildung-delete.php';
      
            pars = {
               fortbildung_id: fortbildung_id
            };
         
            new Ajax.Request(url, {
                     method: 'post',
                     parameters: $H(pars).toQueryString(),
                     onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) {
                           
                           if (response.success) {
                              
                              // remove entry from HTML list                              
                              new Effect.BlindUp(container_id, {
                                 afterFinish: function() {
                                    $(container_id).remove();
                                 }.bind(this)
                              });
                              
                           }
                           
                           gui.handleResponse(response);
                           if (response.message) { alert(response.message); }
                        }
                     }.bind(this)
            });
            
         } else {
            
            $(container_id).setStyle({
               backgroundColor: 'white',
               opacity: 1
            });
            
         }
         
      },
      
      
      //  set approved-flag to 1
      fortbildungApprove: function(fortbildung_id) {
         
         var container_id = "fortbildung_"+fortbildung_id;
         
         $(container_id).setStyle({
            backgroundColor: '#fadddd',
            opacity: 0.5
         });
                  
         if (confirm("Vorschlag übernehmen?")) {
            
            var url = 'ajax/service-fortbildung-approve.php';
      
            pars = {
               fortbildung_id: fortbildung_id
            };
         
            new Ajax.Request(url, {
                     method: 'post',
                     parameters: $H(pars).toQueryString(), 
                     onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) {
                           
                           if (response.success) {
                              
                              // remove entry from HTML list                              
                              new Effect.BlindUp(container_id, {
                                 afterFinish: function() {
                                    $(container_id).remove();
                                 }.bind(this)
                              });
                              
                           }
                           
                           gui.handleResponse(response);
                           if (response.message) { alert(response.message); }
                        }
                     }.bind(this)
            });
            
         } else {
            
            $(container_id).setStyle({
               backgroundColor: 'white',
               opacity: 1
            });
            
         }
         
      },
      
      
      fortbildungJoin: function(fortbildungs_id, container_id, fortbildung_last) {
         var url = 'ajax/fortbildungen-userwants.php';
         // id is inside the other ajax responder
         new Ajax.Updater(''+container_id+'', url, {
            parameters: {
               fortbildungs_id: fortbildungs_id,
               fortbildung_last: fortbildung_last
            }
         });
      },
      
      
      fortbildungJoin_detail:function(join_type) {
         var url = 'ajax/fortbildungen-userwants.php';
         new Ajax.Updater('fortbildungen_userlist', url, {
            parameters: {
               fortbildungs_id: fortbildungs_id,
               fortbildung_detail: true,
               join_type: join_type
            },
            insertion: 'after'
         });
         $('fortbildung_button').fade({ duration: 1.5, from: 1, to: 0 });
         try {
            $('nouser_fortbildung').remove();
         } catch(e) { }
      },
      
      
      fortbildungUserhasrealyattended: function(fortbildungs_id) {
         var url = 'ajax/fortbildungen_userhasrealyattended.php';
         new Ajax.Updater('fortbildung_wands', url, {
            parameters: {
               fortbildungs_id: fortbildungs_id            
            }
         });      
      },
   
      
      fortbildungUserhasnotattended: function(fortbildungs_id) {
         var url = 'ajax/fortbildungen_userhasnotattended.php';
       
         new Ajax.Updater('fortbildung_wands', url, {
            parameters: {
               fortbildungs_id: fortbildungs_id            
            }
         });
      },
      
      
      
      /* ---------------- special form: externat ------------------------- */
      
      externatLoadFormValues: function(form_id, externat_id) {
         
         var url = 'ajax/service-externat-loadformvalues.php';
   
         pars = { 
            externat_id: externat_id
         };
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: pars, 
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {
                        gui.handleResponse(response);
                        if(response.success) {
                           this.fillFormElements(form_id, response.values);
                           this.enableAllFormElements(form_id);
                        } else {
                           alert('Es konnten die Textfelder aus der Datenbank nicht geladen werden.')
                        }
                     }
                  }.bind(this)
         });
              
      },
      
      
      // save form values to table 'fortbildungen'
      // collect all form elements in Hash Array and send to ajax responder
      externatSaveFormValues: function(form_id, externat_id, ignore_validation) {
         
         var url = 'ajax/service-externat-saveformvalues.php';
      
         pars = {
            values: this.collectFormElements(form_id),
            externat_id: externat_id
         };
         
         if (ignore_validation) { pars.ignore_validation = true; }
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: { 
                     params: Object.toJSON(pars)
                  },
                  onComplete: function(transport) {
                     
                     var response = transport.responseJSON;
                     if (response) {
                        gui.handleResponse(response);
                        gui.handleFormMessages(response);
                        if (response.message) { alert(response.message); }
                     }
                  }.bind(this)                  
         });
         this.noconfirmmsg = true;
      },
      
      
      // save new submission to table 'externat'
      // collect all form elements in Hash Array and send to ajax responder
      externatSaveSubmission: function(form_id) {
         
         var url = 'ajax/service-externat-savesubmission.php';
         
         pars = {
            values: this.collectFormElements(form_id)
         };
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: { 
                     params: Object.toJSON(pars)
                  },
                  onComplete: function(transport) {
                     
                     var response = transport.responseJSON;
   
                     if (response) {
                        gui.handleResponse(response);
                        
                        if (response.message) { 
                           alert(response.message);                          
                        }
                        
                        first_error = gui.handleFormMessages(response);
                        
                        if (first_error) {
                           try {
                              $(first_error).up().scrollTo();
                           } catch(e) {}
                        } else {
                        
                           if (response.success) {
                              window.location = 'http://'+baseurl+'service/externat/vorschlagen/vorschlagen.html?externat_id='+response.externats_id+'&externats_code='+response.externats_code+'&externats_email='+response.externats_email
                           }
                        }
                     }
                  }.bind(this)
         });
      },
      
      
      // save new submission to table 'externat'
      // collect all form elements in Hash Array and send to ajax responder
      createExternatFromUser: function() {
         var url = 'ajax/service-externat-createexternatfromuser.php';
         
         new Ajax.Request(url, {
                  method: 'post',
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {
                        gui.handleResponse(response);
                        gui.handleFormMessages(response);
                        if (response.message) { alert(response.message); }
                        if (response.success) { window.location = 'http://'+baseurl+'service/externat/admin/externats__administration.html?externat_id='+response.externat_id+'&fromuser='+response.user_id;}
                     }
                  }.bind(this)
         });
      },
      
      
      //  set approved-flag to 1
      externatApprove: function(externat_id) {
         
         var container_id = "externat_"+externat_id;
         
         $(container_id).setStyle({
            backgroundColor: '#fadddd',
            opacity: 0.5
         });
                  
         if (confirm("Vorschlag übernehmen?")) {
            
            var url = 'ajax/service-externat-approve.php';
      
            pars = {
               externat_id: externat_id
            };
         
            new Ajax.Request(url, {
                     method: 'post',
                     parameters: $H(pars).toQueryString(), 
                     onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) {
                          
                           if (response.success) {
                              // remove entry from HTML list                              
                              new Effect.BlindUp(container_id, {
                                 afterFinish: function() {
                                    $(container_id).remove();
                                 }.bind(this)
                              });
                              
                           }
                           
                           gui.handleResponse(response);
                           if (response.message) { alert(response.message); }
                        }
                     }.bind(this)
            });
            
         } else {
            
            $(container_id).setStyle({
               backgroundColor: 'white',
               opacity: 1
            });
            
         }
         
      },
      
      
      externatDelete: function(externat_id) {
         
         var container_id = "externat_"+externat_id;
         var container_list_id = "externat_list_"+externat_id;
         
         try {
            $(container_id).setStyle({
                  backgroundColor: '#fadddd',
                  opacity: 0.5
            });
         } catch(e) {}
            
         try {
            $(container_list_id).setStyle({
                  backgroundColor: '#fadddd',
                  opacity: 0.5
            });
         } catch(e) {}
                  
         if (confirm("Eintrag wirklich löschen?\r\r Diese Aktion kann nicht rückgängig gemacht werden!")) {
            
            var url = 'ajax/service-externat-delete.php';
      
            pars = {
               externat_id: externat_id
            };
         
            new Ajax.Request(url, {
                     method: 'post',
                     parameters: $H(pars).toQueryString(), 
                     onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) {
                           
                           if (response.success) {
                              try {
                                 // remove entry from HTML list                              
                                 new Effect.BlindUp(container_id, {
                                    afterFinish: function() {
                                       $(container_id).remove();
                                    }.bind(this)
                                 });
                              } catch(e) {}
                              
                              try {
                                 // remove entry from HTML list                              
                                 new Effect.BlindUp(container_list_id, {
                                    afterFinish: function() {
                                       $(container_offer_id).remove();
                                    }.bind(this)
                                 });
                              } catch(e) {}
                              
                           }
                           
                           gui.handleResponse(response);
                           if (response.message) { alert(response.message); }
                        }
                     }.bind(this)
            });
            
         } else {
            
            try {
               $(container_id).setStyle({
                  backgroundColor: 'white',
                  opacity: 1
               });
            } catch(e) {}
            
             try {
               $(container_list_id).setStyle({
                  backgroundColor: 'white',
                  opacity: 1
               });
            } catch(e) {}
         }
         
      },
      
      
      // fetch info if user offers an externat
      externatUserInfo: function(target_id) {
         var url = 'ajax/service-externat-userinfo.php';
         
         new Ajax.Request(url, {
                  method: 'post',
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {
                        gui.handleResponse(response);
                        $(target_id).update(response.html);
                     } else {
                        $(target_id).update("no response object from ajax");
                     }
                     
                     
                  }.bind(this)
         });
         
      },
      
      
      
      /* ---------------- special form: joboffer ------------------------- */
      
      jobofferLoadFormValues: function(form_id, joboffer_id) {
         
         var url = 'ajax/service-joboffer-loadformvalues.php';

         pars = { 
            joboffer_id: joboffer_id
         };
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: pars, 
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {
                        gui.handleResponse(response);
                        if(response.success) {
                           this.fillFormElements(form_id, response.values);
                           this.enableAllFormElements(form_id);
                        } else {
                           alert('Es konnten die Textfelder aus der Datenbank nicht geladen werden.')
                        }
                     }
                  }.bind(this)
         });
           
      },
      
      
      // save form values to table 'fortbildungen'
      // collect all form elements in Hash Array and send to ajax responder
      jobofferSaveFormValues: function(form_id, joboffer_id, ignore_validation) {
      
         var url = 'ajax/service-joboffer-saveformvalues.php';
      
         pars = {
            values: this.collectFormElements(form_id),
            joboffer_id: joboffer_id
         };
         
         if (ignore_validation) { pars.ignore_validation = true; }
      
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: { 
                     params: Object.toJSON(pars)
                  },
                  onComplete: function(transport) {
                     
                     var response = transport.responseJSON;
      
                     if (response) {
                        gui.handleResponse(response);
                        gui.handleFormMessages(response);
                        if (response.message) { alert(response.message); }
                     }
                  }.bind(this)                  
         });
         this.noconfirmmsg = true;
      },
      
      
      // save new submission to table 'joboffer'
      // collect all form elements in Hash Array and send to ajax responder
      jobofferSaveSubmission: function(form_id) {
         
         var url = 'ajax/service-joboffer-savesubmission.php';
         
         pars = {
            values: this.collectFormElements(form_id)           
         };
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: { 
                     params: Object.toJSON(pars)
                  },
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {
                        gui.handleResponse(response);
                        
                        if (response.message) { 
                           alert(response.message);                          
                        }
                        
                        first_error = gui.handleFormMessages(response);
                        
                        if (first_error) {
                           try {
                              $(first_error).up().scrollTo();
                           } catch(e) {}
                        } else {
                           if (response.success) {
                              window.location = 'http://'+baseurl+'service/joboffer/vorschlagen/vorschlagen.html?joboffer_id='+response.joboffer_id+'&joboffer_code='+response.joboffer_code+'&joboffer_email='+response.joboffer_email
                           }
                        }
                     }
                  }.bind(this)
         });
      },
      
      
      // save new submission to table 'joboffer'
      // collect all form elements in Hash Array and send to ajax responder
      createJobofferFromUser: function() {
         var url = 'ajax/service-joboffer-createjobofferfromuser.php';
         
         new Ajax.Request(url, {
                  method: 'post',
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {
                        gui.handleResponse(response);
                        gui.handleFormMessages(response);
                        if (response.message) { alert(response.message); }
                        if (response.success) { window.location = 'http://'+baseurl+'service/joboffer/admin/joboffers__administration.html?joboffer_id='+response.joboffer_id+'&fromuser='+response.user_id;}
                     }
                  }.bind(this)
         });
      },
      
      
      //  set approved-flag to 1
      jobofferApprove: function(joboffer_id) {
         
         var container_id = "joboffer_"+joboffer_id;
         
         $(container_id).setStyle({
            backgroundColor: '#fadddd',
            opacity: 0.5
         });
                  
         if (confirm("Vorschlag übernehmen?")) {
            
            var url = 'ajax/service-joboffer-approve.php';
      
            pars = {
               joboffer_id: joboffer_id
            };
         
            new Ajax.Request(url, {
                     method: 'post',
                     parameters: $H(pars).toQueryString(), 
                     onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) {
                          
                           if (response.success) {
                              // remove entry from HTML list                              
                              new Effect.BlindUp(container_id, {
                                 afterFinish: function() {
                                    $(container_id).remove();
                                 }.bind(this)
                              });
                              
                           }
                           
                           gui.handleResponse(response);
                           if (response.message) { alert(response.message); }
                        }
                     }.bind(this)
            });
            
         } else {
            
            $(container_id).setStyle({
               backgroundColor: 'white',
               opacity: 1
            });
            
         }
         
      },
      
      
      jobofferDelete: function(joboffer_id) {
         
         var container_id = "joboffer_"+joboffer_id;
         var container_list_id = "joboffer_list_"+joboffer_id;
         
         try {
            $(container_id).setStyle({
                  backgroundColor: '#fadddd',
                  opacity: 0.5
            });
         } catch(e) {}
            
         try {
            $(container_list_id).setStyle({
                  backgroundColor: '#fadddd',
                  opacity: 0.5
            });
         } catch(e) {}
                  
         if (confirm("Eintrag wirklich löschen?\r\r Diese Aktion kann nicht rückgängig gemacht werden!")) {
            
            var url = 'ajax/service-joboffer-delete.php';
      
            pars = {
               joboffer_id: joboffer_id
            };
         
            new Ajax.Request(url, {
                     method: 'post',
                     parameters: $H(pars).toQueryString(), 
                     onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) {
                           
                           if (response.success) {
                              try {
                                 // remove entry from HTML list                              
                                 new Effect.BlindUp(container_id, {
                                    afterFinish: function() {
                                       $(container_id).remove();
                                    }.bind(this)
                                 });
                              } catch(e) {}
                              
                              try {
                                 // remove entry from HTML list                              
                                 new Effect.BlindUp(container_list_id, {
                                    afterFinish: function() {
                                       $(container_offer_id).remove();
                                    }.bind(this)
                                 });
                              } catch(e) {}
                              
                           }
                           
                           gui.handleResponse(response);
                           if (response.message) { alert(response.message); }
                        }
                     }.bind(this)
            });
            
         } else {
            
            try {
               $(container_id).setStyle({
                  backgroundColor: 'white',
                  opacity: 1
               });
            } catch(e) {}
            
             try {
               $(container_list_id).setStyle({
                  backgroundColor: 'white',
                  opacity: 1
               });
            } catch(e) {}
         }
         
      },
      
      
      jobofferUserInfo: function(target_id) {
         var url = 'ajax/service-joboffer-userinfo.php';
         
         new Ajax.Request(url, {
                  method: 'post',
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {
                        gui.handleResponse(response);
                        $(target_id).update(response.html);
                     } else {
                        $(target_id).update("no response object from ajax");
                     }
                  }.bind(this)
         });
         
      },
      
      /* ---------------- form: messetermine ------------------------- */
      
      // load form values from db
      messeterminLoadFormValues: function(form_id, event_id) {

         var url = 'ajax/service-messetermin-loadformvalues.php';

         pars = { 
            event_id: event_id
         };
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: $H(pars).toQueryString(), 
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {
                        gui.handleResponse(response);
                        this.fillFormElements(form_id, response.values);
                        this.enableAllFormElements(form_id);
                     }
                  }.bind(this)
         });
         
      },

      
      // save form values to table 'events'
      // collect all form elements in Hash Array and send to ajax responder
      messeterminSaveFormValues: function(form_id, event_id) {

         var url = 'ajax/service-messetermin-saveformvalues.php';
      
         pars = {
            values: this.collectFormElements(form_id),
            event_id: event_id
         };
      
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: { 
                     params: Object.toJSON(pars)
                  }, 
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {
                        gui.handleResponse(response);
                        gui.handleFormMessages(response);
                        if (response.message) { alert(response.message); }
                     }
                  }.bind(this)
         });
   
      },
      
      
      //  remove one entry from database and HTML list
      messeterminDelete: function(event_id) {
         
         var container_id = "event_"+event_id;
         
         $(container_id).setStyle({
            backgroundColor: '#fadddd',
            opacity: 0.5
         });
                  
         if (confirm("Eintrag wirklich löschen?\r\r Diese Aktion kann nicht rückgängig gemacht werden!")) {
            
            var url = 'ajax/service-messetermin-delete.php';
      
            pars = {
               event_id: event_id
            };
         
            new Ajax.Request(url, {
                     method: 'post',
                     parameters: $H(pars).toQueryString(), 
                     onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) {
                           
                           if (response.success) {
                              
                              // remove entry from HTML list                              
                              new Effect.BlindUp(container_id, {
                                 afterFinish: function() {
                                    $(container_id).remove();
                                 }.bind(this)
                              });
                              
                           }
                           
                           gui.handleResponse(response);
                           if (response.message) { alert(response.message); }
                        }
                     }.bind(this)
            });
            
         } else {
            
            $(container_id).setStyle({
               backgroundColor: 'white',
               opacity: 1
            });
            
         }
         
      },
      
      
      messeterminJoin: function(event_id, container_id) {     
          var url = 'ajax/events-userwants.php';
          // id is inside the other ajax responder
          new Ajax.Updater(''+container_id+'', url, {
            parameters: {
               event_id: event_id
            }
          });
      },
      
      
      
      
      /* ----------------- helper for Form "Kleinanzeiger" --------------------- */
      
      
      // load subform 'fortbildung_tags' with checkboxes, then fill in data from db 
      kleinanzeigeLoadFormValues: function(form_id, kleinanzeige_id) {
         
         pars_tags = {
            tablename: 'kleinanzeigen_tags',
            values: 'id',
            label: 'label',
            group: 'group',
            prefix: 'tag_'
         };
         
         this.getCheckboxesGrouped('kleinanzeige_tags', pars_tags, {
               
               onComplete: function() {
                  
                  var url = 'ajax/service-kleinanzeige-loadformvalues.php';
         
                  pars = {
                     kleinanzeige_id: kleinanzeige_id
                  };
                  
                  new Ajax.Request(url, {
                           method: 'post',
                           parameters: pars,
                           onComplete: function(transport) {
                              
                              var response = transport.responseJSON;
                              if (response) {
                                 gui.handleResponse(response);
                                 this.fillFormElements(form_id, response.values);
                                 this.enableAllFormElements(form_id);
                              }
                           }.bind(this)
                  });
                  
               }.bind(this)
               
         });
         
      },
      
      
      // save form values to table 'kleinanzeigen'
      // collect all form elements in Hash Array and send to ajax responder
      kleinanzeigeSaveFormValues: function(form_id, kleinanzeige_id) {
         
         var url = 'ajax/service-kleinanzeige-saveformvalues.php';
      
         pars = {
            values: this.collectFormElements(form_id),
            kleinanzeige_id: kleinanzeige_id
         };
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: { 
                     params: Object.toJSON(pars)
                  },
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {
                        gui.handleResponse(response);
                        gui.handleFormMessages(response);
                        if (response.message) { alert(response.message); }
                     }
                  }.bind(this)
         });
   
      },
      
      
      
      //  remove one entry from database and HTML list
      kleinanzeigeDelete: function(kleinanzeige_id) {
         
         var container_id = "kleinanzeige_"+kleinanzeige_id;
         
         $(container_id).setStyle({
            backgroundColor: '#fadddd',
            opacity: 0.5
         });
                  
         if (confirm("Angebot wirklich löschen?\r\r Diese Aktion kann nicht rückgängig gemacht werden!")) {
            
            var url = 'ajax/service-kleinanzeige-delete.php';
      
            pars = {
               kleinanzeige_id: kleinanzeige_id
            };
         
            new Ajax.Request(url, {
                     method: 'post',
                     parameters: pars, 
                     onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) {
                           
                           if (response.success) {
                              // remove entry from HTML list                              
                              new Effect.BlindUp(container_id, {
                                 afterFinish: function() {
                                    $(container_id).remove();
                                 }.bind(this)
                              });
                           }
                           
                           gui.handleResponse(response);
                           if (response.message) { alert(response.message); }
                        }
                     }.bind(this)
            });
            
         } else {
            
            $(container_id).setStyle({
               backgroundColor: 'white',
               opacity: 1
            });
            
         }
         
      },
      
     
      
      
      kolleginnenbytag: function(target_id, oncomplete) {
         
         var url = 'ajax/helpers-kolleginnenbytag-getoptions.php';
         
         new Ajax.Request(url, {
                  method: 'post',
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {                       
                        gui.handleResponse(response);
                        $(target_id).update(response.html);
                     } else {
                        $(target_id).update("no response object from ajax");
                     }
                     if (oncomplete) {
                        eval('('+oncomplete+')');
                     }
                     
                  }.bind(this)
         });
         
      },
      
      
       
      kolleginnen_tagcloud: function(target_id, tag_id) {
         var url = 'ajax/helpers-kolleginnenbytag_tagcloud.php';
         
         if (tag_id > -1) {
            var pars = {
               prefix: target_id,
               tag_id: tag_id
            }
         } else {
            var pars = {
               prefix: target_id
            }
         }
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: pars,
                  onComplete: function(transport) {
                      var response = transport.responseText;
                      
                     if (response) {
                       // gui.handleResponse(response);
                        $(target_id).update(transport.responseText);
                        
                     } else {
                        $(target_id).update("no response object from ajax");
                     }
                   
                     
                  }.bind(this)
         });
      }
      
   }

