	/** 
	** ============ AJAX ENGINE TO SEND/RECEIVE REQUEST  ==============
	**		The script creates the XMLHTTP to send and receive the AJAx
	**      request. It has been treated as controller scripts which determines
	**      that which function should call from "process_customer.js and process_agent.js
	** ================================================================
	**/

	// define global variables.
	var xmlHttp		= RequestObject();
	var pop_xmlHttp	= RequestObject(); // make a seprate object for popup alert
	
	var LIST = 'PENDING';

	// define global variables
	var HOST = "login_process.php"; // the php script which will fetch and return data

	// create xmlHTTP request for different browsers. 
	function RequestObject()
	{
		var xmlHttp;
		
		
		
		if(window.ActiveXObject)
		{
			var tryPossibleVersions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "Microsoft.XMLHttp"];
			
			for(i=0;i<tryPossibleVersions.length;i++) {
				try
				{
					xmlHttp = new ActiveXObject(tryPossibleVersions[i]);
					break;
				}
				catch (e)
				{
				xmlHttp = false;
				}
			}
		}
		else
		{
			try
			{
			xmlHttp = new XMLHttpRequest();
			}
			catch (e)
			{
			xmlHttp = false;
			}
		}
		if (!xmlHttp)
		alert("Error creating the XMLHttpRequest object.");
		else
		return xmlHttp;
	}
	
	/**
	** common script to send the request on server.
	** @param : The php script name which will process the request, query string
	**/
	function send_request(server_script, query_string)
	{
		

		try
		{
			
			if(xmlHttp.readyState == 4 || xmlHttp.readyState == 0) 
			{

			xmlHttp.open("POST", server_script, true);
			xmlHttp.setRequestHeader ("Content-Type","application/x-www-form-urlencoded;charset=ISO-8859-1");
			xmlHttp.onreadystatechange = get_response;
			xmlHttp.send(query_string);
			}
		}
		catch (e)
		{
			//alert(e.toString());
		}

	}
	/**
	** common script to get request from server
	** It will be further used by another function to parse the result and update the
	** browser.
	**/

	function get_response()
	{
		try
		{
			if (xmlHttp.readyState == 4)
			{
				if (xmlHttp.status == 200)
				{
					xmlResponse = xmlHttp.responseText;
					/** call function to hadle the response and update browser**/
					response_handler(xmlResponse);
					
				}
				else
				{
				//alert("There was a problem accessing the server: " +
				//xmlHttp.statusText);
				}
			}
		}
		catch (e)
		{
			//alert("Error in server response pls try after some time"+e.toString());
		}
	}
	
	/*########### seprate instance for http only for popup to make the call uniterupped### */
	/**
	** script to send the request on server to check the event status.
	** @param : The php script name which will process the request, query string
	**/
	function popup_request(server_script, query_string)
	{
		

		try
		{
			
			if(pop_xmlHttp.readyState == 4 || pop_xmlHttp.readyState == 0) 
			{

			pop_xmlHttp.open("POST", server_script, true);
			pop_xmlHttp.setRequestHeader ("Content-Type","application/x-www-form-urlencoded; charset=ISO-8859-1");
			pop_xmlHttp.onreadystatechange = get_response_popup;
			pop_xmlHttp.send(query_string);
			}
		}
		catch (e)
		{
			//alert(e.toString());
		}

	}

	// script to read the response for only popup
	function get_response_popup()
	{
		try
		{
			if (pop_xmlHttp.readyState == 4)
			{
				if (pop_xmlHttp.status == 200)
				{
					xmlResponse = pop_xmlHttp.responseText;
					/** call function to hadle the response and update browser**/
					response_handler(xmlResponse);
					
				}
				else
				{
				//alert("There was a problem accessing the server: " +
				//pop_xmlHttp.statusText);
				}
			}
		}
		catch (e)
		{
			//alert("Error in server response pls try after some time"+e.toString());
		}
	}

	/*###################################################################################*/

	/** function to show busy image at the top of form. This function will execute each time
	** when a request take place.
	**/

	function show_processing_image() 
	{
		if(document.getElementById('waiting_image'))
		{
			var o_proc_image_div = document.getElementById('waiting_image');
			o_proc_image_div.style.display="inline";
		}
	}

	/** This function will execute each time when a response will occure.
	**  hide the processing image showen by "show_processing_image" function.
	**/

	function hide_processing_image() 
	{
		if(document.getElementById('waiting_image'))
		{
			var o_proc_image_div = document.getElementById('waiting_image');
			o_proc_image_div.style.display="none";
		}
	}
	
	/** Send login details to php script **/

	function login_request()
	{
		
		
		show_processing_image();

		var login_type = document.getElementById('id_login_type').value; 
		var user_name = document.getElementById('id_user_name').value;
		var password = document.getElementById('id_password').value;
		
		switch(login_type)
		{
			case 'Admin':
				var query_string = "action=admin_login&user_name="+escape(user_name)+"&password="+escape(password);
				break;
			case 'Customer':
				var query_string = "action=customer_login&user_name="+escape(user_name)+"&password="+escape(password);
				break;
			
			case 'User':
				var query_string = "action=user_login&user_name="+escape(user_name)+"&password="+escape(password);
				break;
			case 'Agent':
				var query_string = "action=agent_login&user_name="+escape(user_name)+"&password="+escape(password);
				break;
			default:
				alert('In development');
				hide_processing_image();
				return;
				break;
		}
		
		var server_script = "../backend/login_process.php";
		send_request(server_script, query_string);
		
	}
	
	/** Function to handle all responses returned by controller php script **/
	function response_handler(xmlResponse)
	{
		//alert(xmlResponse);
		// if error show it
		error_handler(xmlResponse);		

		var parm = xmlResponse.split('*');
		
		if(parm.length<0) {
			alert('error');
			return;
		}

		switch (parm[0])
		{
		
		case 'LoginStatus' : 
			login_status(parm[1]);
			break;
		case 'OrderDetails' :
			response_order_details(parm[1]);
			break;
		case 'OrderReject':
			response_order_reject(parm[1]);
			break;
		case 'OrderAccepted' :
			response_order_accept(parm[1]);
			break;
		case 'CustomerDetails' :
			response_customer_details(parm[1]);
			break;
		case 'CustomerLineUser':
			response_customer_line_user(parm[1]);
			break;
		case 'SubscriptionCancelled':
			response_subscription_end(parm[1]);
			break;
		case 'EditCustomerInfo':
			response_edit_customer_info(parm[1]);
			break;
		case 'EditCompanyInfo':
			response_edit_company_info(parm[1]);
			break;
		case 'UpdateCustomerInfo':
			response_update_customer_info(parm[1]);
			break;
		case 'UpdateCompanyInfo':
			response_update_company_info(parm[1]);
			break;
		case 'EditAddress':
			response_address_edit(parm[1]);
			break;
		case 'UpdateAddress':
			response_address_updated(parm[1]);
			break;
		case 'ListUser':
			response_list_user_department(parm[1]);
			break;
		case 'EditUser':
			response_edit_user_info(parm[1]);
			break;
		case 'UpdateUserInfo':
			response_update_user_info(parm[1]);
			break;
		case 'ListDepartment':
			response_list_department(parm[1]);
			break;
		case 'EditDepartmentForm':
			response_edit_department_form(parm[1]);
			break;
		case 'UpdateDepartment':
			response_update_department(parm[1]);
			break;
		case 'NewDepartment':
			// Response to load form to add new department
			response_new_department(parm[1]);
			break;
		case 'UserDepartmentChanged':
			response_user_department_changed(parm[1]);
			break;
		case 'DeleteSucess':
			response_delete_department(parm[1]);
			break;
		case 'ListUserAwayMessage':
			response_list_user_away_messages(parm[1]);
			break;
		case 'ListAwayMessage':
			response_list_away_message(parm[1]);
			break;
		case 'EditAwayMessage':
			// load the away message edit form in browser
			response_edit_away_message(parm[1]);
			break;
		case 'UpdateAwayMessage':
			// update away message
			response_update_away_message(parm[1]);
			if(parm[2] == 'OK' && document.getElementById('btnback'))
			{
				document.getElementById('btnback').onclick();
			}
			break;
		case 'DeleteAways':
			// update away message
			response_delete_away_message(parm[1]);
			break;
		case 'AgentDeleteAways':
			// update away message
			response_agent_delete_away_message(parm[1]);
			break;
			
		case 'AddAwayMessage':
			response_add_away_message(parm[1]);
			break;
		case 'CustomerSubscription':
			response_show_subscription(parm[1]);
			break;
		case 'OrderUpgrade':
			response_order_upgrade(parm[1]);
			break;
		case 'PlanPrice':
			// display the plan price in browser
			response_plan_price(parm[1]);
			break;
		case 'PlanUpdated':
			response_order_upgraded(parm[1]);
			break;
		case 'AddExtra':
			// Response to show the form to add the more extra
			response_add_order_extra(parm[1]);
			break;
		case 'ExtraSaved':
			response_extra_saved(parm[1]);
			break;
		case 'RemoveExtra':
			response_remove_extra(parm[1]);
			break;
		case 'ResponseRemoved':
			extra_removed(parm[1]);
			break;
		case 'FormOrderDowngrade':
			form_downgrade(parm[1])
			break;
		case 'DowngradeOrder':
			response_order_downgrade(parm[1]);
			break;
		case 'ShowCancelSubscriptionForm':
			show_cancel_subscription_form(parm[1]);
			break;
		case 'CalcellationUpdated':
			calcellation_updated(parm[1]);
			break;
		case 'response_call_history':
			response_call_history(parm[1]);
			break;
		case 'Create_note':
			response_create_note(parm[1]);
			break;
		case 'Response_save_notes':
			response_message(parm[1]);
			break;
		case 'Edit_note':
			response_edit_note(parm[1]);
			break;
		case 'Response_delete_notes':
			response_delete_notes(parm[1]);
			break;
		case 'Customer_notes':
			response_customer_notes(parm[1]);
			break;
		case 'User_notes':
			response_user_notes(parm[1]);
			break;
		case 'Assign_note':
			response_assign_note(parm[1]);
			break;
		case 'User_note_updated':
			response_user_note_updated(parm[1]);
			break;
		case 'Customer_note_updated':
			response_customer_note_updated(parm[1]);
			break;
		// Show the response after deletion of users notes
		case 'deleted_user_note':
			response_deleted_user_notes(parm[1]);
			break;
		// show the user edit note form
		case 'response_edit_user_note':
			response_edit_user_note(parm[1]);
			break;
		case 'Show_helpdesk_output' :
			response_helpdesk_output(parm[1]);
			break;
		case 'Show_helpdesk_alert':
			response_helpdesk_alert(parm[1]);
			break;
		case 'response_load_agent':
			response_load_agent_form(parm[1]);
			break;
		case 'refill_response':
			refill_response(parm[1]); 
			break;
		/**
		**	Responses from Agent section started
		**  Definition file - process_agent.js
		**/
		case 'CallSaved':
			response_save_call_details(parm[1]);
			break;
		case 'ExtensionActive':
			response_extension_active(parm[1]);
			break;
		case 'popup_alert':
			response_show_hide_popup(parm[1]);
			break;
		case 'recent_calls':
			response_recent_calls(parm[1]);
			break;
		case 'event_status_updated':
			response_event_status_updated(parm[1]);
			break;
		case 'called_cancelled':
			response_cancel_call(parm[1]);
			break;
		case 'response_lineno_list':
			response_autofill_line(parm[1]);
			break;
		case 'helpdesk_questions':
			response_fill_question(parm[1]);
			break;
		case 'helpdesk_answers':
			response_fill_answer(parm[1]);
			break;
		case 'user_line_details':
			response_line_details(parm[1]);
			break;
		case 'ERROR':
			response_error_handling(parm[1]);
			break;
		case 'response_user_type':
			response_user_type(parm[1]);
			break;
		case 'refresh_lines':
			
			refresh_lines(parm[1]);
			break;
		case 'SaveUserInfo':
			save_user_info(parm);
			break;
		default:
			//alert(parm);
 			//alert('No Response defined');
			break;
			
		}
	}
	
	/**
	** function to show staus returned by PHP script
	** if status is OK it will redirect to respective home page of user
	** otherwise will show error.
	**/

	function login_status(response_text)
	{
		
		array_text = response_text.split('~');

		hide_processing_image();
		if(array_text[1] == 'OK')
		{
			if(array_text[0] == 'Admin')
			{
				document.frm_login.action='../backend/index.php';
				document.frm_login.submit();
			}
			else if(array_text[0] == 'Customer')
			{
				document.frm_login.action='../backend/customer_home.php';
				document.frm_login.submit();
			}
			else if(array_text[0] == 'User')
			{
				
				document.frm_login.action='../backend/user_home.php';
				document.frm_login.submit();
			}
			else if(array_text[0] == 'Agent')
			{
				
				document.frm_login.action='../backend/agent_home.php';
				document.frm_login.submit();
			}

		}
		else
		{
			alert(array_text[1]);
			return false;
		}
	}
	
	/**
	**	Called when user press enter in password text box of login page
	**  @Param : key event
	**  @Return type : void ( call the login_request method for further processing
	**  of page submit.
	**/
	function submit_request(e, login_type)
	{
		var key;

		if(window.event)
		{
			  key = window.event.keyCode;     //IE
		}
		else
		{
			  key = e.which;     //firefox
		}

		if(key == 13)
		{
			login_request(login_type);
		}
				
	}
	
	/**
	** Transfer the control to login.php when session has ended
	** @Param - String
	**/
	
	function response_error_handling(response_text)
	{
		if(response_text == 'SESSION_ERROR')
		{
			window.location.href='login.php';
		}
	}

	// Display the error message
	function error_handler(xmlResponse)
	{
		hide_processing_image();
		var array_error = new Array();
		var flag = 0;
		array_error[0] = 'fatal error';
		array_error[1] = 'warning';
		array_error[2] = 'notice';

		xmlResponse = xmlResponse.toLowerCase();
		for(i=0;i<array_error.length;i++)
		{
			var matchPos1 = xmlResponse.search(array_error[i]);
			
			if(matchPos1 != -1)
			{
				alert(xmlResponse);
				flag = 1;
				break;
			}
		}
		if(flag == 1)
		{
			return false; 
		}
	}

	// Reload the page to change the language
	function change_language(language)
	{
		window.location.href='index.php?lang='+language;
	}

	function submit_control(control, e)
	{
		var con = document.getElementById(control);
		if(window.event)
		{
			  key = window.event.keyCode;     //IE
		}
		else
		{
			  key = e.which;     //firefox
		}
		if(key == 13)
		{
			
			con.onclick();
			return false;
		}
	}
