
   /* ********************************************************************************** */
   /*                                                                                    */
   /*  Class User (virtual user)                                                         */
   /*                                                                                    */
   /*  getId()                            -  returns id of user object                   */
   /*  setName(string)                    -  sets name property (memory only)            */
   /*  getName()                          -  returns name property                       */
   /*  jumpTo()                           -  redirect to userpage                        */
   /*  like(uri, target, title, button)   -  adds a like from a like-button              */
   /*  getPersonalTags(target_container)  -  list tags of user                           */
   /*  getTagSelectList(target_id, pars)  -  returns list of tags (checkboxes)           */
   /*  saveTagSelectList(source_id, pars) -  save state of user tags                     */
   /*  getUserPage()                      -  build up complete user page                 */
   /*  remove()                           -  removes a user from db                      */
   /*                                                                                    */
   /*                                                                                    */
   /*  Class SessionUser (real current user)                                             */
   /*  offers no methods, just different constructor, adds own messagebox                */
   /*                                                                                    */
   /*                                                                                    */
   /*  Class Users (plural)                                                              */
   /*  initialize(user_id (opt.))                    - connection to single user         */
   /*                                                                                    */
   /*  getId()                                       - returns id of connected user      */
   /*  getUsersBySearch(searchstr, target_id)        - lists users matching string       */
   /*  getNewestMembers(number, target_id)           - lists x newest users              */
   /*  getByRegion(target_id, params)                - lists users by distance           */
   /*  getBySchool(target_id, params)                - lists users by school             */ 
   /*  getByAlphabet(target_id, params)              - lists users by letter             */   
   /*  getByTag(target_id, params)                   - lists users matching tag_id       */ 
   /*  getByHomepage(target_id)                      - lists users with own homepage     */ 
   /*  getByGalleries(target_id)                     - lists users with own galleries    */ 
   /*  getMostActive(number, target_id, params)      - lists users with most postings    */
   /*  getMostContacts(number, target_id, params)    - lists users with most contacts    */
   /*  getUnknownMembers(number, target_id, params)  - lists users not connected to S.U. */ 
   /*                                                                                    */
   /* ********************************************************************************** */

   
   var User = Class.create();
   
   User.prototype = {
   
      // constructor
      initialize: function(user_id, name) {
         this.id = user_id;
         
         if (name) {
            this.name = name;
         }
         
         
         // use try/catch so User class will work even if other classes are not loaded
         
         try {
            this.friends   = new SocialContacts(this.id);
         } catch(e) {
            // alert("loading of SocialContacts failed for user");
         }
         
         try {
            this.groups    = new GroupManager(this.id);
         } catch(e) {
            // alert("loading of GroupManager failed for user");
         }
         
         try {
            this.guestbook = new GuestBook(this.id, 'userpage_personal_guestbook');
         } catch(e) {
            // alert("loading of GuestBook failed for user");
         }
         
         try {
            this.galleries = new GalleryBrowser(this.id, 'userpage_photogalleries');
         } catch(e) {
            // alert("loading of GalleryBrowser failed for user");
         }
         
         
      },
   
      // return user_id
      getId: function() {
         return this.id;
      },
      
      // set Name property
      setName: function(name) {
         this.name = name;
      },
      
      // get Name property
      getName: function() {
         return this.name;
      },
      
      
      // jump to User's own page
      jumpTo: function() {
         if (baseurl) {
            var target_url = "http://" + baseurl + "user?userpage="+this.getId();
         } else {
            var target_url = "user?userpage="+this.getId();
         }
         location.href = target_url;
      },
     
      
      
      
      // like
      like: function(uri, linktarget, title, button_id, owner_id) {

         var url = 'ajax/user-like.php';
         
         var pars = {
            uri: uri,
            linktarget: linktarget,
            title: title
         };
         
         if (!isNaN(owner_id)) {
            pars.owner_id = owner_id;
         }
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: pars,
                  onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) {
                           
                           gui.handleResponse(response);
                           
                           try {
                              
                              var plusbutton = $$('#'+button_id+' img.plusbutton').first();
                              new Effect.Fade(plusbutton);
                              
                              var star = $$('#'+button_id+' span.likebutton_compact_star').first();
                              star.update(response.html);
                              
                           } catch(e) {}
                           
                           
                        } else {
                           // $(target_id).update("no response object from ajax "+url);
                        }
                  }.bind(this)
         });
         
         
         
      },
      
      
      
      
      
      // list personal tags of user (professional and private interests)
      getPersonalTags: function(target_id) {
         
         var url = 'ajax/user-gettaglist.php';
         var pars = {
            user_id: this.getId()
         };
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: pars, 
                  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 "+url);
                        }
                  }.bind(this)
         });
         
      },
      
      
      // list all tags as checkboxes with the own ones already checked
      getTagSelectList: function(target_id, pars) {
         
         var url = 'ajax/user-gettagselectlist.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).innerHTML = response.html;
                     } else {
                        $(target_id).innerHTML = "invalid response from ajax "+url;
                     }
                  }.bind(this)
         });
      },
      
      
      
      // saves state of UserTag checkboxes
      saveTagSelectList: function(source_id, pars) {
         
         // collect all checked checkboxes
         boxes = new Array();
         $(source_id).getInputs('checkbox').each(function(cb) {
            if (cb.checked) {
               boxes.push(cb.name);
            }
         });
         
         pars.values = boxes; 
         
         var url = 'ajax/user-savetagselectlist.php';
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: { 
                     params: Object.toJSON(pars)
                  }, 
                  onComplete: function(transport) {
                     var response = transport.responseJSON;
                     if (response) {
                        gui.handleResponse(response);
                     }
                  }.bind(this)
         });
         
      },
      
      
      // render info about current user into several target containers
      getUserpage: function(target_id) {
         
         var url = 'ajax/socialcontacts-getuserpage.php';
         var pars = {
            user_id: this.getId()
         };
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: pars, 
                  onComplete: function(transport) {
                        // this.workingindicator.switchOff();
                        var response = transport.responseJSON;
                        
                        if (response && response.html) { 
                           gui.handleResponse(response);
                           $(target_id).update(response.html);
                           this.friends.getSummary('userpage_personal_friends_list');
                           this.groups.getSummary('userpage_personal_groups_list', "box");
                           this.getPersonalTags('userpage_personal_tag_list');
                           
                           this.guestbook.showEntries();
                           this.galleries.renderMiniList();
                           
                        } else {
                           $(target_id).update("Invalid response from ajax: "+url);
                        }
                        
                  }.bind(this)
         });
         
      },
      
      
      // create a new user database entry
      create: function() {
         alert("User:create() Not yet implemented (not needed) !!");
      },
      
      
      remove: function() {
         
         dump.add("User:remove() user.id="+this.id);
         
         var confirmed=confirm("Really delete user "+this.id+" ?\n\nAre you sure?");
         if (confirmed) {
            
            dump.add("User:remove() confirmed.");
         
            gui.workingindicator.message('Lösche Mitglied aus Datenbank. Prüfe Rechte...');
            gui.workingindicator.switchOn();
            
            var url = 'ajax/user-remove.php';
            var pars = {
               user_id: this.id
            };
            new Ajax.Request(url, {
               method: 'post', 
               parameters: pars, 
               onSuccess: function(transport) {
                  
                  var response = transport.responseJSON;
                  if (response) {
                     gui.handleResponse(response);
                  }
                  gui.workingindicator.switchOff();
                  
               }.bind(this),
               onFailure: function() {
                  alert("Failed to delete user");
                  gui.workingindicator.switchOff();
               }.bind(this)
               
            });
            
            
                        
         } else {
            // do nothing, user canceled
            dump.add("User:remove() canceled. User "+this.id+" not removed.");            
         }
         
         return false;
         
      }
      
   }
   
   
   
   /************************************************************/
   /*  Class SessionUser extends User                          */
   /*  this is the active user, not any virtual hebiana user   */
   /*                                                          */
   /*  adds an own messagebox                                  */
   /*                                                          */
   /************************************************************/
   
   var SessionUser = Class.create(User, {
   
      initialize: function(user_id, name) {
         this.id = user_id;
         if (name) {
            this.name = name;
         }
         
         try {
            this.friends    = new SocialContacts(this.id);
         } catch(e) {
            // alert("loading of SocialContacts failed for session user");
         }
         
         try {
            this.groups     = new GroupManager(this.id);
         } catch(e) {
            // alert("loading of GroupManager failed for session user");
         }
         
         try {
            this.messagebox = new MessageBox(this.id);
         } catch(e) {
            // alert("loading of MessageBox failed for session user");
         }
         
         try {
            this.guestbook = new GuestBook(this.id, 'userpage_personal_guestbook');
         } catch(e) {
            // alert("loading of GuestBook failed for session user");
         }
         
         try {
            this.galleries = new GalleryBrowser(this.id, 'userpage_photogalleries');
         } catch(e) {
            // alert("loading of GalleryBrowser failed for user");
         }
         
         
      }
      
   });
   
   
   

   /************************************************************/
   /*  Class Users (plural)                                    */
   /*                                                          */
   /*  everything about other users (not connected to one      */
   /*  given user or the session user). Mostly for getting     */
   /*  lists of users matching some search criteria.           */
   /*                                                          */
   /*  Users is bound to active or given user, as search       */
   /*  results or lists can vary in output if returned user    */
   /*  is connected to searching user.                         */
   /*                                                          */
   /************************************************************/
   

   var Users = Class.create();
   
   Users.prototype = {

      // Constructor: optional parameter user_id       
      initialize: function(user_id) {
         
         // use given user or global user
         if (user_id) {
            this.user_id = user_id;
         } else {
            this.user_id = user.getId();
         }
         
      },
      
      
      // return user id
      getId: function() {
         return this.user_id;
      },
      
      
      // return list of users, matching searchstring
      getUsersBySearch: function(searchstring, target_id) {
         
         var url = 'ajax/users-getusersbysearch.php';
         
         var pars = {
            user_id : this.getId(),
            searchstring: searchstring
         };
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: $H(pars).toQueryString(),
                  onComplete: function(transport) {
                        var response = transport.responseJSON;
                        
                        if (response) { 
                           // render container templates
                           $(target_id).update(response.html);
                           gui.handleResponse(response);
                        } else {
                           $(target_id).update("no response object from ajax "+url);
                        }
                        
                  }.bind(this)
         });
         
      },
      
      
      
      // return list of users (up to given number)
      getNewestMembers: function(number, target_id) {
         
         var url = 'ajax/users-getnewestmembers.php';
         
         var pars = {
            number: number
         };
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: pars, 
                  onComplete: function(transport) {
                        var response = transport.responseJSON;
                        
                        if (response) { 
                           // render container templates
                           $(target_id).update(response.html);
                           gui.handleResponse(response);
                        } else {
                           $(target_id).update("no response object from ajax "+url);
                        }
                        
                  }.bind(this)
         });
         
      },
      
      
      
      // return list of users by geo-distance
      getByRegion: function(target_id, params) {
         
         var url = 'ajax/users-getbyregion.php';
                  
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: $H(params).toQueryString(),
                  onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) { 
                           // render container templates
                           $(target_id).update(response.html);
                           gui.handleResponse(response);
                        } else {
                           $(target_id).update("no response object from ajax "+url);
                        }
                  }.bind(this)
         });
         
      },
      
      
      // return list of users (up to given number)
      getBySchool: function(target_id, params) {
        
         var url = 'ajax/users-getbyschool.php';
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: $H(params).toQueryString(),
                  onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) { 
                           // render container templates
                           $(target_id).update(response.html);
                           gui.handleResponse(response);
                        } else {
                           $(target_id).update("no response object from ajax "+url);
                        }
                  }.bind(this)
         });
         
      },
      
      
      // return list of users (up to given number)
      getByAlphabet: function(target_id, params) {
         
         var url = 'ajax/users-getbyalphabet.php';
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: $H(params).toQueryString(), 
                  onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) { 
                           // render container templates
                           $(target_id).update(response.html);
                           gui.handleResponse(response);
                        } else {
                           $(target_id).update("no response object from ajax "+url);
                        }
                  }.bind(this)
         });
         
      },
      
      
      
      // return list of users (up to given number) matching given tag_id
      getByTag: function(target_id, params) {
         
         var url = 'ajax/users-getbytag.php';
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: $H(params).toQueryString(), 
                  onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) { 
                           $(target_id).update(response.html);
                           gui.handleResponse(response);
                        } else {
                           $(target_id).update("no response object from ajax "+url);
                        }
                  }.bind(this)
         });
         
      },
      
      
      
      // return list of users (up to given number) having own homepage
      getByHomepage: function(target_id, params) {
      
         var url = 'ajax/users-getbyhomepage.php';
         
         new Ajax.Request(url, {
                  method: 'post',
                  onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) { 
                           $(target_id).update(response.html);
                           gui.handleResponse(response);
                        } else {
                           $(target_id).update("no response object from ajax "+url);
                        }
                  }.bind(this)
         });
         
      },
      
      
      
      // return list of users (up to given number) having own photogalleries
      getByGalleries: function(target_id, params) {
         
         var url = 'ajax/users-getbygalleries.php';
         
         new Ajax.Request(url, {
                  method: 'post',
                  onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) { 
                           $(target_id).update(response.html);
                           gui.handleResponse(response);
                        } else {
                           $(target_id).update("no response object from ajax "+url);
                        }
                  }.bind(this)
         });
         
      },
      
      
      
      // return list of users who are currently logged into hebiana
      getOnline: function(target_id) {
         
         var url = 'ajax/users-getonline.php';
         
         new Ajax.Request(url, {
                  method: 'post',
                  onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) { 
                           $(target_id).update(response.html);
                           gui.handleResponse(response);
                        } else {
                           $(target_id).update("no response object from ajax "+url);
                        }
                  }.bind(this)
         });
         
      },
      
      
      // return list of users (up to given number) ordered by postings activity
      getMostActive: function(number, target_id, params) {
      
         var url = 'ajax/users-getmostactive.php';
         
         try {
            params.number = number;
         } catch(e) {
            var params = {
               number: number
            }
         }
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: $H(params).toQueryString(),
                  onComplete: function(transport) {
                        var response = transport.responseJSON;  
                        if (response) {
                           $(target_id).update(response.html);
                           gui.handleResponse(response);
                        } else {
                           $(target_id).update("no response object from ajax "+url);
                        }
                        
                  }.bind(this)
         });
         
      },
      
      
      
      // return list of users (up to given number) ordered by number of social contacts
      getMostContacts: function(number, target_id, params) {
         
         var url = 'ajax/users-getmostcontacts.php';
         
         try {
            params.number = number;
         } catch(e) {
            var params = {
               number: number
            }
         }
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: $H(params).toQueryString(), 
                  onComplete: function(transport) {
                        var response = transport.responseJSON;
                        
                        if (response) { 
                           // render container templates
                           $(target_id).update(response.html);
                           gui.handleResponse(response);
                        } else {
                           $(target_id).update("no response object from ajax "+url);
                        }
                        
                  }.bind(this)
         });
         
      },
      
      
      
      // return list of users (up to given number) that have no social connection to session user
      getUnknownMembers: function(number, target_id, params) {
         
         var url = 'ajax/users-getunknown.php';
         
         try {
            params.number = number;
         } catch(e) {
            var params = {
               number: number
            }
         }
         
         new Ajax.Request(url, {
                  method: 'post',
                  parameters: $H(params).toQueryString(), 
                  onComplete: function(transport) {
                        var response = transport.responseJSON;
                        if (response) { 
                           $(target_id).update(response.html);
                           gui.handleResponse(response);
                        } else {
                           $(target_id).update("no response object from ajax "+url);
                        }
                  }.bind(this)
         });
         
      }
      
      
   }
   
   
