// JavaScript Document
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function displayLogin(sp1, sp2) {
	document.getElementById(sp1).style.display='none'; 
	document.getElementById(sp2).style.display='block';	
	document.getElementById( "logon_username" ).focus();
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function userLogoff() {
	document.location = 'ajax/userLogoff.php';
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* ----------------------------
 * verify a user logon from main page (home.php)
 * verified user data set into session id
 */
function verifyUserLogon( ssn ) {
	usr = document.frm_logon.logon_username;
	pwd = document.frm_logon.logon_password;
	//alert(MD5(pwd.value));
	document.frm_logon.logonpassword.value = MD5(pwd.value);
	//alert(document.frm_logon.logonpassword.value);
	if ( usr.value == "" ) {
	  alert("Please enter your Username.");
	  usr.focus();
	  setPointer( "unclicked" );
	  return false;
	} 
	if ( pwd.value == ""  ) {
	  alert("Please enter your Password.");
	  pwd.focus();
	  setPointer( "unclicked" );
	  return false;
	} 
	document.frm_logon.submit();
	return true;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* ----------------------------
 * the following will take a newly created profile, and
 * update the geo location data for lat/long
 * the first step is to get the profile address for the new profile
 * on success, we then call the function that retrives the lat/long from google
 * and finally, on success, update that information
 */
function update_geoloc( ssn, address ) {
  if ( ssn == undefined ) ssn = "v=";
  if ( ssn.length = 0 ) ssn = "v=";

  // we have the user_name|address information returned on a successful profile creation
  if ( address.indexOf( "|" ) > 0 ) {
    user_info = address.split( "|" );
    if ( user_info[1].length > 0 ) {

      if (GBrowserIsCompatible()) {
        geocoder = new GClientGeocoder();

        geocoder.getLatLng(user_info[1], function(latlng) {
			//alert(user_info[1]);
            //alert(latlng);
			
        	if (latlng) {
				new Ajax.Request('ajax/setUserGeoloc.php', {
					method:'post',
					parameters: {
						t: latlng.lat(),
						g: latlng.lng()
					},
					onSuccess: function(transport){       
						var response = transport.responseText || "";       
						document.location='home.php?ref=myprofile&'+ssn;
						//alert(response);
					},     
					onFailure: function(){ 
						//alert("Unable to locate your city/country of residence.");
						document.location='home.php?ref=myprofile&'+ssn;
					}   
				}); 
			  
			} // valid latlng object

        });  // getlatlng function

      }

    } // user info exists

  }  // address not blank

  return true;

}




//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/*var timerID;
function set_menu_refresh_timer() {
  // exec the menu refresh every 1 minute
  timerID = setInterval(function () { update_user_menu(); }, 60000 );
  return 0;
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function update_user_menu() {
  if ( document.getElementById("gv_tab") )
    t = document.getElementById("gv_tab").value;
  if ( document.getElementById("gv_info") )
    i = document.getElementById("gv_info").value;
  if ( document.getElementById("gv_div") ) 
    d = document.getElementById("gv_div").value;
  if ( document.getElementById("gv_cat") ) 
    c = document.getElementById("gv_cat").value;
  if ( d.length > 0 ) 
    update_primary_menu( t, i, d, c );

  if ( ( t == 1 ) | ( t == 2 ) )   // update a list if in matches or mailbox
    qry_goto_page("","" );
   
}
*/

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// do not reset default pointer when an event is being processed.
// pointer: the name of the pointer to set  clicked, unclicked default pointer
// ctl: the control ID of the control requesting the pointer change
// cls the classname to set the control to, so we don't get skewed control displays
var pointy_clicky = false;
function setPointer( pointer, ctl, cls ) {

  if ( pointer == "unclicked" ) { pointy_clicky = false; document.body.style.cursor='default'; return }

  if ( pointer == "clicked" ) { 
    pointy_clicky = true; 
    document.body.style.cursor='wait'; 
  
    // now reset the control class if the parameters are given  
    if ( ctl !== undefined ) {
      if ( cls !== undefined ) {
        if ( cls.length > 0  ) {
          if ( document.getElementById( ctl ) )
            document.getElementById( ctl ).className=cls;
        }
      }
    }

    return;
  }

  if ( pointy_clicky === false ) { document.body.style.cursor=pointer; }

}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* ----------------------------
 * parse and execute multiple java commands from html output
 *
 * content: data retrived by xmlhttp call
 *   format  html code [java command] html code [java command] etc..
 *   java commands taged by :script: cmd !script!
 */
function perform_script_eval( content ) {

  stidx = 0;
  rtn = "";

  jcomStart = ":script:";		    // the java command start tag
  jcomEnd = "!script!";			    // the java command end tag

  if ( content.indexOf(jcomStart) < 0 )     // no java commands buried in the html output?
    return content;                         // return the original content for display

  txt = content.substring( stidx );         // grab a chunk of the returned output
  while ( txt.indexOf(jcomStart) > -1 ) {   // and process the java command
    st = txt.indexOf(jcomStart);            // position of java command start tag
    en = txt.indexOf(jcomEnd);              // position of java command end tag

    if ( st > -1 & en > jcomStart.length ){ // make sure both are valid values
            
      if ( st > 0 )                         // append any html output appearing before the command start tag
        rtn = rtn+content.substring( stidx, stidx+st-1 );
      cmd = trim(txt.substring( st+jcomStart.length, en )); // grab the java command(s)

      cmd2 = cmd.replace(new RegExp("&lt;", "g"), "<");  // re-encode html braces
      cmd = cmd2.replace(new RegExp("&gt;", "g"), ">");

      eval(cmd);                            // execute them

      stidx = stidx+en+jcomEnd.length;      // adjust our index position in the main content text
      txt = content.substring( stidx );     // and get another chunk from it

    }

  }

  if ( txt.length > 0 )                     // when all commands are processed, there may be some additional html output left
    rtn = rtn+txt;

  return rtn;                               // return the html content for display

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* ----------------------------
 * function to retrieve user input from profile entry screen
 * insecure usage on command line passage
 * to use post, replace tilde with ampersand, and pipe with equals
 */
function retrieveEnteredInput() {

  // take the input fields and preserve them in php session
  var entries = document.getElementsByTagName("input");
  var preserve = "";
  var CtlContent = "";

  //iterate over input elements ( note select are not processed )
  for (var ii = 0; ii < entries.length; ii++) {
    //get pointer to current element:
    var entry = entries[ii];

    if ( entry.id.length > 0 ) {
      parseIt = entry.id.substring(0,2);
      
      CtlContent = ""

      switch (entry.type) {

        case "hidden":	// we pop some select values from dummy controls into the real hidden container
          if ( parseIt == "p." )
            CtlContent = encodeURIComponent( entry.value );
        break;

        case "text":
          if ( parseIt == "p." )
            CtlContent = encodeURIComponent( entry.value );
        break;

        case "radio":
          if ( parseIt == "p." ) {
            if ( entry.checked ) 
              CtlContent = encodeURIComponent( entry.value );
          }
        break;

        case "checkbox":
			if ( entry.form  ) { 
              idx = preserve.indexOf(entry.id.substring(2));
              if ( idx >= 0 ) {
                CtlContent = ""
              } else {
                if ( entry.id.indexOf('checkx_') > 0 ) ; else
                  CtlContent = getFormCheckBoxValues( entry.form.name );
              }
            } else {  
              CtlContent = entry.checked ? "Yes" : "No";
//              if ( entry.checked ) 
//                CtlContent = "Yes";

            }
        break;

        case "password":
          if ( parseIt == "p." )
            CtlContent = MD5( entry.value );
        break;

        case "file":  // file already uploaded, we retrieve the name from the iframe element
            if ( entry.value.length > 0 ) {  // only process if something was added
              ifr = "iframe_"+entry.id;
              if ( ifr === undefined ) {
                alert( "unable to upload picture");
              } else {

// test frames[ifr] - show err on err
                if ( frames[ifr] ) {  // extremely large images may corrupt the frame stack
                  CtlContent = encodeURIComponent( frames[ifr].document.body.innerHTML );
                  errmsg = CtlContent.substring(0,5);
                  if ( errmsg == "ERROR" ) {  // did the download return an error?
                    alert( errmsg );
                    CtlContent = "";
                  } // dl returned error code
                } else {  // frame not corrupted
                  alert( "unable to upload picture - perhaps it is too big");
                } 
              }  // frame designation ok
            } // some text in file control  
        break;

      }

      if ( CtlContent.length > 0 ) {
        if ( preserve.length > 0 )
          preserve=preserve+"~";
        if ( parseIt != "p." )
          preserve=preserve+entry.id+"|"+CtlContent;
        else
          preserve=preserve+entry.id.substring(2)+"|"+CtlContent;
      }

    }
  }


  //now iterate over the select elements
  entries = document.getElementsByTagName("select");
  for (var ii = 0; ii < entries.length; ii++) {
    //get pointer to current element:
    var entry = entries[ii];

    if ( entry.id.length > 0 ) {

      parseIt = entry.id.substring(0,2);
      if ( parseIt == "p." ) {

        CtlContent = "";
        if (  entry.selectedIndex > -1 ) {     
          CtlContent = entry.options[entry.selectedIndex].value;
        }

        if ( CtlContent.length > 0 ) {
          if ( preserve.length > 0 )
            preserve=preserve+"~";
          preserve=preserve+entry.id.substring(2)+"|"+CtlContent;
        }

      }

    }
  }

  //now iterate over the textarea elements
  //return blank fields on textareas, for update processing
  entries = document.getElementsByTagName("textarea");
  for (var ii = 0; ii < entries.length; ii++) {
    //get pointer to current element:
    var entry = entries[ii];
    CtlContent = "";

//    if ( entry.value.length > 0 ) {

      parseIt = entry.id.substring(0,2);
      if ( parseIt == "p." ) 
        CtlContent = entry.value;
    
//      if ( CtlContent.length > 0 ) {
        if ( preserve.length > 0 )
          preserve=preserve+"~";
        preserve=preserve+entry.id.substring(2)+"|"+encodeURIComponent( trim(CtlContent) );
//      }
//    }
  }

  return preserve;
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* ----------------------------
 * generic function to trim spaces from ends of string
 */
function trim(str)  {
    return ltrim(rtrim(str));
}

/* ----------------------------
 * generic function to trim leading spaces
 */
function ltrim(str) {
    return str.replace(new RegExp("^[\\s]+", "g"), "");
}

/* ----------------------------
 * generic function to trim trailing spaces
 */
function rtrim(str) {
    return str.replace(new RegExp("[\\s]+$", "g"), "");
}



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function cursor_wait(obj) {
	//document.body.style.cursor = 'wait';
	obj.style.cursor='wait'
}

function cursor_clear(obj) {
	//document.body.style.cursor = 'default';
	obj.style.cursor='default'
}

function cursor_pointer(obj) {
	//document.body.style.cursor = 'default';
	obj.style.cursor='pointer'
}



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function userInfoReset(email){
	if (email=='') {
		alert("Please enter your email address.");
		return false;
	}
	return true

/*	
	new Ajax.Request('ajax/forgotPass.php', {
		method:'post',
		parameters: {
			mailaddress: email
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			if ( response == "Success" ) {
				alert("Confirmation email was resent to your mailbox.");
			} else {
				alert("Error sending confirmation email.");
			}
		},     
		onFailure: function(){ 
			document.getElementById("profile_container").innerHTML = "No response.";
		}   
	}); 
	document.body.style.cursor = 'default';
*/	
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function getMyProfileContent ( ssn_no ) {
	setPointer( "clicked" );
	document.getElementById('splash').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
	new Ajax.Request('ajax/myProfile.php', {
		method:'post',
		parameters: {
			ssn: ssn_no
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById("splash").innerHTML = response;
			} 
		},     
		onFailure: function(){ 
			document.getElementById("splash").innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function sendInvite ( ssn_no ) {
	setPointer( "clicked" );
	
	document.getElementById('splash').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
	new Ajax.Request('ajax/sendInvite.php', {
		method:'post',
		parameters: {
			ssn: ssn_no
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById("splash").innerHTML = response;
			} 
		},     
		onFailure: function(){ 
			document.getElementById("splash").innerHTML = "No response.";
		}   
	}); 
	
	setPointer( "unclicked" );
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function getUserProfileContent ( userId, ssn_no ) {
	setPointer( "clicked" );
	document.getElementById('splash').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
	new Ajax.Request('ajax/profile.php', {
		method:'post',
		parameters: {
			ssn: ssn_no,
			uid: userId
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById("splash").innerHTML = response;
			} 
		},     
		onFailure: function(){ 
			document.getElementById("splash").innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function showUserProfileContent ( userId, ssn_no ) {
	setPointer( "clicked" );
	document.getElementById('fade').style.display='block';
	document.getElementById('light').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
	document.getElementById('light').style.display='block';
	
	new Ajax.Request('ajax/profilebox.php', {
		method:'post',
		parameters: {
			ssn: ssn_no,
			uid: userId
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				response+="";
				document.getElementById("light").innerHTML = response;
			} 
		},     
		onFailure: function(){ 
			document.getElementById("light").innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function close_black_overlay() {
	document.getElementById('light').style.display='none';
	document.getElementById('fade').style.display='none';	
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~ this function just retreives the new matches list and insrt in DB, another function is responsible for showing them
function getNewMatches ( ssn_no ) {
//	setPointer( "clicked" );
//	document.getElementById('splash').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
	new Ajax.Request('ajax/getNewMatches.php', {
		method:'post',
		parameters: {
			ssn: ssn_no
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			showMatchBox ( ssn_no );
			/*alert(response);
			if ( response.length > 0 ) {
				document.getElementById("splash").innerHTML = response;
			} */
			
		},     
		onFailure: function(){ 
			document.getElementById("splash").innerHTML = "No response.";
		}   
	}); 
//	setPointer( "unclicked" );
}




//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function showMatchBox ( ssn_no ) {
	setPointer( "clicked" );
	document.getElementById('splash').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
	
	new Ajax.Request('ajax/matchbox.php', {
		method:'post',
		parameters: {
			ssn: ssn_no
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById("splash").innerHTML = response;
			} 
		},     
		onFailure: function(){ 
			document.getElementById("splash").innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );
}



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function getMatchBoxContent ( ssn_no ) {
	setPointer( "clicked" );
	document.getElementById('splash').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
	
	getNewMatches ( ssn_no );
	
	//showMatchBox ( ssn_no );
	
	//showMatchList( 'active', ssn_no );
	
	setPointer( "unclicked" );
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function goToMatchboxTab(thisTabCode, ssn_no) {
	updateTabCounts(thisTabCode, ssn_no);
	showMatchList(thisTabCode, ssn_no, "0");
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function updateTabCounts(selectedTabCode, ssn_no) {
	setPointer( "clicked" );
	
	new Ajax.Request('ajax/getMatchCount.php', {
		method:'post',
		parameters: {
			ssn: ssn_no
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				  listTabCounts = response.split("|");
				  
				  ii=0;
				  while ( listTabCounts[ii] ) {
					listTabs = listTabCounts[ii].split("~");
					
					document.getElementById('spnMatchTab'+listTabs[0]).innerHTML = listTabs[1];
					if (selectedTabCode != "") {
						if (selectedTabCode == listTabs[0]) {
							document.getElementById('i'+listTabs[0]).className='selected'; 
						} else {
							document.getElementById('i'+listTabs[0]).className='notselected';
						}
					}
					ii++;
				  }

			} 
		},     
		onFailure: function(){ 
			//tab.innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );	
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function showMatchList( matchStatus, ssn_no, pL1 ) {
	
	setPointer( "clicked" );
	document.getElementById('matchbox_list').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
	
	new Ajax.Request('ajax/showMatchList.php', {
		method:'post',
		parameters: {
			ssn: ssn_no,
			status: matchStatus,
			l1: pL1
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById("matchbox_list").innerHTML = response;
			} 
		},     
		onFailure: function(){ 
			document.getElementById("matchbox_list").innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );
	
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function updateMatchCount(tab, ssn_no) {
	//tab.innerHTML=statusName+" [10]"+status;
	setPointer( "clicked" );
	
	new Ajax.Request('ajax/getMatchCount.php', {
		method:'post',
		parameters: {
			ssn: ssn_no,
			tabcode: tab
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById('spnMatchTab'+tab).innerHTML = trim(response);
			} 
		},     
		onFailure: function(){ 
			//tab.innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function requestCommunication( obj, recordId, userName, pStatus, ssn_no ) {
	cursor_wait(obj);
	setPointer( "clicked" );
	//alert(recordId);
	if (confirm( "A message will be sent to "+userName+" to request for communication. \nAre you sure you want to initiate communication with this person? " )) {
		//----------------------------------------------------------------------------
		new Ajax.Request('ajax/srv_cmd.php', {
			method:'post',
			parameters: {
				ssn: ssn_no,
				sc: "RQ",
				id: recordId
			},
			onSuccess: function(transport){       
				var response = transport.responseText || "";       
				
				//alert(response);
				if ( response.length > 0 ) {
					/*if ( response != "Success" ) {
						//goToMatchboxTab(trim(response), ssn_no);	
					} else {
						//updateCounts();
					}*/
				} 
			},     
			onFailure: function(){ 
				//tab.innerHTML = "No response.";
			}   
		}); 
		//----------------------------------------------------------------------------
		
		new Ajax.Request('ajax/matchesNavRow.php', {
			method:'post',
			parameters: {
				ssn: ssn_no,
				sc: "wink",
				st: pStatus,
				un: userName,
				id: recordId
			},
			onSuccess: function(transport){       
				var response = transport.responseText || "";       
				
				//alert(response);
				if ( response.length > 0 ) {
					document.getElementById("matches_nav_row"+recordId).innerHTML = response;
				} 
			},     
			onFailure: function(){ 
				//tab.innerHTML = "No response.";
			}   
		}); 
		//----------------------------------------------------------------------------
	}
	setPointer( "unclicked" );
	cursor_pointer(obj);
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function cancelCommunicationRequest( obj, recordId, userName, pStatus, ssn_no) {
	cursor_wait(obj);
	setPointer( "clicked" );
	//alert(recordId);
	if (confirm( "Are you sure you want to cancel your communication request for "+userName+"? " )) {
		//----------------------------------------------------------------------------
		new Ajax.Request('ajax/srv_cmd.php', {
			method:'post',
			parameters: {
				ssn: ssn_no,
				sc: "CQ",
				id: recordId
			},
			onSuccess: function(transport){       
				var response = transport.responseText || "";       
				
				//alert(response);
				if ( response.length > 0 ) {
					//tab.innerHTML = statusName+" ["+trim(response)+"]";
				} 
			},     
			onFailure: function(){ 
				//tab.innerHTML = "No response.";
			}   
		}); 
		//----------------------------------------------------------------------------
		
		new Ajax.Request('ajax/matchesNavRow.php', {
			method:'post',
			parameters: {
				ssn: ssn_no,
				sc: "active",
				st: pStatus,
				un: userName,
				id: recordId
			},
			onSuccess: function(transport){       
				var response = transport.responseText || "";       
				
				//alert(response);
				if ( response.length > 0 ) {
					document.getElementById("matches_nav_row"+recordId).innerHTML = response;
				} 
			},     
			onFailure: function(){ 
				//tab.innerHTML = "No response.";
			}   
		}); 
		//----------------------------------------------------------------------------
	}
	setPointer( "unclicked" );
	cursor_pointer(obj);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function acceptCommunicationRequest( obj, messageId, userName, ssn_no ) {
	
	cursor_wait(obj);
	setPointer( "clicked" );
	
	if (confirm( "Accept the communication request from "+userName+"? " )) {

		//----------------------------------------------------------------------------
		new Ajax.Request('ajax/srv_cmd.php', {
			method:'post',
			parameters: {
				ssn: ssn_no,
				sc: "AC",
				id: messageId
			},
			onSuccess: function(transport){       
				var response = transport.responseText || "";       
				
				//alert(response);
				if ( response.length > 0 && response == "Success") {
					deleteMessage( obj, messageId, "inbox", "dontAsk", ssn_no );
					alert(userName+' has now been moved to the "in communication" tab of your matchbox.');
				} 
			},     
			onFailure: function(){ 
				//tab.innerHTML = "No response.";
			}   
		}); 
		//----------------------------------------------------------------------------
		
	}//if confirm
	setPointer( "unclicked" );
	cursor_pointer(obj);

}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function rejectCommunicationRequest( obj, messageId, userName, ssn_no ) {
	
	cursor_wait(obj);
	setPointer( "clicked" );
	
	if (confirm( "Reject the communication request from "+userName+"? " )) {

		//----------------------------------------------------------------------------
		new Ajax.Request('ajax/srv_cmd.php', {
			method:'post',
			parameters: {
				ssn: ssn_no,
				sc: "RJ",
				id: messageId
			},
			onSuccess: function(transport){       
				var response = transport.responseText || "";       
				
				//alert(response);
				if ( response.length > 0 && response == "Success") {
					deleteMessage( obj, messageId, "inbox", "dontAsk", ssn_no );
					alert("You have been removed from "+userName+"'s matchbox.");
				} 
			},     
			onFailure: function(){ 
				//tab.innerHTML = "No response.";
			}   
		}); 
		//----------------------------------------------------------------------------
		
	}//if confirm
	
	setPointer( "unclicked" );
	cursor_pointer(obj);

}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function tagPerson( obj, recordId, userName, ssn_no) {
	cursor_wait(obj);
	setPointer( "clicked" );
	
	if (confirm( "Are you sure you want to move "+userName+" to your Tagged List? " )) {
		new Ajax.Request('ajax/srv_cmd.php', {
			method:'post',
			parameters: {
				ssn: ssn_no,
				sc: "TG",
				id: recordId
			},
			onSuccess: function(transport){       
				var response = transport.responseText || "";       
				
				//alert(response);
				if ( response.length > 0 ) {
					goToMatchboxTab(trim(response), ssn_no);
				} 
			},     
			onFailure: function(){ 
				//tab.innerHTML = "No response.";
			}   
		}); 
	}
	setPointer( "unclicked" );
	cursor_pointer(obj);
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function deletePerson( obj, recordId, userName, ssn_no) {
	cursor_wait(obj);
	setPointer( "clicked" );
	//alert(recordId);
	if (confirm( "Are you sure you want to delete "+userName+" from your match box? " )) {
		new Ajax.Request('ajax/srv_cmd.php', {
			method:'post',
			parameters: {
				ssn: ssn_no,
				sc: "DL",
				id: recordId
			},
			onSuccess: function(transport){       
				var response = transport.responseText || "";       
				
				//alert(response);
				if ( response.length > 0 ) {
					document.getElementById("matched_row"+recordId).innerHTML = "";
					updateTabCounts("", ssn_no);
				} 
			},     
			onFailure: function(){ 
				//tab.innerHTML = "No response.";
			}   
		}); 
	}
	setPointer( "unclicked" );
	cursor_pointer(obj);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function blockPerson( obj, recordId, userName, ssn_no, callBack) {
	cursor_wait(obj);
	setPointer( "clicked" );
	//alert(callBack);
	if (confirm( "Once a user is blocked, there is no way to unblock them, Are you sure you want to block "+userName+"? " )) {
		new Ajax.Request('ajax/srv_cmd.php', {
			method:'post',
			parameters: {
				ssn: ssn_no,
				sc: "BK",
				id: recordId
			},
			onSuccess: function(transport){       
				var response = transport.responseText || "";       
				
				//alert(response);
				if ( response.length > 0 ) {
					if(callBack != 'MailBox'){
						document.getElementById("matched_row"+recordId).innerHTML = "";
						updateTabCounts("", ssn_no);
					}
					else {
						getMailboxContent( "inbox", "", ssn_no  );
					}
				} 
			},     
			onFailure: function(){ 
				//tab.innerHTML = "No response.";
			}   
		}); 
	}
	setPointer( "unclicked" );
	cursor_pointer(obj);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function selectTabMenu(itemno, menuCount){
	for(i=0; i<menuCount; i++) {
		if (document.getElementById('i'+i)) {
			if (i == itemno) {
				document.getElementById('i'+i).className='selected'; 
			} else {
				document.getElementById('i'+i).className='notselected';
			}
		}
	}
}






//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function getMailboxContent( type, send, ssn_no ) {
	setPointer( "clicked" );
	
	document.getElementById('splash').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
		
	showMailbox( type, send, ssn_no );
	
	setPointer( "unclicked" );
}



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function showMailbox ( ptype, psend, ssn_no ) {
	setPointer( "clicked" );
	document.getElementById('splash').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
	
	new Ajax.Request('ajax/mailbox.php', {
		method:'post',
		parameters: {
			type: ptype,
			send: psend,
			ssn: ssn_no
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById("splash").innerHTML = response;
			} 
		},     
		onFailure: function(){ 
			document.getElementById("splash").innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );
}



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function goToMailboxTab( type, ssn_no ) {
	updateMailboxTabCount( type, ssn_no );
	showMailboxList(type, ssn_no, "date_sent", "desc", "0");
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function updateMailboxTabCount(ptype, ssn_no) {
	setPointer( "clicked" );
	
	new Ajax.Request('ajax/getMailCount.php', {
		method:'post',
		parameters: {
			ssn: ssn_no,
			type: ptype
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById('mainnav_mailbox_count').innerHTML = "("+response+")";
				document.getElementById('spnInbox').innerHTML = "Inbox ["+response+"]";
				if (ptype == "inbox") {
					document.getElementById('iinbox').className='selected'; 
					document.getElementById('ioutbox').className='notselected';
				} else {
					document.getElementById('iinbox').className='notselected'; 
					document.getElementById('ioutbox').className='selected';
				}

			} 
		},     
		onFailure: function(){ 
			//tab.innerHTML = "No response.";
		}   
	});
	
	
	setPointer( "unclicked" );	
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function updateMailboxNavCount(ssn_no) {////////////for future mailbox update every 5 seconds
	setPointer( "clicked" );
	
	new Ajax.Request('ajax/getMailCount.php', {
		method:'post',
		parameters: {
			ssn: ssn_no,
			type: "inbox"
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById('mainnav_mailbox_count').innerHTML = "("+response+")";
			} 
		},     
		onFailure: function(){ 
			document.getElementById('mainnav_mailbox_count').innerHTML  = "";
		}   
	});
	
	
	setPointer( "unclicked" );	
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function showMailboxList( ptype, ssn_no, pfld, psort, pL1 ) {
	
	setPointer( "clicked" );
	document.getElementById('mailbox_list').innerHTML = "<img src='images/ajax-loader.gif'>";
	
	new Ajax.Request('ajax/showMailboxList.php', {
		method:'post',
		parameters: {
			ssn: ssn_no,
			type: ptype,
			fld: pfld,
			srt: psort,
			l1: pL1
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById("mailbox_list").innerHTML = response;
			} 
		},     
		onFailure: function(){ 
			document.getElementById("mailbox_list").innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );
	
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function showSendMessage( ptype, pFrom, pTo, pMessageid, ssn_no ) {
	
	setPointer( "clicked" );
	document.getElementById('mailbox_list').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
	
	new Ajax.Request('ajax/showSendMessage.php', {
		method:'post',
		parameters: {
			ssn: ssn_no,
			type: ptype,
			from: pFrom,
			to: pTo,
			id: pMessageid
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById("mailbox_list").innerHTML = response;
			} 
		},     
		onFailure: function(){ 
			document.getElementById("mailbox_list").innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );
	
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function sendMessage( pFrom, pTo, pSubject, pMessage, ssn_no ) {
	
	setPointer( "clicked" );
	document.getElementById('mailbox_list').innerHTML = "<img src='images/ajax-loader.gif' class='loading'> Sending Message ...";
	
	new Ajax.Request('ajax/sendMessage.php', {
		method:'post',
		parameters: {
			ssn: ssn_no,
			from: pFrom,
			to: pTo,
			sbj: pSubject,
			msg: pMessage
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			document.getElementById("mailbox_list").innerHTML = 'Message sent successfully. <span class="buttons_title" onclick="goToMailboxTab(\'inbox\',\''+ssn_no+'\');">OK</span>';
		},     
		onFailure: function(){ 
			document.getElementById("mailbox_list").innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );
	
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function cancleMessage(ssn_no) {
	goToMailboxTab('inbox', ssn_no);
	/*updateMailboxTabCount( "inbox", ssn_no );
	showMailboxList("inbox", ssn_no, "date_sent", "desc", "");
	*/
	//alert('inbox');
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function closeOpenMessages() {
	//iterate over div elements:
	var htmlDivs = document.getElementsByTagName("div");
	for (var ii = 0; ii < htmlDivs.length; ii++) {
		//get pointer to current element:
		var div = htmlDivs[ii];
		if ( div.className == "message_box_cont" ) {
		  var par = div.parentNode;
		  par.innerHTML = "";
		  par.style.padding = "0px";
		}
	}
}	

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function loadMessageBody( obj, recordId, userDeleted, ssn_no ){
	cursor_wait(obj);
	setPointer( "clicked" );
	
	closeOpenMessages();
	
	document.getElementById("message_box_content"+recordId).innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";

	new Ajax.Request('ajax/showMessageBody.php', {
		method:'post',
		parameters: {
			ssn: ssn_no,
			id: recordId,
                        deleted: userDeleted
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById("message_box_content"+recordId).style.padding = "5px";
				document.getElementById("message_box_content"+recordId).innerHTML = "<div class='message_box_cont'>"+response+"</div>";
				document.getElementById("envelope"+recordId).src='images/envelope_read.gif';
				document.getElementById("tr_mailbox"+recordId).style.background='#404146';
				updateMailboxTabCount("inbox", ssn_no);
				//document.getElementById("tr_mailbox"+recordId).Attributes.Add("onMouseOut", "this.style.background='#404146';");
				//alert(document.getElementById(parentId).attributes);
				//document.getElementById(parentId).Attributes.Add("onMouseOut", "this.style.backgroundColor='#ffffff';")
				//document.getElementById(parentId).onMouseOut="this.style.background='#404146';"
			} 
		},     
		onFailure: function(){ 
			document.getElementById("message_box_content"+recordId).innerHTML = "No response.";
		}   
	}); 
	
	cursor_pointer(obj);
	setPointer( "unclicked" );
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function closeMessage(messageId) {
	document.getElementById("message_box_content"+messageId).innerHTML = "";	
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function deleteMessage( obj, messageId, pType, pAsk, ssn_no ) {

	cursor_wait(obj);
	setPointer( "clicked" );
	
	var deleteConfirmed = true;
	if (pAsk=='ask') {
		deleteConfirmed = confirm("Are you sure you want to delete this message?");
	}
	if (deleteConfirmed) {
		document.getElementById("message_box_content"+messageId).innerHTML = "";	
		
		new Ajax.Request('ajax/deleteMessage.php', {
			method:'post',
			parameters: {
				ssn: ssn_no,
				id: messageId
			},
			onSuccess: function(transport){       
				var response = transport.responseText || "";       
				
				//alert(response);
				if ( response.length > 0 ) {
					document.getElementById("tr_mailbox"+messageId).style.display = "none";	
					document.getElementById("tr_spacer"+messageId).style.display = "none";	
					updateMailboxTabCount( pType, ssn_no );
				}  
			},     
			onFailure: function(){ 
				//
			}   
		}); 
		
		
	}//if confirm
	
	
	cursor_pointer(obj);
	setPointer( "unclicked" );
	
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function delete_messages_batch( pType, messageList, ssn_no ) {

	setPointer( "clicked" );
	if (confirm("Are you sure you want to delete the selected messages?")) {
			
		document.getElementById("message_box_content").innerHTML = "";	
		
		new Ajax.Request('ajax/deleteMessage.php', {
			method:'post',
			parameters: {
				ssn: ssn_no,
				id: messageList
			},
			onSuccess: function(transport){       
				var response = transport.responseText || "";       
				
				//alert(response);
				if ( response.length > 0 ) {
					var arrMessageList = messageList.split(",");
					ii=0;
					while ( arrMessageList[ii] ) {
					  //alert("tr_mailbox"+arrMessageList[ii]); 
						document.getElementById("tr_mailbox"+arrMessageList[ii]).style.display = "none";	
						document.getElementById("tr_spacer"+arrMessageList[ii]).style.display = "none";	
						ii++;
					}
					updateMailboxTabCount( pType, ssn_no );
				} 
			},     
			onFailure: function(){ 
				//
			}   
		}); 
				
	}
	setPointer( "unclicked" );
	
}
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function delete_checked_messages ( pType, ssn_no) {
    //iterate over checkboxes within forms
    var formSpans = document.getElementsByTagName("form");

    // this ensures that any forms have at least one checkbox checked
    for ( ii = 0; ii < formSpans.length; ii++) {
      //get pointer to current element:
      var form = formSpans[ii];
      var index = 0;
      var numChecked = 0;
      var checkedList = '';
      var hasCheckbox = false;

      for (var intLoop = 0; intLoop < form.length; intLoop++) {
        if ( form[intLoop].type == "checkbox" && form[intLoop].id!="check_all") {  // verify that the form has a checkbox element
          hasCheckbox = true;
          if ( form[intLoop].checked == true ) {
            numChecked+=1;
			checkedList += form[intLoop].id+",";
		  }
        }
      }
      //if ( numChecked == 0 && hasCheckbox == true ) buttonState = true;
	  if ( numChecked == 0 ) {
	 	 alert("You must select at least one message to perform this action.");
	  } else {
		  //alert(checkedList);
		  delete_messages_batch(pType, checkedList, ssn_no);
	  }
  
    }
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
function checkUncheck (obj) {
    //iterate over checkboxes within forms
    var formSpans = document.getElementsByTagName("form");

    // this ensures that any forms have at least one checkbox checked
    for ( ii = 0; ii < formSpans.length; ii++) {
      //get pointer to current element:
      var form = formSpans[ii];

      for (var intLoop = 0; intLoop < form.length; intLoop++) {
        if ( form[intLoop].type == "checkbox" && form[intLoop].id!="check_all") {  // verify that the form has a checkbox element
		  //if (obj.checked == true) {
          	form[intLoop].checked = obj.checked;
		  //}
        }
      }
  
    }
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
var enteredInput='';
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function updateUserPic ( ssn_no ) {
	setPointer( "clicked" );
	document.getElementById('splash').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
	new Ajax.Request('ajax/updatepic.php', {
		method:'post',
		parameters: {
			ssn: ssn_no
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById("splash").innerHTML = response;
			} 
		},     
		onFailure: function(){ 
			document.getElementById("splash").innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function updateUserProfile ( ssn_no ) {
	setPointer( "clicked" );
	document.getElementById('splash').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
	new Ajax.Request('ajax/updateprofile.php', {
		method:'post',
		parameters: {
			ssn: ssn_no
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById("splash").innerHTML = response;
				
				enteredInput=retrieveEnteredInput();  
				//alert(enteredInput);
			} 
		},     
		onFailure: function(){ 
			document.getElementById("splash").innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function updateUserPrefs ( ssn_no ) {
	setPointer( "clicked" );
	document.getElementById('splash').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";

	new Ajax.Request('ajax/updateprefs.php', {
		method:'post',
		parameters: {
			ssn: ssn_no
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById("splash").innerHTML = response;
				
				enteredInput=retrieveEnteredInput();  
				//alert(enteredInput);
			} 
		},     
		onFailure: function(){ 
			document.getElementById("splash").innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function updateUserPass ( ssn_no ) {
	setPointer( "clicked" );
	document.getElementById('splash').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
	new Ajax.Request('ajax/updatehash.php', {
		method:'post',
		parameters: {
			ssn: ssn_no
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById("splash").innerHTML = response;
			} 
		},     
		onFailure: function(){ 
			document.getElementById("splash").innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function save_image_to_db(imgname) {
	setPointer( "clicked" );
	//document.getElementById('splash').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
	
	new Ajax.Request('ajax/updateUserPicture.php', {
		method:'post',
		parameters: {
			img: imgname
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				//document.getElementById("splash").innerHTML = response;
			} 
		},     
		onFailure: function(){ 
			//document.getElementById("splash").innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function oldHashValid( hash, ssn_no ) {
	var response = "" ;
	new Ajax.Request('ajax/oldhash.php', {
		method:'post',
		parameters: {
			ssn: ssn_no,
			lp: MD5(hash)
		},
		onSuccess: function(transport){       
			response = transport.responseText || "";       
			response = trim(response);
			
			//alert( response );
			if ( response.length > 0 ) {
				document.getElementById("old_hash_err").innerHTML = trim(response);
				document.getElementById("old_hash_passlock").className = "passlock_failed";
			} else {
				document.getElementById("old_hash_err").innerHTML = "";
				document.getElementById("old_hash_passlock").className = "passlock_passed";
				updateHash( hash, ssn_no );
			}
		},     
		onFailure: function(){ 
		response = "" ;
			document.getElementById("old_hash_err").innerHTML = "No response.";
			document.getElementById("old_hash_passlock").className = "passlock_failed";
		}   
	});
	
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function change_hash( ssn_no ) {

	setPointer( "clicked" );
	var old_hash = document.getElementById('old_hash').value;
	var verify_hash = document.getElementById('verify_hash').value;
	var hash = document.getElementById('p.hash').value;
	
	if (document.getElementById("p.hash_passlock").className == "passlock_passed" && document.getElementById("verify_hash_passlock").className == "passlock_passed") {
		oldHashValid( old_hash , ssn_no );
	} else {
		alert("Error: Please correct the mandatory fileds and try again.");	
	}
	
	setPointer( "unclicked" );
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function updateHash( hash, ssn_no ) {
	setPointer( "clicked" );
	document.getElementById('splash').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";

	var response = "" ;
	new Ajax.Request('ajax/changepass.php', {
		method:'post',
		parameters: {
			ssn: ssn_no,
			lp: MD5(hash)
		},
		onSuccess: function(transport){       
			response = transport.responseText || ""; 
			response = trim(response);
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById('splash').innerHTML = response;
			}
		},     
		onFailure: function(){ 
			document.getElementById("splash").innerHTML = "No response.";
		}   
	});

	setPointer( "unclicked" );

}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function PasslockStatusOK() {

  var passlockStatus = true; 

  //iterate over span elements:
  var htmlSpans = document.getElementsByTagName("span");

  for (var ii = 0; ii < htmlSpans.length; ii++) {
    //get pointer to current element:
    var span = htmlSpans[ii];

    // if a passlock span is greyed or red, then do not activate button
    if ( ( span.className == "passlock_failed" ) || ( span.className == "passlock_greyed" ) ) {
      passlockStatus = false;
    }
  }

  //iterate over div elements:
  var htmlDivs = document.getElementsByTagName("div");

  for (var ii = 0; ii < htmlDivs.length; ii++) {
    //get pointer to current element:
    var div = htmlDivs[ii];

    // if a passlock span is greyed or red, then do not activate button
    if ( ( div.className == "passlock_failed" ) || ( div.className == "passlock_greyed" ) ) {
      passlockStatus = false;
    }
  }



  if ( passlockStatus == true ) {

    //iterate over checkboxes within forms
    var formSpans = document.getElementsByTagName("form");

    // this ensures that any forms have at least one checkbox checked
    for ( ii = 0; ii < formSpans.length; ii++) {
      //get pointer to current element:
      var form = formSpans[ii];
      var index = 0;
      var numChecked = 0;
      var hasCheckbox = false;

      for (var intLoop = 0; intLoop < form.length; intLoop++) {
        if ( form[intLoop].type == "checkbox" ) {  // verify that the form has a checkbox element
          hasCheckbox = true;
          if ( form[intLoop].checked == true ) 
            numChecked+=1;
        }
      }
      if ( numChecked == 0 && hasCheckbox == true ) passlockStatus = false;
  
    }
  }

  return passlockStatus;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function SaveUserInfo(stepno, ssn) {
	setPointer( "clicked" );
	
	var m="";
	if (PasslockStatusOK()) {
		m=retrieveEnteredInput();  
		//alert(m); 
		if (m != enteredInput) { 
			//alert(m); 
			updateMember (stepno, m, ssn);
		} else {
			document.location='home.php?ref=myprofile&'+ssn;
		}
	}
	

	setPointer( "unclicked" );
}

function cancelUserInfo(stepno, ssn) {

	setPointer( "clicked" );
	
	m=retrieveEnteredInput();  
	if (m != enteredInput) { 
	//alert(enteredInput);
		if (confirm("Do you want to cancel without saving your changes?")) {
			document.location='home.php?ref=myprofile&'+ssn;
		} else {
			//SaveUserInfo(stepno, ssn);		
		} 
	} else {
		document.location='home.php?ref=myprofile&'+ssn;
	}

	setPointer( "unclicked" );
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

function updateMember(stepno, m, ssn) {
	setPointer( "clicked" );
	document.getElementById('splash').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
	
		new Ajax.Request('ajax/updateActions.php', {
			method:'post',
			parameters: {
				step: stepno,
				mm:m
			},
			onSuccess: function(transport){       
				var response = transport.responseText || "";       
				
				if ( response == "Success" ) {
					document.location="home.php?ref=myprofile&"+ssn;
				} else {
					document.getElementById("splash").innerHTML = response;
				}
			},     
			onFailure: function(){ 
				document.getElementById("splash").innerHTML = "No response.";
			}   
		}); 
	setPointer( "unclicked" );
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function goToProfileTab( page_no, ssn_no ) {
	
	setPointer( "clicked" );

	var leavepage = "no";
	m=retrieveEnteredInput();  
	//alert(enteredInput+"\n"+m);
	
	if (m != enteredInput) { 
		if (confirm("Do you want to leave without saving your changes?")) {
			leavepage = "yes";
		} else {
			//SaveUserInfo(stepno, ssn);		
		} 
	} else {
		leavepage = "yes";
	}

	if (leavepage == "yes") {
		document.getElementById('profile_tab').innerHTML = "<img src='images/ajax-loader.gif'>";
		selectTabMenu(page_no, 4);
			
		new Ajax.Request('ajax/showUpdateProfileTab.php', {
			method:'post',
			parameters: {
				ssn: ssn_no,
				page: page_no
			},
			onSuccess: function(transport){       
				var response = transport.responseText || "";       
				
				//alert(response);
				if ( response.length > 0 ) {
					document.getElementById("profile_tab").innerHTML = response;
					
					enteredInput=retrieveEnteredInput();  
					//alert(enteredInput);
				} 
			},     
			onFailure: function(){ 
				document.getElementById("profile_tab").innerHTML = "No response.";
			}   
		}); 
	}
	setPointer( "unclicked" );
	
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function reportInappropriateContent ( userId, recId, ssn_no ) {
	setPointer( "clicked" );
	document.getElementById('fade').style.display='block';
	document.getElementById('light').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";
	document.getElementById('light').style.display='block';
	
	new Ajax.Request('ajax/reportinappropriate.php', {
		method:'post',
		parameters: {
			ssn: ssn_no,
			ruid: userId,
			rcid: recId
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				response+="";
				document.getElementById("light").innerHTML = response;
			} 
		},     
		onFailure: function(){ 
			document.getElementById("light").innerHTML = "No response.";
		}   
	}); 
	setPointer( "unclicked" );
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function sendInappropriateContentReport(userId, recID, block_user_option, report_type, report_notes, ssn_no) {
	setPointer( "clicked" );
	document.getElementById('light').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";

	var buo = block_user_option ? "y" : "n";
	/*
	var block_user_option = document.getElementById('block_user_option').checked ? "y" : "n";
	var report_type = document.getElementById('report_type').value;
	var report_notes = document.getElementById('report_notes').value;*/
	
	//alert(userId);
	new Ajax.Request('ajax/srv_cmd.php', {
		method:'post',
		parameters: {
			sc:"SR",
			ssn: ssn_no,
			id: userId, 
			mid: recID, 
			bu: buo,
			rt: report_type,
			rn: report_notes
		},
		onSuccess: function(transport){       
			var response = transport.responseText || "";       
			
			//alert(response);
			if ( response.length > 0 ) {
				document.getElementById("light").innerHTML = response;
			} 
		},     
		onFailure: function(){ 
			document.getElementById("light").innerHTML = "No response.";
		}   
	}); 

	setPointer( "unclicked" );
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function confirmNavAway() {
	if (document.getElementById('navaway_alert').value == 1) {
		if (!confirm('Profile has not been created. Are you sure you want to navigate away from this page?')) {
			return false;
		}
	}
    return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function sendInvitation( emailList, ssn_no) {
	
	setPointer( "clicked" );
	document.getElementById('splash').innerHTML = "<img src='images/ajax-loader.gif' class='loading'>";

	//alert(emailList);
	if (emailList == "") {
            alert( "Please enter at least one email address." );
            
        } else {
            var response = "" ;
            new Ajax.Request('ajax/sendInvitationemail.php', {
                    method:'post',
                    parameters: {
                            ssn: ssn_no,
                            emails: emailList
                    },
                    onSuccess: function(transport){
                            response = transport.responseText || "";
                            document.getElementById("splash").innerHTML = 'Email sent successfully. <span class="buttons_title" onclick="document.location = \'home.php?\'">OK</span>';
                    },
                    onFailure: function(){
			document.getElementById("splash").innerHTML = "No response.";
                    }
            });
        }
	setPointer( "unclicked" );
	
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

