// JavaScript Document

function MM_jumpMenu(targ,selObj,restore){
  eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
  if (restore) selObj.selectedIndex=0;
}

function nyi() {
		alert("Sorry - this function is not available yet!");
		return false;
}

function divide( numerator, denominator ) {
    // In JavaScript, dividing integer values yields a floating point result (unlike in Java, C++, C)
    // To find the integer quotient, reduce the numerator by the remainder first, then divide.
    var remainder = numerator % denominator;
    var quotient = ( numerator - remainder ) / denominator;
	return quotient;
}

function showMessageLength() {
	
	var counter = document.getElementById("txtNumChars");
	var msg = document.getElementById("text");

	if ((null != counter) && (null != msg)) {

		var comment = " chars. ";
		var numchars = msg.value.length;
		if (numchars <= 160) {
			msgs = 1;
		} else  {
			msgs = divide(numchars,138) + 1;
		}
		if (msgs > 1) {
			comment += "   <span class=\"weedim\">(Note: " + msgs + " texts per recipient)</span>";
		}
		if (msgs > 3) {
			comment += "<br/><span class=\"weered\">Warning: long SMS messages may be truncated.</span>";
		}
		// counter.setAttribute('value', msg.value.length + comment);	
		counter.innerHTML = msg.value.length + comment;
	}
	
}

function showFeedbackLength() {
	
	var counter = document.getElementById("txtNumChars");
	var msg = document.getElementById("fbFeedback");

	if ((null != counter) && (null != msg)) {

		var comment = " chars ";
		var numchars = msg.value.length;
		if (numchars > 80) {
			comment += "   <span class=\"weered\">Message too long. Only the first 80 characters will be submitted.</span>";
		}
		counter.innerHTML = msg.value.length + comment;
	}
	
}

function showTemplateLength() {
	
	var counter = document.getElementById("txtNumChars");
	var msg = document.getElementById("templateActionData");

	if ((null != counter) && (null != msg)) {

		var comment = "";
		var numchars = msg.value.length;
		if (numchars > 160) {
			comment += "<br><span class=\"weered\">Note: Long messages may require multiple credits.</span>";
		}
		counter.innerHTML = "(" + msg.value.length + " chars)" + comment;
	}
	
}

/*
function showCredits() {
	
	var credits = document.getElementById("credits");
	credits.innerHTML -= 4;

}
*/

function typingMessage() {
	
	showMessageLength();

	// Clear the template menu to avoid confusion
	resetSelectedTemplate();

}

function typingFeedback() {
	
	showFeedbackLength();

}

function typingTemplate() {
	
	showTemplateLength();

}

function isASAP() {
	var oNow = document.frmSMS.asap[0];
	return (oNow.checked);
}

function validateDeliveryTime() {
	
	var errMsg = "";

	var oDeliverTime = document.frmSMS.deliverTime;
	var oLater = document.frmSMS.asap[1];
	var oNow = document.frmSMS.asap[0];
	var later = oLater.checked;
	
	if (isASAP()) {
		oDeliverTime.value = "0";
		return true;
	}
	pMonth = document.frmSMS.tMonthNo[document.frmSMS.tMonthNo.selectedIndex].value;
	pDay = document.frmSMS.tDayNo[document.frmSMS.tDayNo.selectedIndex].value;
/*
	if (0+pDay > 28) {
		if (pMonth.substring(0,7) == 'February') {
			errMsg .= "Invalid delivery date.";
		} else if (0+pDay > 30) {
			if (pMonth.substring(0,4) == 'April' ||
				pMonth.substring(0,4) == 'June' ||
				pMonth.substring(0,4) == 'September' ||
				pMonth.substring(0,4) == 'November' ) {
				errMsg .= "Invalid delivery date.";
			} 
		}
		if ('' != errMsg) {
			alert(errMsg);
			return false;
		}
	}
*/	
	var delTimeStr =
		document.frmSMS.tMonthNo[document.frmSMS.tMonthNo.selectedIndex].value +
		document.frmSMS.tDayNo[document.frmSMS.tDayNo.selectedIndex].value +
		'T' +
		document.frmSMS.tHours[document.frmSMS.tHours.selectedIndex].value +
		document.frmSMS.tMinutes[document.frmSMS.tMinutes.selectedIndex].value +
		'00';

	// This is expected by the send message script
	oDeliverTime.value = delTimeStr;
	
	var timeNow = new Date();
	var y = timeNow.getFullYear();
	var m = (timeNow.getMonth() < 11 ? '0' : '') + (timeNow.getMonth() + 1);
	var d = (timeNow.getDate() < 10 ? '0' : '') + timeNow.getDate();
	var h = (timeNow.getHours() < 10 ? '0' : '') + (timeNow.getHours() + (timeNow.getTimezoneOffset()/60));
	var mn = (timeNow.getMinutes() < 10 ? '0' : '') + timeNow.getMinutes();
	var nowTimeStr = y + m + d + 'T' + h + mn + '00';

	if (nowTimeStr > delTimeStr) {
		var conf = confirm('its ' + nowTimeStr + ' Delivery time has passed.\n\nSend this message now? ');	
	
		if (1 == conf) {
			oDeliverTime.value = "0";
			oNow.checked = true;
			return true;
		} else {
			return false;
		}
		
	} 
	
	return true;
	
}


function validateSetPassword() {

alert('Form validation in progress.');

	// TODO: THIS NEEDS FIXED - MUST CHECK THAT A USER IS SELECTED.
	
	conf = confirm("Set new password for user '" + document.setPassword.userid.value + "' ?");	
	if (1 == conf) {
		document.setPassword.submit();
		return true;
	} else {
		alert('Form not submitted');
		return false;
	}
	
}


// AJAX Test Scripts

function getRequestObject() {
	var http_request = false;

	if (window.XMLHttpRequest) { // Mozilla, Safari, ...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
			http_request.overrideMimeType('text/xml');
			// See note below about this line
		}
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	return http_request;   // may be false; caller should check
}



function handleResponse(http) {

	if (http.readyState == 4) {

		if (http.status == 200) { 
	//alert('HTTP Status: readyState = ' + http.readyState + 'status = ' + http.status);

			// TODO: experimental - this gets the response XML message, but we should
			// do something other than an alert - possibly a symbol or log entry?				
			var responseDoc = http.responseXML;
			var statusCodeElement = responseDoc.getElementsByTagName('MessageStatus').item(0);   
			var statusInfoElement = responseDoc.getElementsByTagName('MessageStatusInfo').item(0);   
			var creditElement = responseDoc.getElementsByTagName('CreditBalance').item(0);   
			var confirmRequiredElement = responseDoc.getElementsByTagName('ConfirmRequired').item(0);
			
			//alert('response:\n\n' + statusCodeElement);
			//alert('response:\n\n' + responseDoc);
			// Confirmation or error from response doc, if required
			if (('1' == confirmRequiredElement.firstChild.data) || ('0' != statusCodeElement.firstChild.data)){
				statusInfoMessage = statusInfoElement.firstChild.data;
				alert(statusInfoMessage);			
			}
			
			var msg = document.getElementById("text");
			
			if (null != msg) {
				 // Build the summary message.
				var summary = document.getElementById("summary");
				
				if (null != summary) {
					var smrytxt = msg.value;
					summary.innerText = smrytxt;
				}
				
				// Replace the message with a highlighted prompt to reduce accidental re-sends
				
				// msg.value = 'Type here to enter another message.';
				msg.value = '';
				showMessageLength();			 
				msg.select(); 

				// Update the credit counter
				creditBalance = creditElement.firstChild.data;
				document.getElementById("creditMsg").innerHTML = creditBalance;

				// manage modality
				setOverlay(false);  
					
			} 
			
		} else {
			// do nothing... we may get called repeatedly with timeouts... it's fine.
			// alert('There was a problem with the request.\n\nStatus == ' + http.status); // uncomment to debug
		}
	}
}


function setNumber() {
	// set the To phone number from the quick list menu
	if (document.getElementById)
	{
		// this is the way the standards work
		var toField = document.getElementById("to");
		var quicklist = document.getElementById("quicklist");		
		toField.value = quicklist.value;
	}
	else if (document.all)
	{
		// this is the way old msie versions work
		var toField = document.all["to"];
		var quicklist = document.all["quicklist"];
		toField.value = quicklist.value;
	}
	else if (document.layers)
	{
		// this is the way nn4 works
		var form = document.forms["frmSMS"];
		var toField = form["to"];
		var quicklist = form["quicklist"];
		toField.value = quicklist.value;
	}
}

function setMessageFromTemplate() {
	// set the Message from the Templates dropdown menu
	
	if (document.getElementById)
	{
		var messageField = document.getElementById("text");
		var templatesList = document.getElementById("templates");	
		messageField.value = templatesList.value;	
	}
	else if (document.all)
	{
		// this is the way old msie versions work
		var messageField = document.all["text"];
		var templatesList = document.all["templatesList"];
		messageField.value = templatesList.value;
	}
	else if (document.layers)
	{
		// this is the way nn4 works
		var form = document.forms["frmSMS"];
		var messageField = form["messageField"];
		var templatesList = form["templatesList"];
		messageField.value = templatesList.value;
	}
	

	showMessageLength();

}

function initMessageField(new_value_escaped) {
	new_value = decodeURIComponent(new_value_escaped);
	if (document.getElementById)
	{
		var messageField = document.getElementById("text");
		messageField.value = new_value;	
	}
	else if (document.all)
	{
		// this is the way old msie versions work
		var messageField = document.all["text"];
		messageField.value = new_value;	
	}
	else if (document.layers)
	{
		// this is the way nn4 works
		var form = document.forms["frmSMS"];
		var messageField = form["messageField"];
		messageField.value = new_value;	
	}

	showMessageLength();

}

function resetDelay() {
	// reset delay to 0 (immediate).
	var oNow = document.frmSMS.asap[0];
	oNow.checked = true;
}

function resetSelectedRecipient() {
	// set the blank recipient to selected
	var quickList = document.getElementById("quicklist");
	if (null != quickList) {
		quickList.selectedIndex = 0;
	}
}

function resetSelectedTemplate() {
	// set the blank template to selected
	var templatesList = document.getElementById("templates");
	if (null != templatesList) {
		templatesList.selectedIndex = 0;
	}
}

function sendMessage(number, message, saveNumberChecked, numberKey, copyMeTooChecked, copyMeTooEmailChecked, saveAsTemplateChecked, userFiltering, delayMins, saveSendOptions) {

/*
var msg = 'copyMeTooChecked: ' + copyMeTooChecked
+ '\ncopyMeTooEmailChecked:' + copyMeTooEmailChecked
+ '\nuserFiltering:' + userFiltering ;

alert(msg);
*/

	// var url = 'http://looknothumbs.com/sendsms.php';
	var url = '/sendsms.php';
	var params = '';
	
	// check for obvious crude errors
	if ("" == message) {
		alert("You can't send an empty message!");
		return false;
	}

	if ("" == number) {
		alert("Please enter a recipient for your message.\n\nTo use a number from your phonebook, start typing its name in the To field\nthen choose from the list that appears.");
		return false;
	}

	params = "to=" + escape(number)	+ "&text=" + escape(message);
	
	// Are we storing a new AddressBook number?
	if (saveNumberChecked) {
		if ("" == numberKey) {
			alert('Please enter a name for\nyour new address book entry');
			return false;
		}
		params = params + "&saveNumberAs=" + escape(numberKey);
	}

	// Did user request a CC by SMS?
	if (copyMeTooChecked) {
		// TODO: validate available credits
		params = params + "&copyMeTooSMS=true";
	}

	// Did user request a CC by Email?
	if (copyMeTooEmailChecked) {
		// TODO: validate available credits
		params = params + "&copyMeTooEmail=true";
	}

	// Are we storing a new template ?
	if (saveAsTemplateChecked) {
		// TODO: validate available slots
		params = params + "&saveAsTemplate=true";
	}

	// Are we saving the supplied options ?
	if (saveSendOptions) {
		// TODO: validate available slots
		params = params + "&saveSendOptions=true";
	}

	// Apply user-defined filters ?
	if (userFiltering) {
		params = params + "&userFiltering=true";
	}

	// Did user request delayed delivery ?
	if (delayMins > 0) {
		params = params + "&delayMins=" + delayMins;
	}
	
	var http = getRequestObject();
	if (http) {
		
		// prevent clicking while we're sending
		setOverlay(true);  
		InitializeTimer();  // restores Send button
		
		http.onreadystatechange = function() { handleResponse(http); } ;
		http.open('POST', url, true);
		http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		http.setRequestHeader("Content-length", params.length);
		http.setRequestHeader("Connection", "close");
		http.send(params);
	  
	} else {
		alert('Giving up :( Cannot create an XMLHTTP instance');
		return false;
	}

	// Don't deselect recipient as this might be part of a longer SMS conversation,
	// but deselect the other menus.
	resetSelectedTemplate();

	//resetDelay();
	
	return true;
	
}

function sendMessage2(number, message, saveNumberChecked, numberKey, copyMeTooChecked, copyMeTooEmailChecked, saveAsTemplateChecked, userFiltering, saveSendOptions) {

/*
var msg = 'copyMeTooChecked: ' + copyMeTooChecked
+ '\ncopyMeTooEmailChecked:' + copyMeTooEmailChecked
+ '\nuserFiltering:' + userFiltering ;

alert(msg);
*/
	// var url = 'http://looknothumbs.com/sendsms.php';
	var url = '/sendsms.php';
	var params = '';
	
	// check for obvious crude errors
	if ("" == message) {
		alert("You can't send an empty message!");
		return false;
	}

	if ("" == number) {
		alert("Please enter a recipient for your message.\n\nTo use a number from your phonebook, start typing its name in the To field\nthen choose from the list that appears.");
		return false;
	}

	params = "to=" + escape(number)	+ "&text=" + escape(message);
	
	// Validate delivery time
	if (!validateDeliveryTime()) {
		//alert("Send cancelled.");
		return(false);
	}
	if (isASAP()) {
		params = params + "&asap=1";
	} else {
		var oDeliverTime = document.frmSMS.deliverTime;
		params = params + "&asap=0";
		params = params + "&deliverTime=" + oDeliverTime.value;
	}
	
	// Are we storing a new Phonebook number?
	if (saveNumberChecked) {
		if ("" == numberKey) {
			alert('Please enter a name for\nyour new Phonebook entry');
			return false;
		}
		params = params + "&saveNumberAs=" + escape(numberKey);
	}

	// Did user request a CC by SMS?
	if (copyMeTooChecked) {
		// TODO: validate available credits (can't be authoratative on client-side, but friendly to check)
		params = params + "&copyMeTooSMS=true";
	}

	// Did user request a CC by Email?
	if (copyMeTooEmailChecked) {
		// TODO: validate available credits (can't be authoratative on client-side, but friendly to check)
		params = params + "&copyMeTooEmail=true";
	}

	// Are we storing a new template ?
	if (saveAsTemplateChecked) {
		// TODO: validate available slots
		params = params + "&saveAsTemplate=true";
	}

	// Are we saving the supplied options ?
	if (saveSendOptions) {
		// TODO: validate available slots
		params = params + "&saveSendOptions=true";
	}

	// Apply user-defined filters ?
	if (userFiltering) {
		params = params + "&userFiltering=true";
	}

	//alert('Debug: message not sent but OK');
	//return false;
	
	var http = getRequestObject();
	if (http) {
		
		// prevent clicking while we're sending
		setOverlay(true);  
		InitializeTimer();  // restores Send button
		
		http.onreadystatechange = function() { handleResponse(http); } ;
		http.open('POST', url, true);
		http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		http.setRequestHeader("Content-length", params.length);
		http.setRequestHeader("Connection", "close");
		http.send(params);
	  
	} else {
		alert('Giving up :( Cannot create an XMLHTTP instance');
		return false;
	}

	// Don't deselect recipient as this might be part of a longer SMS conversation,
	// but deselect the other menus.
	resetSelectedTemplate();

	//resetDelay();
	
	return true;
	
}

	
function sendMessageBasic(number, message) {
	
	//return sendMessage(number, message, false, "", false, false, false, 0);
	return sendMessage2(number, message, false, "", false, false, false, false, false);
	
}


/* Timeout Functions */
//var pageTimerID = null;
function pageTimeout(){
	var mins = 15;   // minutes for client-side session timeout; adjust as needed
	pageTimerID = setTimeout("goodbye()", mins * 60 * 1000);  // milliseconds
	//pageTimerID = setTimeout("goodbye()", 10000);  // milliseconds
	//pageTimerID = setTimeout("goodbye()", 20 * 1000);  // 20ms
}

function goodbye(){
	window.location = "/logout.php"; 
}

// initPage is common to all, others are page-specific
function initPage() {
	pageTimeout();
}

function initSendPage() {	
	var oTextbox = new AutoSuggestControl(document.getElementById("to"), new RemoteStateSuggestions());
	showMessageLength();
	initPage();
}

function toggleLayer(whichLayer)
{
	if (document.getElementById)
	{
		// this is the way the standards work
		var style2 = document.getElementById(whichLayer).style;
		style2.display = style2.display? "":"block";
	}
	else if (document.all)
	{
		// this is the way old msie versions work
		var style2 = document.all[whichLayer].style;
		style2.display = style2.display? "":"block";
	}
	else if (document.layers)
	{
		// this is the way nn4 works
		var style2 = document.layers[whichLayer].style;
		style2.display = style2.display? "":"block";
	}
}

/* Some of the window properties
	dependent - Subwindow closes if parent(the window that opened it) window closes 
	fullscreen - Display browser in full screen mode 
	height - The height of the new window, in pixels 
	width - The width of the new window, in pixels 
	left - Pixel offset from the left side of the screen 
	top - Pixel offset from the top of the screen 
	resizable - Allow the user to resize the window or prevent resizing 
	status - Display the status bar or not 
*/
function sendHelpPopup() {
	window.open( "send_help.html", "helpWindow", "status = 0, height = 500, width = 760, resizable = 1, scrollbars = yes" )
}
function sendAlertHelpPopup() {
	window.open( "help_sendAlert.html", "helpWindow", "status = 0, height = 500, width = 760, resizable = 1, scrollbars = yes" )
}
function alertHelpPopup() {
	window.open( "help_alerts.html", "helpWindow", "status = 0, height = 500, width = 760, resizable = 1, scrollbars = yes" )
}
function subscriptionHelpPopup() {
	window.open( "help_subscriptions.html", "helpWindow", "status = 0, height = 500, width = 760, resizable = 1, scrollbars = yes" )
}
function privacyPopup() {
	window.open( "privacy.html", "policyWindow", "status = 0, height = 500, width = 800, resizable = 1, scrollbars = yes" )
}
function faqPopup() {
	window.open( "faq.html", "faqWindow", "status = 0, height = 500, width = 800, resizable = 1, scrollbars = yes" )
}
	
// Carriage Return handler for text fields in forms with multiple Submit buttons
function blockEnter(e) {
	if (!e) var e = window.event;
	if (e.keyCode) code = e.keyCode;
	else if (e.which) code = e.which;
	
	return (code!=13);
}

// from http://www.w3schools.com/jsref/jsref_onkeypress.asp
function noNumbers(e)
{
	var keynum;
	var keychar;
	var numcheck;
	if(window.event) // IE
	{
		keynum = e.keyCode
	}
	else if(e.which) // Netscape/Firefox/Opera
	{
		keynum = e.which
	}
	keychar = String.fromCharCode(keynum)
	numcheck = /\d/
	return !numcheck.test(keychar)
}
// similar, bur allow ONLY digits!
function numbersOnly(e)
{
	var keynum;
	var keychar;
	var numcheck;
	if(window.event) // IE
	{
		keynum = e.keyCode
	}
	else if(e.which) // Netscape/Firefox/Opera
	{
		keynum = e.which
	}
	keychar = String.fromCharCode(keynum)
	numcheck = /(\d|[\b]|\cm)/
	return numcheck.test(keychar)   // this line is the only difference from above
}
// similar, bur allow ONLY digits!
function wordCharsOnly(e)
{
	var keynum;
	var keychar;
	var numcheck;
	if(window.event) // IE
	{
		keynum = e.keyCode
	}
	else if(e.which) // Netscape/Firefox/Opera
	{
		keynum = e.which
	}
	keychar = String.fromCharCode(keynum);
	numcheck = /(\w| |\(|\)|[\b])/
	return numcheck.test(keychar);   // this line is the only difference from above
}
	
// Overlay function - explicit version
function setOverlay(overlayOn) {
	
	if (document.getElementById)
	{
		var elOverlay = document.getElementById("overlay");
		var elButton = document.getElementById("button");
	}
	else if (document.all)
	{
		// this is the way old msie versions work
		var elOverlay = document.all["overlay"];
		var elButton = document.all["button"];
	}
	else 
	{
		// do nothing... we could do an alert('browser version error') but why be unfriendly!
		return false;
	}
	
	if (overlayOn) {
		elButton.style.display = "none";
		elOverlay.style.display = "block";
	} else {
		elButton.style.display = "block";
		elOverlay.style.display = "none";
	}
	
	return true;
	
}

// Overlay function - toggle version
function toggleOverlay() {	
	
	if (document.getElementById)
	{
		var elOverlay = document.getElementById("overlay");
		var elButton = document.getElementById("button");
	}
	else if (document.all)
	{
		// this is the way old msie versions work
		var elOverlay = document.all["overlay"];
		var elButton = document.all["button"];
	}
	else 
	{
		// do nothing... we could do an alert('browser version error') but why be unfriendly!
		return false;
	}
	
	overlayOn = ('block' == elOverlay.style.display) ? true : false;
	
	if (!overlayOn) {
		elButton.style.display = "none";
		elOverlay.style.display = "block";
	} else {
		elButton.style.display = "block";
		elOverlay.style.display = "none";
	}
	
	return true;
	
}
