// Class Object - "socialNetworkClass"
///////////////////////////////////
// define
var socialNetworkClass = Class.create();

// --- constants --- //
cSN_STATE_INITIALIZED = 0;
cSN_STATE_USERLOGIN = 1;
cSN_STATE_USERINFORETRIEVED = 2;
cSN_STATE_USERINFOUPDATED = 3;
cSN_STATE_USERSEARCHRESULTS = 4;
cSN_STATE_EVENTSUPDATED = 5;
cSN_STATE_IMAGEUPLOADED = 6;
cSN_STATE_IMAGESRETRIEVED = 7;
cSN_STATE_FRIENDADDED = 8;
cSN_STATE_FRIENDREMOVED = 9;
cSN_STATE_FRIENDREQUESTIGNORED = 10;
cSN_STATE_FRIENDREQUESTSUPDATED = 11;
cSN_STATE_FRIENDSPENDINGUPDATED = 12;
cSN_STATE_FRIENDLISTUPDATED = 13;
cSN_STATE_MESSAGEPOSTED = 14;
cSN_STATE_MESSAGEREPLIED = 15;
cSN_STATE_GROUPCREATED = 16;
cSN_STATE_GROUPINVITEPOSTED = 17;
cSN_STATE_GROUPINVITEACCEPTED = 18;
cSN_STATE_GROUPJOINREQUEST = 19;
cSN_STATE_GROUPJOINREQUESTACCEPTED = 20;
cSN_STATE_GROUPJOINED = 21;
cSN_STATE_GROUPLEFT = 22;
cSN_STATE_USERSUBSCRIBED = 23;
cSN_STATE_ERROR = 99;

// --- message type constants
cMSG_GENERAL = 0;
cMSG_FRIENDREQUEST = 1;
cMSG_FRIENDACCEPT = 2;
cMSG_FRIEND = 3;
cMSG_FAVOURITEADDED = 4;
cMSG_FAVOURITEREMOVED = 5;
cMSG_GROUPCREATED = 6;
cMSG_GROUPJOINED = 7;
cMSG_GROUPLEFT = 8;
cMSG_SHOWRATED = 9;
cMSG_EPISODERATED = 10;
cMSG_EPISODEREVIEWED = 11;
cMSG_MAIL = 12;

// define member functions
socialNetworkClass.prototype = {
  // init, called upon creation
  initialize: function(dbName,snPHPUrl,snStateHandler,SDB,boolInitDB){
    // clear
    this.userInfo = null;
    // set show database controller (if specified)
    this.SDB = SDB;
    // set
    this.snStateHandler = snStateHandler;
    // set owner
    this.snStateHandler.owner = this;
    // create for data management
    this.dataObj = new dataClass();

    // set
    this.DB = dbName;
    // create ajax object for message box
    this.ajaxSN =
      new ajaxianClass(null,null,"this.theOwner = null;this.url = '';");
    // set styleMGR as owner
    this.ajaxSN.theOwner = this;
    // set url of SN DB calls
    this.ajaxSN.url = snPHPUrl;

    // check
    if(boolInitDB){
      // init
      this.initDB(dbName,snPHPUrl);
    }
    else{
      // check
      if(this.snStateHandler){
        // call
        this.snStateHandler(cSN_STATE_INITIALIZED,null,"");
      }
    }  
  },
	
  free: function(){
    // set
    var obj = this;
		
    // free
    delete obj.ajaxSN;

    // free
    delete obj; 
  },

  // initializes the social network database
  initDB: function(dbName,snPHPUrl){
    // set JS to run
    var JS = "theClass.theOwner.onSNDBInit(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // grab
    this.ajaxSN.Grab("SNDB_Init",this.DB,"","","raw:","",JS);
  },

  onSNDBInit: function(grabObj){
    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_INITIALIZED,null,grabObj.responseText);
    }
  },

  // initializes the social network database
  getUserInfo: function(userID,storeUserInfo){
    // set JS to run
    var JS = "theClass.theOwner.onUserInfo(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // determine the current date
    var dateObj = new Date();
    // set date fields
    var curYear = dateObj.getFullYear();
    var curMonth = Number(dateObj.getMonth());
    var curDay = dateObj.getDate();
    // convert to 1's based
    var curMonth = Number(curMonth) + 1;
    // check
    if(curMonth < 10){
      curMonth = "0" + curMonth;
    }

    // check
    if(curDay < 10){
      curDay = "0" + curDay;
    }

    // free
    delete dateObj;

    // set
    var currentDate = curYear + "-" + curMonth + "-" + curDay;
    // set
    var fields = userID + "<field>" + currentDate + "<field>" + storeUserInfo;
    // grab
    this.ajaxSN.Grab("SNDB_GetUserInfo",this.DB,"users",fields,"","",JS);
  },

  onUserInfo: function(grabObj){
    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_USERINFORETRIEVED,grabObj.responseText);
    }

    // parse
//    this.parseUserInfo(grabObj.responseText);
  },

  parseUserInfo: function(userInfoStr){
    // check
    var userInfo = null;
    // set
    var dataSegs = userInfoStr.split("<seg>");
    // audit data segments
    if(dataSegs[0] && dataSegs[1] && dataSegs[2]){
    }
    else{
      // check
      if(this.snStateHandler){
        // call
        this.snStateHandler(cSN_STATE_ERROR,null);
      }
    }

/*
gDebugDisplay.postLog("dataSegs[0]: " + dataSegs[0]);
gDebugDisplay.postLog("");
gDebugDisplay.postLog("");

gDebugDisplay.postLog("dataSegs[1]: " + dataSegs[1]);
gDebugDisplay.postLog("");
gDebugDisplay.postLog("");

gDebugDisplay.postLog("dataSegs[2]: " + dataSegs[2]);
gDebugDisplay.postLog("");
gDebugDisplay.postLog("");

gDebugDisplay.postLog("dataSegs[3]: " + dataSegs[3]);
gDebugDisplay.postLog("");
gDebugDisplay.postLog("");

gDebugDisplay.postLog("dataSegs[4]: " + dataSegs[4]);
gDebugDisplay.postLog("");
gDebugDisplay.postLog("");

gDebugDisplay.postLog("dataSegs[5]: " + dataSegs[5]);
gDebugDisplay.postLog("");
gDebugDisplay.postLog("");

gDebugDisplay.postLog("dataSegs[7]: " + dataSegs[7]);
gDebugDisplay.postLog("");
gDebugDisplay.postLog("");
*/

    // set user data
// *****    var userData = dataSegs[0].split(",");
    var userData = dataSegs[0].split("<field>");
    // check
    if(dataSegs[3]){
      // get user pics
      var picData = dataSegs[3].split(",");
    }
    
    // set
    var fieldNames = "uid,email,password,userLevel,first,last,gender,birthDate,city,country,postalCode,phone,personalInfo,picFrame,pic";
    // split into array
    fieldNames = fieldNames.split(",");
    // get user data
    var userData = this.dataObj.genReturnObjects(userData,fieldNames);
    // check
    if(userData.length > 0){
      // set
      userInfo = userData[0];
      // free
      delete userData;
    }
	
    return(userInfo);
  },

  buildUserFavouritesList: function(data){
    // clear
    var favourites = null;
    // check
    if(data && data.length > 0){
      // get favorites data
      favourites = data.split("<field>");
      // set
      var fieldNames = "uid,name,rating";
      // split into array
      fieldNames = fieldNames.split(",");
      // get user data
      favourites = this.dataObj.genReturnObjects(favourites,fieldNames);
    }
    else{
      // create empty array
      favourites = new Array();
    }

    return(favourites);
  },

  // updates the user's info that corresponds to his/her uid
  setUserInfo: function(uid,email,password,userLevel,first,last,gender,birthDate,city,country,postalCode,phone,personalInfo,picFrame,pic){
    // set JS to run
    var JS = "theClass.theOwner.onUserInfoSet(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // set parameter fields
    var fields = uid + "<field>" + email + "<field>" + password + "<field>" + userLevel + "<field>" + first + "<field>" + last + "<field>" + gender + "<field>" + birthDate + "<field>" + city + "<field>" + country + "<field>" + postalCode + "<field>" + phone + "<field>" + personalInfo + "<field>" + picFrame + "<field>" + pic;
    // grab
    this.ajaxSN.Grab("SN_AJAX_SetUserInfo",this.DB,"",fields,"","",JS);
  },

  onUserInfoSet: function(grabObj){
    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_USERINFOUPDATED,grabObj.responseText,"");
    }  
  },

  // builds array of event data
  buildEventMessages: function(eventStr){
    // check
    if(eventStr.search("fail") >= 0){
      // clear
      var eventData = null;
    }
    else{
      // get event messages
      eventData = eventStr.split("<field>");
    }

    // set
//    var fieldNames = "fromID,toID,fromName,toName,messageType,postDate,postTime,content";
    var fieldNames = "fromID,toID,fromName,toName,fromPic,toPic,fromPicFrame,toPicFrame,messageType,postDate,postTime,content";
    // split into array
    fieldNames = fieldNames.split(",");
    // check
    if(eventData){
      // get user data
      var eventMsgs = this.dataObj.genReturnObjects(eventData,fieldNames);
    }
    else{
      // create empty array
      eventMsgs = new Array();
    }
	
	return(eventMsgs); 
  },

  // builds array of friends data
  buildFriendsList: function(friendString){
    // check
    if(friendString && friendString.length > 0){
      // get data array
      var friendSegments = friendString.split("<friend>");

      // create
      var friends = new Array;
      // loop
      for(var i=0;i<friendSegments.length;i++){
        var friendDataSegments = friendSegments[i].split("<seg>");

        // get data array
        var friendData = friendDataSegments[0].split("<field>");
        // set
        var fieldNames = "friendName,friendID,friendPic,friendPicFrame";
        // split into array
        fieldNames = fieldNames.split(",");
        // get user data
        var friendObj = this.dataObj.genReturnObjects(friendData,fieldNames);
        // set
        friends[i] = friendObj[0];
        friends[i].favouritesString = friendDataSegments[1];

        // free
        delete friendDataSegments;
        // free
        delete friendObj;
        // free
        delete friendData;
      }
    }
    else{
      // create empty array
      friends = new Array();
    }

    // return
    return(friends);
  },

  // builds array of friends data
  buildFriendsByIDList: function(friends){
    // build "friendsByID" list
    var friendsByID = new Array();
    for(var i=0;i<friends.length;i++){
      // set
      friendsByID[friends[i].friendID] = friends[i];
    }
    // return 
	return(friendsByID);
  },
  
  // builds array of pic data
  buildPicList: function(picString){
    var pics = null;
    // check
    if(picString && picString.length > 0){
      // get data array
      var picData = picString.split(",");
      // set
      var fieldNames = "picIndex,pic";
      // split into array
      fieldNames = fieldNames.split(",");
      // get
      pics = this.dataObj.genReturnObjects(picData,fieldNames);
    }
    else{
	  pics = new Array();
    }
	
	return(pics);
  },

  // builds array of prompt data
  buildPromptsList: function(promptString){
    // check
    var prompts = null;

    // get array
    var promptData = promptString.split("<field>");
    // check
    if(promptData){
      // set
      var fieldNames = "fromID,fromWho,promptType,content";
      // split into array
      fieldNames = fieldNames.split(",");
      // get user data
      this.prompts = this.dataObj.genReturnObjects(promptData,fieldNames);

      // free array
      delete promptData;
      // free array
      delete fieldNames;
    }

    // check if prompts list was created, if not create empty
    if(!this.prompts){
      this.prompts = new Array();
    }
	
	return(prompts);
  },

  // builds array of friend request data
  buildFriendRequestList: function(friendRequestString){
    var friendRequests = null;
	// get array
    var friendRequestData = friendRequestString.split("<field>");
    // check
    if(friendRequestData){
      // set
      var fieldNames = "fromWho,fromWhoName,content";
      var fieldNames = "fromWho,fromWhoName,fromWhoPic,fromWhoPicFrame,content";
      // split into array
      fieldNames = fieldNames.split(",");
      // get user data
      friendRequests = this.dataObj.genReturnObjects(friendRequestData,fieldNames);

      // free array
      delete friendRequestData;
      // free array
      delete fieldNames;
    }

    // check if friend requests list was created, if not create empty
    if(!friendRequests){
      friendRequests = new Array();
    }
	
	return(friendRequests);
  },

  // builds array of friends that user is waiting for approval
  buildFriendsPendingList: function(friendPendingString){
    var friendsPending = null;
    // get array
    var friendsPendingData = friendPendingString.split("<field>");
    // check
    if(friendsPendingData){
      // set
      var fieldNames = "toWho,content";
      // split into array
      fieldNames = fieldNames.split(",");
      // get user data
      friendsPending = this.dataObj.genReturnObjects(friendsPendingData,fieldNames);

      // free array
      delete friendsPendingData;
      // free array
      delete fieldNames;
    }

    // check if friend requests list was created, if not create empty
    if(!friendsPending){
      friendsPending = new Array();
    }

    return(friendsPending);
  },

  // builds array of messages belonging to the user
  buildMessageList: function(messageString){
    var messages = null;
    // get array
    var messageData = messageString.split("<field>");
    // check
    if(messageData){
      // set
// *****      var fieldNames = "messageID,messageThreadID,fromID,fromPic,fromPicFrame,recipients,postDate,postTime,subject,content,unread";
      var fieldNames = "messageID,messageThreadID,fromID,fromName,fromPic,fromPicFrame,recipients,postDate,postTime,subject,content,unread";
      // split into array
      fieldNames = fieldNames.split(",");
      // get user data
      messages = this.dataObj.genReturnObjects(messageData,fieldNames);

      // free array
      delete messageData;
      // free array
      delete fieldNames;
    }

    // check if friend requests list was created, if not create empty
    if(!messages){
      messages = new Array();
    }

    return(messages);
  },

  // searches the users table for people that match the string
  userSearch: function(searchStr,favouriteShows){
    // set JS to run
    var JS = "theClass.theOwner.onSearchResult(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    var favShowValue = 0;
    // check
    if(favouriteShows){
      favShowValue = 1;
    }
    
    var fields = searchStr + "<field>" + favShowValue;       
    // grab
    this.ajaxSN.Grab("SN_AJAX_UserSearch",this.DB,"users",fields,"","",JS);
  },

  onSearchResult: function(grabObj){
/*****
    // check if previous results exist
    if(this.searchResults){
      // loop
      for(var i=0;i<this.searchResults.length;i++){
        // check shows
        if(this.searchResults[i].shows){
          // loop
          for(var j=0;j<this.searchResults[i].shows.length;j++){
            // free
            delete this.searchResults[i].shows[j];
          }

          // free
          delete this.searchResults[i].shows;
        }

        // free
        delete this.searchResults[i];
      }
      // free
      delete this.searchResults;
    }

    // create
    this.searchResults = new Array();
    
    // check
    // get user list
    var users = grabObj.responseText.split("<user>");
    // loop
    for(var i=0;i<users.length;i++){
      // get user info and show segments
      var userSegments = users[i].split("<seg>");
      // check
      if(userSegments[0] && userSegments[0].length > 0){
        // get
        var userData = userSegments[0].split("<field>");
        // create
        var searchResult = new Object;
        // set fields
        searchResult.uid = userData[0];
        searchResult.first = userData[1];
        searchResult.last = userData[2];
        searchResult.picFrame = userData[3];
        searchResult.pic = userData[4];

        // check
        if(userSegments[1] && userSegments[1].length > 0){
          var showData = userSegments[1].split(",");
        }
        else{
          showData = new Array();
        }

        // set
        var fieldNames = "showID,name,rating";
        // split into array
        fieldNames = fieldNames.split(",");
        // get user shows
        searchResult.shows = this.dataObj.genReturnObjects(showData,fieldNames);
        // add
        this.searchResults[this.searchResults.length] = searchResult;
      }
    }
*/

    // check
    if(this.snStateHandler){
      // call
//      this.snStateHandler(cSN_STATE_USERSEARCHRESULTS,this.searchResults,null);
      this.snStateHandler(cSN_STATE_USERSEARCHRESULTS,grabObj.responseText,null);
    }
  },
	
  buildUserSearchResults: function(resultsStr){
    // clear
    var results = null;
	var resultData = resultsStr.split("<field>");

    // set
    var fieldNames = "uid,first,last,picFrame,pic";
    // split into array
    fieldNames = fieldNames.split(",");
    // get user data
    results = this.dataObj.genReturnObjects(resultData,fieldNames);
    // free
    delete resultData;
    // return
    return(results); 
  },
	
  // initializes the social network database
  friendRequest: function(userID,friendID,content){
    // set JS to run
    var JS = "theClass.theOwner.onFriendRequest(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // set fields
    var fields = userID + "," + friendID + "," + content;
    // grab
    this.ajaxSN.Grab("SN_FriendRequest",this.DB,"",fields,"","",JS);
  },
	
  onFriendRequest: function(grabObj){
    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_FRIENDSPENDINGUPDATED,grabObj.responseText,null);
    }
  },
  
  // pending friend requests
  getFriendRequests: function(userID){
    // set JS to run
    var JS = "theClass.theOwner.onGetFriendRequests(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // set fields
    var fields = userID;
    // grab
    this.ajaxSN.Grab("SN_GetFriendRequests",this.DB,"",fields,"","",JS);
  },
	
  onGetFriendRequests: function(grabObj){
alert("onFriendRequest: " + grabObj.responseText);
    // check
    if(grabObj.responseText == "fail"){
    }
/*
    // check 
    // set user data
    var data = grabObj.responseText.split("<field>");
    // set
    var fieldNames = "uid,first,middle,last";
    // split into array
    fieldNames = fieldNames.split(",");
    // get user data
    this.searchResults = this.dataObj.genReturnObjects(data,fieldNames);

    // free
    delete data;

    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_USERSEARCHRESULTS,this.searchResults,null);
    }
*/
  },

  // initializes the social network database
  ignoreFriendRequest: function(userID,friendID){
    // set JS to run
    var JS = "theClass.theOwner.onFriendRequestIgnored(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // set fields
    var fields = userID + "<field>" + friendID;
    // grab
    this.ajaxSN.Grab("SN_IgnoreFriendRequest",this.DB,"",fields,"","",JS);
  },
	
  onFriendRequestIgnored: function(grabObj){
    var segs = grabObj.responseText.split("<seg>");
    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_FRIENDREQUESTSUPDATED,grabObj.responseText,null);
    }
  },

  // initializes the social network database
  addFriend: function(userID,friendID){
    // set JS to run
    var JS = "theClass.theOwner.onFriendAdded(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // set fields
    var fields = userID + "<field>" + friendID;
    // grab
    this.ajaxSN.Grab("SN_AddFriend",this.DB,"",fields,"","",JS);
  },
	
  onFriendAdded: function(grabObj){
// gDebugDisplay.postLog("onFriendAdded: " + grabObj.responseText);

    var segs = grabObj.responseText.split("<seg>");
    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_FRIENDREQUESTSUPDATED,grabObj.responseText,null);
    }
  },

  // initializes the social network database
  removeFriend: function(userID,friendID){
    // set JS to run
    var JS = "theClass.theOwner.onFriendRemoved(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // set fields
    var fields = userID + "<field>" + friendID;
    // grab
    this.ajaxSN.Grab("SN_RemoveFriend",this.DB,"",fields,"","",JS);
  },

  onFriendRemoved: function(grabObj){
    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_FRIENDLISTUPDATED,grabObj.responseText,null);
    }
  },

  // posts message into message DB table
  postMessage: function(from,to,associationType,associationID,subject,content){
    // set JS to run
    var JS = "theClass.theOwner.onMessagePosted(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // set fields
    var fields = from + "<seg>" + to + "<seg>" + subject + "<seg>" + content;
    // grab
    this.ajaxSN.Grab("SN_AJAX_PostMessage",this.DB,"",fields,"","",JS);
  },

  onMessagePosted: function(grabObj){
    gDebugDisplay.postLog("onMessagePosted: " + grabObj.responseText);

    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_MESSAGEPOSTED,null,null);
    }
  },

  // replies to a specific message thread
  replyMessage: function(from,messageThreadID,content){
    // set JS to run
    var JS = "theClass.theOwner.onMessageReply(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // set fields
    var fields = from + "<seg>" + messageThreadID + "<seg>" + content;
    // grab
    this.ajaxSN.Grab("SN_AJAX_ReplyMessage",this.DB,"",fields,"","",JS);
  },

  onMessageReply: function(grabObj){
    gDebugDisplay.postLog("onMessagePosted: " + grabObj.responseText);

    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_MESSAGEREPLIED,grabObj.responseText,null);
    }
  },

  // posts message into message DB table
  createGroup: function(owner,groupName,groupDescription){
    // set JS to run
    var JS = "theClass.theOwner.onGroupCreated(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // set fields
    var fields = owner + "<seg>" + groupName + "<seg>" + groupDescription;
    // grab
    this.ajaxSN.Grab("SN_AJAX_CreateGroup",this.DB,"",fields,"","",JS);
  },

  onGroupCreated: function(grabObj){
    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_GROUPCREATED,grabObj.responseText,null);
    }
  },

  buildGroupInfo: function(groupStr){
    // clear
    var group = null;
    // check
    if(groupStr.length > 0){
      // get favorites data
      var groupsData = groupStr.split("<field>");
      // set
      var fieldNames = "groupID,groupName,groupDescription,groupPic,numMembers,ownerID,ownerName";
      // split into array
      fieldNames = fieldNames.split(",");
      // get user data
      group = this.dataObj.genReturnObjects(groupsData,fieldNames);
      // free
      delete groupsData;
    }
    else{
      // create empty array
      group = new Array();
    }

    return(group[0]);
  },

  buildGroupMembersList: function(groupMembersStr){
    // clear
    var members = null;
    // check
    if(groupMembersStr.length > 0){
      // get favorites data
      var groupsData = groupMembersStr.split("<field>");
      // set
      var fieldNames = "userID,memberName,memberPic";
      // split into array
      fieldNames = fieldNames.split(",");
      // get user data
      members = this.dataObj.genReturnObjects(groupsData,fieldNames);
      // free
      delete groupsData;
    }
    else{
      // create empty array
      members = new Array();
    }

    return(members);
  },

  buildUserGroupsList: function(groupsStr){
    // clear
    var groups = null;
    // check
    if(groupsStr.length > 0){
      // get favorites data
      var groupsData = groupsStr.split("<field>");
      // set
      var fieldNames = "groupID,groupName,groupPic";
      // split into array
      fieldNames = fieldNames.split(",");
      // get user data
      groups = this.dataObj.genReturnObjects(groupsData,fieldNames);
      // free
      delete groupsData;
    }
    else{
      // create empty array
      groups = new Array();
    }

    return(groups);
  },

  groupInvite: function(groupID,from,to,content){
    // set JS to run
    var JS = "theClass.theOwner.onGroupInvite(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // set fields
    var fields = groupID + "<seg>" + from + "<seg>" + to + "<seg>" + content;
    // grab
    this.ajaxSN.Grab("SN_AJAX_GroupInvite",this.DB,"",fields,"","",JS);
  },

  onGroupInvite: function(grabObj){
    gDebugDisplay.postLog("onGroupInvite: " + grabObj.responseText);

    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_GROUPINVITEPOSTED,null,null);
    }
  },

  buildUserGroupInvitationList: function(groupsStr){
    // clear
    var groupInvitations = null;
    // check
    if(groupsStr.length > 0){
      // get favorites data
      var groupsData = groupsStr.split("<field>");
      // set
      var fieldNames = "fromID,fromName,fromPic,fromPicFrame,groupID,groupName,groupPic,content";
      // split into array
      fieldNames = fieldNames.split(",");
      // get user data
      groupInvitations = this.dataObj.genReturnObjects(groupsData,fieldNames);
      // free
      delete groupsData;
    }
    else{
      // create empty array
      groupInvitations = new Array();
    }

    return(groupInvitations);
  },

  groupJoinRequest: function(fromID,groupID,groupOwnerID,content){
    // set JS to run
    var JS = "theClass.theOwner.onGroupJoinRequest(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // set fields
    var fields = fromID + "<field>" + groupID + "<field>" + groupOwnerID + "<field>" + content;
    // grab
    this.ajaxSN.Grab("SN_AJAX_GroupJoinRequest",this.DB,"",fields,"","",JS);
  },

  onGroupJoinRequest: function(grabObj){
    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_GROUPJOINREQUEST,grabObj.responseText,null);
    }
  },

  buildGroupJoinRequestList: function(groupsStr){
    // clear
    var groupJoinRequests = null;
    // check
    if(groupsStr.length > 0){
      // get favorites data
      var groupsData = groupsStr.split("<field>");
      // set
      var fieldNames = "fromID,fromName,fromPic,fromPicFrame,groupID,groupName,content";
      // split into array
      fieldNames = fieldNames.split(",");
      // get user data
      groupJoinRequests = this.dataObj.genReturnObjects(groupsData,fieldNames);
      // free
      delete groupsData;
    }
    else{
      // create empty array
      groupJoinRequests = new Array();
    }

    return(groupJoinRequests);
  },

  groupJoinRequestAccept: function(userID,fromID,groupID){
    // set JS to run
    var JS = "theClass.theOwner.onJoinRequestAccepted(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // set fields
    var fields = userID + "<field>" + fromID + "<field>" + groupID;
    // grab
    this.ajaxSN.Grab("SN_AJAX_GroupJoinRequestAccept",this.DB,"",fields,"","",JS);
  },

  onJoinRequestAccepted: function(grabObj){
    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_GROUPJOINREQUESTACCEPTED,grabObj.responseText,null);
    }
  },

  groupJoin: function(userID,fromID,groupID,content){
    // set JS to run
    var JS = "theClass.theOwner.onGroupJoined(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // set fields
    var fields = userID + "<field>" + fromID + "<field>" + groupID;
    // grab
    this.ajaxSN.Grab("SN_AJAX_GroupInvitationAccept",this.DB,"",fields,"","",JS);
  },

  onGroupJoined: function(grabObj){
    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_GROUPJOINED,grabObj.responseText,null);
    }
  },

  groupLeave: function(userID,groupID){
    // set JS to run
    var JS = "theClass.theOwner.onGroupLeft(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // set fields
    var fields = userID + "<field>" + groupID;
    // grab
    this.ajaxSN.Grab("SN_AJAX_GroupLeave",this.DB,"",fields,"","",JS);
  },

  onGroupLeft: function(grabObj){
    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_GROUPLEFT,grabObj.responseText,null);
    }
  },


  // updates the user's info that corresponds to his/her uid
  getMobileCompanyList: function(){
    // set JS to run
    var JS = "theClass.theOwner.onMobileCompanyList(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // grab
    this.ajaxSN.Grab("SNDB_GetMobileCompanies",this.DB,"","","","",JS);
  },

  onMobileCompanyList: function(grabObj){
    // check
    if(this.userInfo.mobileCompanies){
      // loop
      for(var i=0;i<this.userInfo.mobileCompanies.length;i++){
        // free
        delete this.userInfo.mobileCompanies[i];
      }

      // free
      delete this.userInfo.mobileCompanies;
    }

    // set data
    var data = grabObj.responseText.split(",");
    // set
    var fieldNames = "uid,name,textAddress";
    // split into array
    fieldNames = fieldNames.split(",");
    // set
    this.userInfo.mobileCompanies = this.dataObj.genReturnObjects(data,fieldNames);

/*
    // loop
    for(var i=0;i<this.userInfo.mobileCompanies.length;i++){
      // free
      MAIN_log(this.userInfo.mobileCompanies[i].name + "---->" + this.userInfo.mobileCompanies[i].textAddress);
    }
*/	
  },

  sendEmail: function(textAddress,subject,message){
    // set JS to run
    var JS = "theClass.theOwner.onEmailSent(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";


    // set fields
    var fields = textAddress + "," + subject + "," + message;

MAIN_log("sendEmail: " + fields);

    // grab
    this.ajaxSN.Grab("SNDB_SendEmail",this.DB,"",fields,"","",JS);
  },

  onEmailSent: function(grabObj){
MAIN_log("onEmailSent:" + grabObj.responseText);  
  },

  // upload an image to target directory on the server
  uploadImage: function(sourceDir,destDir){
    // set JS to run
    var JS = "theClass.theOwner.onImageUploaded(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // set fields       
    var fields = sourceDir + "<field>" + destDir;
    // grab
    this.ajaxSN.Grab("SN_UploadImage",this.DB,"",fields,"","",JS);
  },

  // fires when file upload ajax resoponse is returned
  onImageUploaded: function(grabObj){
    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_IMAGEUPLOADED,grabObj.responseText,null);
    }
  },
  
  
  // retrieves image from the database
  getUserPics: function(userID){
    // set JS to run
    var JS = "theClass.theOwner.onImages(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";

    // set fields
    var fields = userID;
    // grab
    this.ajaxSN.Grab("SNDB_GetUserPics",this.DB,"",fields,"","",JS);
  },

  // fires when file upload ajax resoponse is returned
  onImages: function(grabObj){
    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_IMAGESRETRIEVED,grabObj.responseText,null);
//      this.snStateHandler(cSN_STATE_IMAGESRETRIEVED,grabObj.responseXML,null);
    }
  },

  // registers user for sighn up
  subscribeUser: function(email){
    // set JS to run
    var JS = "theClass.theOwner.onUserSubscribed(grabObj);" +
           "delete grabObj;delete theClass.sendReq;" +
           "theClass.sendReq = null;";
    // grab
    this.ajaxSN.Grab("SN_AJAX_SubscribeUser",this.DB,"",email,"","",JS);
  },

  // fires when file upload ajax resoponse is returned
  onUserSubscribed: function(grabObj){
    // check
    if(this.snStateHandler){
      // call
      this.snStateHandler(cSN_STATE_USERSUBSCRIBED,grabObj.responseText,null);
    }
  }
}
