// make sure that the required includes are there
 if (typeof NC == 'undefined') {
       alert("modaldialog.js requires the NC JavaScript framework");
 }
 
 if (typeof NC.util == 'undefined') {
       alert("modaldialog.js requires the NC JavaScript framework");
 }
 
  NC.util.AjaxRefresh = function( method, url, postData, populateConversationContent) {
		this.currentRefresh = new Date();
		this.currentConversationId = NC.widget.ConversationManager.getVisibleConversationId();
		if (this.currentConversationId > 0) {
			var cperiod = -1;
			if (populateConversationContent == false) {
//				period = NC.util.RefreshManager.getRefreshPeriod();
//				cperiod = 60000; // get all entries for the last minute
				cperiod = this.currentRefresh.getTime() - NC.util.RefreshManager.getLastConversationRefresh().getTime();
			}
			url += '?convid=' + this.currentConversationId + '&cperiod=' + cperiod;
		}
		var iperiod = this.currentRefresh.getTime() - NC.util.RefreshManager.getLastInviteRefresh().getTime();
		if (url.indexOf('?') == -1) {
			url += '?'
		}
		else {
			url += '&';
		}
		url += 'iperiod=' + iperiod;

		var fnSuperClass = NC.util.AjaxRefresh.superclass.constructor;
		fnSuperClass.call( this, method, url, postData);
		this.setUpdateTransactionsFlag(false); // don't update the transaction date on refresh
 }
 
   NC.lang.extend(NC.util.AjaxRefresh, NC.util.AjaxConnection, 
  	{
  		doRefresh: function( addUniqueParameter) {
  			var isOnline = NC.util.Connect.isOnline();
  			// show online state for debug
  			var onlineDiv = document.getElementById( 'ShowOnline');
  			/*
  			if (onlineDiv != null) {
  				if (isOnline) {
  					onlineDiv.innerHTML = "online";
  				}
  				else {
  					onlineDiv.innerHTML = "offline";
  				}
  			}
  			*/
  			var refreshDiv = document.getElementById( 'RefreshUrl');
  			if (isOnline || NC.util.RefreshManager.isSearchPending()) {
  				// if there is user activity or a search is pending
  				skip = NC.util.RefreshManager.getRefreshSkip();
  				if (isOnline) {
  					if (!NC.util.RefreshManager.isSearchPending()) {
  						skip = 5;
  					}
  				}
	  			if (NC.util.RefreshManager.incrementRefreshCount() % skip == 0) {
	//  				NC.util.Debug.writeToConsole( "do refresh **** " + NC.util.RefreshManager.getRefreshCount() + " , " +
	//  					NC.util.RefreshManager.getRefreshSkip());
					var callback =
					{
		  				success:this.onSuccess,
		  				failure:this.onFailure,
						scope: this    				
					};
					this.addUnprecedentedParameter();
					this.executeMethod( callback);
					if (this.currentConversationId > 0) { // remeber last conversation refresh time
						NC.util.RefreshManager.setLastConversationRefresh( this.currentRefresh);
					}
					NC.util.RefreshManager.setLastInviteRefresh( this.currentRefresh);
	  			}
	  			else {
	//  				NC.util.Debug.writeToConsole( "skip refresh " + NC.util.RefreshManager.getRefreshCount() + " , " +
	//  					NC.util.RefreshManager.getRefreshSkip());
	  			}
  			}
  			else {
		  			if (refreshDiv != null) {
		  				refreshDiv.innerHTML = 'no refresh';
		  			}
  			}
  		},
  		
  		showSearchResultsCallback: function (event, parms) {
  			NC.util.AjaxManager.displaySearchResults( parms.url, 'MainFrame', true);
  		},
  		
  		ignoreSearchResultsCallback: function( event, parms) {
  		},
  		
		onSuccess: function (transport) {
		    var xmlDocument = transport.responseXML;
			var refreshdiv = '';
			var refreshurl = '';
			try {
				var valid = xmlDocument.getElementsByTagName('valid').item(0).firstChild.data;
				var refresh = xmlDocument.getElementsByTagName('refresh').item(0).firstChild.data;
				var refreshurl = xmlDocument.getElementsByTagName('refreshurl').item(0).firstChild.data;
				var refreshdiv = xmlDocument.getElementsByTagName('refreshdiv').item(0).firstChild.data;
			} catch (e) {
//				alert(e.name + ", " + e.message);
//				alert(transport.responseText);
			}
			updateNodeList = xmlDocument.getElementsByTagName('update').item(0).childNodes;


			for ( i = 0; i < updateNodeList.length; i++) {
				var divName = updateNodeList.item(i).nodeName;
				if (updateNodeList.item(i).firstChild != null) {
					var divValue = updateNodeList.item(i).firstChild.data;
					div = document.getElementById(divName);
					if (div != null) {
						div.innerHTML = divValue;
					}
					else {
//						alert('did not update div name = :' + divName + ':');
					}
				}
			}
			if (refresh == 1) {
				if (refreshurl.length > 1) { // there actually is a url to show
					NC.util.RefreshManager.resetRefreshSkip(); // reset the refresh interval
					refreshurl = refreshurl.replace( /&amp;/g, '&');
					if (refreshdiv.length > 1) {
						NC.util.AjaxManager.displaySearchResults( refreshurl, refreshdiv, false);
						/*
						var updater = new NC.util.AjaxUpdate( 'GET', refreshurl, refreshdiv, refreshdiv, null );
						updater.doUpdate();
						*/
					}
					else {
						if ( NC.widget.MessageManager.isDialogShown()) {
								NC.widget.MessageManager.hideDialog();
  								NC.util.AjaxManager.displaySearchResults( refreshurl, 'MainFrame', true);
						}
						else {
							var callback =
							{
				  				ok:this.showSearchResultsCallback,
				  				cancel:this.ignoreSearchResultsCallback,
				  				url:refreshurl
				  			};
							NC.widget.MessageManager.showDialog('./searchResultsReady.php', 
								NC.util.AjaxDialogDisplay.ProgressDialog, callback, true, 300);
						}
					}
				}
			}
			if (valid == 1) {
				// set variable name values
				varNameList = xmlDocument.getElementsByTagName('var').item(0).childNodes;
				for ( i = 0; i < varNameList.length; i++) {
					varName = varNameList.item(i).nodeName;
					elements = document.getElementsByName( varName);
					if (elements.length > 0) {
						varValue = varNameList.item(i).firstChild.data;
						if (elements[0].type == 'hidden' ||
							elements[0].type == 'text') { // if we can set the value do it
								elements[0].value = varValue;
								NC.util.AjaxManager.setDivModifiedFlag( true);
						}
					}
				}
			}
			else { // errors
			}
			var conversations = xmlDocument.getElementsByTagName( 'conversations');
			
			var message = '';
			if (conversations != null && conversations.length > 0) {
				// we have a conversation update
				var conversation = conversations.item(0); // just look at the first one
				NC.widget.ConversationManager.updateConversation( conversation);
				message = "New message";
			}
			var newContentItems = xmlDocument.getElementsByTagName('newcontentlist');
			if (newContentItems != null && newContentItems.length > 0) {
				var newContentList = newContentItems.item(0).childNodes;
				var i;
				for ( i = 0; i < newContentList.length; i++) {
					var newContent = newContentList.item(i).childNodes;
					var contentName = '';
					var contentCount = 0;
					var menuDivName = '';
					var menuContent = '';
					var ci;
					for ( ci = 0; ci < newContent.length; ci++) {
						var name = newContent.item(ci).nodeName;
						var value = newContent.item(ci).firstChild.data;
						if (name == 'contentname') {
							contentName = value;
						}
						else if (name == 'contentcount') {
							contentCount = value;
						}
						else if (name == 'menuname') {
							menuDivName = value;
						}
						else if (name == 'menucontent') {
							menuContent = value;
						}
					}
					contentCount = parseInt( contentCount);
					if (contentCount > 0 ) {
						if (message.length > 0) {
							message += '<br>';
						}
						message += contentCount + ' new ' + contentName;
						if (contentCount > 1) {
							message += 's';
						}
						message += '.';
					}
					if (menuDivName.length > 0 && menuContent.length > 0) {
						if (NC.widget.MenuManager.isMenuVisible( menuDivName) == false) {
							var elMenuDiv = document.getElementById( menuDivName);
							if (elMenuDiv != null) {
								elMenuDiv.innerHTML = menuContent;
//								NC.util.Debug.writeToConsole("update menu " + menuDivName);
							}
						}
					}
				}
				var updateDiv = document.getElementById('NCMessage');
				if (updateDiv != null && message.length > 0) {
					updateDiv.innerHTML = '<h1>Alert</h1><p>' + message + '</p>';
					var animatedMessage = new NC.widget.AnimatedMessage( 'NCMessage', 15, 70, 3000);
					animatedMessage.show();
					
				}
			}
			
		},
  		
		onFailure: function( transport) {
		}
  	
  	});
 
 

 (function () {

 NC.util.RefreshManager = function() {
	/* private variables and methods */
	var REFRESH_PERIOD_MILLIS=2000;
	var REFRESH_DEFAULT=1000;
	var RefreshScriptName = './refresh2008.php';
	var refreshCount = 0;
	var refreshSkip = 10;
	var searchPending = false;
	var lastConversationRefresh = null;
	var lastInviteRefresh = null;
	
	

	var onFailure = function onFailure( transport) {
	}
	
		
	/* end private variables and methods*/
 	
 	return {
	 	/* public methods */
		startUpdates: function() {
			refreshSkip = REFRESH_DEFAULT;
			lastConversationRefresh = new Date();
			lastInviteRefresh = new Date();
			setInterval(this.callServer, REFRESH_PERIOD_MILLIS);
		},
	
		callServer: function() {
			var connection = new NC.util.AjaxRefresh( 'GET', RefreshScriptName, null, 
					!NC.widget.ConversationManager.isConversationContentPopulated());
			connection.doRefresh( );
		},
		
		getLastConversationRefresh: function() {
			if (lastConversationRefresh == null){
				lastConversationREfresh = new Date();
			}
			return lastConversationRefresh;
		},
		
		setLastConversationRefresh: function( _lastConversationRefresh) {
			lastConversationRefresh = _lastConversationRefresh;
		},
		
		getLastInviteRefresh: function() {
			if (lastInviteRefresh == null) {
				lastInviteRefresh = new Date();
			}
			return lastInviteRefresh;
		},
		
		setLastInviteRefresh: function( _lastInviteRefresh) {
			lastInviteRefresh = _lastInviteRefresh;
		},
		
		getRefreshPeriod: function() {
			return REFRESH_PERIOD_MILLIS;
		},
		
		getRefreshCount: function() {
			return refreshCount;
		},
		
		incrementRefreshCount: function() {
			return ++refreshCount;
		},
		
		getRefreshSkip: function() {
			return refreshSkip;
		},
		
		isSearchPending: function() {
			return searchPending;
		},
		
		setSearchPending: function( _refreshSkip) {
			refreshSkip = 1;
			searchPending = true;
		},

		resetRefreshSkip: function( ) {
			refreshSkip = REFRESH_DEFAULT;
			searchPending = false;
		}
			 	/* end public methods */	
	 	}
  }	
();

})(); 	
