//'*****
//'** This function sends the selected project back to the page
//'** so the version and location boxes fill based off of the
//'** selected project
function clearLRSearch(){
	content.sub_contents.location.href = "list_reports_frm.asp?loc=clear";
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

function list_reports_project_change(pDoc,thisCombo) {
	txtDateFrom = ""
	txtDateTo = ""
	txtDateFrom = pDoc.frmListReports.txtDateFrom.value;
	txtDateTo = pDoc.frmListReports.txtDateTo.value;


	var checks=0;
	var checksArray = new Array();
	for (var i=0;i<pDoc.frmListReports.elements.length;i++){
		if (pDoc.frmListReports.elements[i].type=='checkbox'){
			if(pDoc.frmListReports.elements[i].checked){	
				item_value = pDoc.frmListReports.elements[i].value;
				checksArray[checks]=item_value;
				checks++;
			}
		}
	}
	stringVal = 'list_reports_frm.asp?proj_code=' + escape(replace_spaces(thisCombo.options[thisCombo.selectedIndex].value)) + '&txtDateTo=' + escape(txtDateTo) + '&txtDateFrom=' + escape(txtDateFrom);
	for (i=0;i<checksArray.length;i++){
		stringVal = stringVal + "&chkReports=" + checksArray[i];
	}

	pDoc.location.replace(stringVal);
	return true;		
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

function list_reports_project_change_CAES(pDoc,thisCombo) {
	txtDateFrom = ""
	txtDateTo = ""
	txtDateFrom = pDoc.frmListReports.txtDateFrom.value;
	txtDateTo = pDoc.frmListReports.txtDateTo.value;

	var checks=0;
	var checksArray = new Array();
	for (var i=0;i<pDoc.frmListReports.elements.length;i++){
		if (pDoc.frmListReports.elements[i].type=='checkbox'){
			if(pDoc.frmListReports.elements[i].checked){	
				item_value = pDoc.frmListReports.elements[i].value;
				checksArray[checks]=item_value;
				checks++;
			}
		}
	}
	stringVal = 'list_reports_frm.asp?proj_code=' + escape(replace_spaces(thisCombo.options[thisCombo.selectedIndex].value))  + '&txtDateTo=' + escape(txtDateTo) + '&txtDateFrom=' + escape(txtDateFrom) + '&clear_dates=false';
	for (i=0;i<checksArray.length;i++){
		stringVal = stringVal + "&loc=&chkReports=" + checksArray[i];
	}
	stringVal = stringVal + "&RptFmt=" + pDoc.frmListReports.RptFmt.options[pDoc.frmListReports.RptFmt.selectedIndex].value
	pDoc.location.replace(stringVal);
	return true;		
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//'******
//'** This function validates the form for correct date,
//'** a selected project, and at least one checked report type
function validateRequest(pDoc){
	ls_Project  = pDoc.frmListReports.cmbProject.options[pDoc.frmListReports.cmbProject.selectedIndex].value;
	
	ls_Date_From = pDoc.frmListReports.txtDateFrom.value;
	ls_Date_To = pDoc.frmListReports.txtDateTo.value;

	//'** Validate that a project is selected
	if(pDoc.frmListReports.cmbProject.selectedIndex == null || pDoc.frmListReports.cmbProject.selectedIndex	 == "" || (pDoc.frmListReports.cmbProject.selectedIndex	 == 0)) {
		alert ("Please select a Project.") ;
		pDoc.frmListReports.cmbProject.focus() ;
		return false ;
	}
	
	//'**Validate that the date fields are correct (taken from EMC)
	if (pDoc.frmListReports.txtDateFrom.value != null && pDoc.frmListReports.txtDateFrom.value != "" && pDoc.frmListReports.txtDateFrom.value != "//") {
	    	var d = new Date(pDoc.frmListReports.txtDateFrom.value);
	    	if (isNaN(d)) {
	        	alert("Please enter a valid date.");
		     pDoc.frmListReports.txtDateFrom.focus();
		    	return false;
		    }
		if (isDate(pDoc.frmListReports.txtDateFrom.value)==false){
		     alert("Please enter a valid date.");
		     pDoc.frmListReports.txtDateFrom.focus();
		    	return false;
		}
		var dlow = new Date('01/01/1971');
		if (compareDate(d,dlow)==-1) {
			alert("Please enter a valid date.");
		     pDoc.frmListReports.txtDateFrom.focus();
			return false;
		}
		var dhigh = new Date('12/31/3000');
		if (compareDate(d,dhigh)==1) {
			alert("Please enter a valid date.");
		     pDoc.frmListReports.txtDateFrom.focus();
			return false;
		}
	}
	if (pDoc.frmListReports.txtDateTo.value != null && pDoc.frmListReports.txtDateTo.value != "" && pDoc.frmListReports.txtDateTo.value != "//") {
		var d = new Date(pDoc.frmListReports.txtDateTo.value);
	    	if (isNaN(d)) {
	        	alert("Please enter a valid date.");
			pDoc.frmListReports.txtDateTo.focus();
	    		return false;
	    	}
		if (isDate(pDoc.frmListReports.txtDateTo.value)==false){
		     alert("Please enter a valid date.");
		     pDoc.frmListReports.txtDateTo.focus();
		    	return false;
		}
	    	var dlow = new Date('01/01/1971');
	    	if (compareDate(d,dlow)==-1) {
	        	alert("Please enter a valid date.");
	          pDoc.frmListReports.txtDateTo.focus();
	    		return false;
	    	}
	    	var dhigh = new Date('12/31/3000');
	    	if (compareDate(d,dhigh)==1) {
	        	alert("Please enter a valid date.");
			pDoc.frmListReports.txtDateTo.focus();
	    		return false;
	    	}		    
	}
	if (pDoc.frmListReports.txtDateTo.value != null && pDoc.frmListReports.txtDateTo.value != "" && pDoc.frmListReports.txtDateTo.value != "//" && pDoc.frmListReports.txtDateFrom.value != null && pDoc.frmListReports.txtDateFrom.value != "" && pDoc.frmListReports.txtDateFrom.value != "//") {
	    	var d1 = new Date(pDoc.frmListReports.txtDateFrom.value);
    		var d2 = new Date(pDoc.frmListReports.txtDateTo.value);
		if (compareDate(d1,d2) == 1) {
			alert("Please enter a valid date range.");
			pDoc.frmListReports.txtDateFrom.focus();
			return false;
		}
	}
	
	//'**Validate that at least 1 report type is checked
	var checks=0;
	var checksArray = new Array();
	for (var i=0;i<pDoc.frmListReports.elements.length;i++){
		if (pDoc.frmListReports.elements[i].type=='checkbox'){
			if(pDoc.frmListReports.elements[i].checked){
					
				item_value = pDoc.frmListReports.elements[i].value;
				checksArray[checks]=item_value;
				checks++;
			}
		}
	}
	if (checks == 0){
		alert("Please choose a Report type.");
		return false;
	}
//	return true;		
submitRequest(pDoc);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

function submitRequest(pDoc){
	//'**Build Query String
	ls_Project  = pDoc.frmListReports.cmbProject.options[pDoc.frmListReports.cmbProject.selectedIndex].value;

	ls_Date_From = pDoc.frmListReports.txtDateFrom.value;
	ls_Date_To = pDoc.frmListReports.txtDateTo.value;

	stringVal = ""
	versionVal = ""
	locVal = ""
	DateVal = ""
	checkVal = ""
	stringVal = "list_reports_frm.asp?loc=submit&proj_code=" + escape(ls_Project);
	
	//Get versions
	for (var i = 0; i < pDoc.frmListReports.cmbVersion.length; i++){
		if(pDoc.frmListReports.cmbVersion.options[i].selected == true){
			if(pDoc.frmListReports.cmbVersion.options[i].value == "-1"){
				//notiing
			}else{	
				versionVal = versionVal + "&cmbVersion=" + pDoc.frmListReports.cmbVersion.options[i].value;
			}
		
		}
	}	
		
	//Get locations
	for (var i = 0; i < pDoc.frmListReports.cmbLocation.length; i++){
		if(pDoc.frmListReports.cmbLocation.options[i].selected == true){
			if(pDoc.frmListReports.cmbLocation.options[i].value == "-1"){
				//nothing
			}else{	
				locVal = locVal + "&cmbLocation=" + pDoc.frmListReports.cmbLocation.options[i].value;
			}	
		}
	}	
	
	dateVal = "&txtDateFrom=" + escape(ls_Date_From) + "&txtDateTo=" + escape(ls_Date_To);

	//'**Get checkboxes	
	var checks=0;
	var checksArray = new Array();
	for (var i=0;i<pDoc.frmListReports.elements.length;i++){
		if (pDoc.frmListReports.elements[i].type=='checkbox'){
			if(pDoc.frmListReports.elements[i].checked){	
				item_value = pDoc.frmListReports.elements[i].value;
				checksArray[checks]=item_value;
				checks++;
			}
		}
	}  
	
	for (i=0;i<checksArray.length;i++){
		checkVal = checkVal + "&chkReports=" +checksArray[i];
	}
	
	destString = stringVal + versionVal + locVal + dateVal + checkVal;
	content.location.href = destString;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

function list_search_dealer_change_caes(pDoc,thisCombo) {
	cmbProject = replace_spaces(pDoc.frmListReports.cmbProject.options[pDoc.frmListReports.cmbProject.selectedIndex].value);
	txtDateFrom = pDoc.frmListReports.txtDateFrom.value;
	txtDateTo = pDoc.frmListReports.txtDateTo.value;

	stringVal = ""

	cmbVersion = replace_spaces(pDoc.frmListReports.cmbVersion.options[pDoc.frmListReports.cmbVersion.selectedIndex].value);
	cmbLocation = replace_spaces(pDoc.frmListReports.cmbLocation.options[pDoc.frmListReports.cmbLocation.selectedIndex].value);
//	alert(replace_spaces(pDoc.frmListReports.cmbDealerContact.options[pDoc.frmListReports.cmbDealerContact.selectedIndex].value));

	stringVal = 'list_reports_frm.asp?proj_code=' + escape(cmbProject) + '&txtDateTo=' + escape(txtDateTo) + '&txtDateFrom=' + escape(txtDateFrom);
	stringVal = stringVal + '&cmbVersion=' + escape(cmbVersion) 
	stringVal = stringVal + '&cmbLocation=' + escape(cmbLocation) 

	stringVal = stringVal +  "&dealer_code=" + replace_spaces(thisCombo.options[thisCombo.selectedIndex].value);

	stringVal = stringVal +  "&cmbParent=" + escape(replace_spaces(pDoc.frmListReports.cmbParent.options[pDoc.frmListReports.cmbParent.selectedIndex].value));

	stringVal = stringVal +  "&cmbDealerContact=" + escape(replace_spaces(pDoc.frmListReports.cmbDealerContact.options[pDoc.frmListReports.cmbDealerContact.selectedIndex].value));
	stringVal = stringVal +  "&cmbCaller_Name=" + escape(replace_spaces(pDoc.frmListReports.cmbCaller_Name.options[pDoc.frmListReports.cmbCaller_Name.selectedIndex].value));
	stringVal = stringVal +  "&cmbKey_Type=" + escape(replace_spaces(pDoc.frmListReports.cmbKey_Type.options[pDoc.frmListReports.cmbKey_Type.selectedIndex].value));
	stringVal = stringVal +  "&cmbReason=" + escape(replace_spaces(pDoc.frmListReports.cmbReason.options[pDoc.frmListReports.cmbReason.selectedIndex].value));
	stringVal = stringVal +  "&cmbMachine_Type=" + escape(replace_spaces(pDoc.frmListReports.cmbMachine_Type.options[pDoc.frmListReports.cmbMachine_Type.selectedIndex].value));
	stringVal = stringVal +  "&cmbOS_Version=" + escape(replace_spaces(pDoc.frmListReports.cmbOS_Version.options[pDoc.frmListReports.cmbOS_Version.selectedIndex].value));
	stringVal = stringVal +  "&cmbSortBY=" + escape(replace_spaces(pDoc.frmListReports.cmbSortBY.options[pDoc.frmListReports.cmbSortBY.selectedIndex].value));
	
	pDoc.location.href = (stringVal);
	return true;	
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//'******
//'** This function validates the form for correct date,
//'** a selected project, and at least one checked report type
function validateRequest_caes(pDoc){
	ls_Project  = pDoc.frmListReports.cmbProject.options[pDoc.frmListReports.cmbProject.selectedIndex].value;
	
	ls_Date_From = pDoc.frmListReports.txtDateFrom.value;
	ls_Date_To = pDoc.frmListReports.txtDateTo.value;

	//'** Validate that a project is selected
	if(pDoc.frmListReports.cmbProject.selectedIndex == null || pDoc.frmListReports.cmbProject.selectedIndex	 == "" || (pDoc.frmListReports.cmbProject.selectedIndex	 == 0)) {
		alert ("Please select an Application Name.") ;
		pDoc.frmListReports.cmbProject.focus() ;
		return false ;
	}
	
	//'**Validate that the date fields are correct (taken from EMC)
	if (pDoc.frmListReports.txtDateFrom.value != null && pDoc.frmListReports.txtDateFrom.value != "" && pDoc.frmListReports.txtDateFrom.value != "//") {
	    	var d = new Date(pDoc.frmListReports.txtDateFrom.value);
	    	if (isNaN(d)) {
	        	alert("Please enter a valid date.");
		     pDoc.frmListReports.txtDateFrom.focus();
		    	return false;
		    }
		if (isDate(pDoc.frmListReports.txtDateFrom.value)==false){
		     alert("Please enter a valid date.");
		     pDoc.frmListReports.txtDateFrom.focus();
		    	return false;
		}
		var dlow = new Date('01/01/1971');
		if (compareDate(d,dlow)==-1) {
			alert("Please enter a valid date.");
		     pDoc.frmListReports.txtDateFrom.focus();
			return false;
		}
		var dhigh = new Date('12/31/3000');
		if (compareDate(d,dhigh)==1) {
			alert("Please enter a valid date.");
		     pDoc.frmListReports.txtDateFrom.focus();
			return false;
		}
	}
	if (pDoc.frmListReports.txtDateTo.value != null && pDoc.frmListReports.txtDateTo.value != "" && pDoc.frmListReports.txtDateTo.value != "//") {
		var d = new Date(pDoc.frmListReports.txtDateTo.value);
	    	if (isNaN(d)) {
	        	alert("Please enter a valid date.");
			pDoc.frmListReports.txtDateTo.focus();
	    		return false;
	    	}
		if (isDate(pDoc.frmListReports.txtDateTo.value)==false){
		     alert("Please enter a valid date.");
		     pDoc.frmListReports.txtDateTo.focus();
		    	return false;
		}
	    	var dlow = new Date('01/01/1971');
	    	if (compareDate(d,dlow)==-1) {
	        	alert("Please enter a valid date.");
	          pDoc.frmListReports.txtDateTo.focus();
	    		return false;
	    	}
	    	var dhigh = new Date('12/31/3000');
	    	if (compareDate(d,dhigh)==1) {
	        	alert("Please enter a valid date.");
			pDoc.frmListReports.txtDateTo.focus();
	    		return false;
	    	}		    
	}
	if (pDoc.frmListReports.txtDateTo.value != null && pDoc.frmListReports.txtDateTo.value != "" && pDoc.frmListReports.txtDateTo.value != "//" && pDoc.frmListReports.txtDateFrom.value != null && pDoc.frmListReports.txtDateFrom.value != "" && pDoc.frmListReports.txtDateFrom.value != "//") {
	    	var d1 = new Date(pDoc.frmListReports.txtDateFrom.value);
    		var d2 = new Date(pDoc.frmListReports.txtDateTo.value);
		if (compareDate(d1,d2) == 1) {
			alert("Please enter a valid date range.");
			pDoc.frmListReports.txtDateFrom.focus();
			return false;
		}
	}
	
	//'**Validate that at least 1 report type is checked
	var checks=0;
	var checksArray = new Array();
	for (var i=0;i<pDoc.frmListReports.elements.length;i++){
		if (pDoc.frmListReports.elements[i].type=='checkbox'){
			if(pDoc.frmListReports.elements[i].checked){
					
				item_value = pDoc.frmListReports.elements[i].value;
				checksArray[checks]=item_value;
				checks++;
			}
		}
	}
	if (checks == 0){
		alert("Please choose a Report type.");
		return false;
	}
	submitRequest_caes(pDoc);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

function submitRequest_caes(pDoc){
	//'**Build Query String
	stringVal = ""
	checkVal = ""

	ls_Project  = pDoc.frmListReports.cmbProject.options[pDoc.frmListReports.cmbProject.selectedIndex].value;

	ls_Date_From = pDoc.frmListReports.txtDateFrom.value;
	ls_Date_To = pDoc.frmListReports.txtDateTo.value;

	cmbProject = replace_spaces(pDoc.frmListReports.cmbProject.options[pDoc.frmListReports.cmbProject.selectedIndex].value);
	txtDateFrom = pDoc.frmListReports.txtDateFrom.value;
	txtDateTo = pDoc.frmListReports.txtDateTo.value;

	cmbVersion = replace_spaces(pDoc.frmListReports.cmbVersion.options[pDoc.frmListReports.cmbVersion.selectedIndex].value);
	cmbLocation = replace_spaces(pDoc.frmListReports.cmbLocation.options[pDoc.frmListReports.cmbLocation.selectedIndex].value);

	stringVal = 'list_reports_frm.asp?loc=submit'; 
	stringVal = stringVal + '&proj_code=' 		+ escape(cmbProject) + '&txtDateTo=' + escape(txtDateTo) + '&txtDateFrom=' + escape(txtDateFrom);
	stringVal = stringVal + '&cmbVersion='	 	+ escape(cmbVersion); 
	stringVal = stringVal + '&cmbLocation=' 	+ escape(cmbLocation); 
	
	stringVal = stringVal + '&cmbParent=' 		+ escape(replace_spaces(pDoc.frmListReports.cmbParent.options[pDoc.frmListReports.cmbParent.selectedIndex].value));
	stringVal = stringVal + '&dealer_code=' 	+ escape(replace_spaces(pDoc.frmListReports.cmbDealer.options[pDoc.frmListReports.cmbDealer.selectedIndex].value));
	stringVal = stringVal + '&cmbDealerContact=' + escape(replace_spaces(pDoc.frmListReports.cmbDealerContact.options[pDoc.frmListReports.cmbDealerContact.selectedIndex].value));
	stringVal = stringVal + '&cmbCaller_Name=' 	+ escape(replace_spaces(pDoc.frmListReports.cmbCaller_Name.options[pDoc.frmListReports.cmbCaller_Name.selectedIndex].value));
	stringVal = stringVal + '&cmbKey_Type=' 	+ escape(replace_spaces(pDoc.frmListReports.cmbKey_Type.options[pDoc.frmListReports.cmbKey_Type.selectedIndex].value));
	stringVal = stringVal + '&cmbReason=' 		+ escape(replace_spaces(pDoc.frmListReports.cmbReason.options[pDoc.frmListReports.cmbReason.selectedIndex].value));
	stringVal = stringVal + '&cmbMachine_Type='	+ escape(replace_spaces(pDoc.frmListReports.cmbMachine_Type.options[pDoc.frmListReports.cmbMachine_Type.selectedIndex].value));
	stringVal = stringVal + '&cmbOS_Version=' 	+ escape(replace_spaces(pDoc.frmListReports.cmbOS_Version.options[pDoc.frmListReports.cmbOS_Version.selectedIndex].value));
	stringVal = stringVal + '&cmbSortBY=' 		+ escape(replace_spaces(pDoc.frmListReports.cmbSortBY.options[pDoc.frmListReports.cmbSortBY.selectedIndex].value));
	stringVal = stringVal +  "&RptFmt=" + pDoc.frmListReports.RptFmt.options[pDoc.frmListReports.RptFmt.selectedIndex].value;
	//'**Get checkboxes	
	var checks=0;
	var checksArray = new Array();
	for (var i=0;i<pDoc.frmListReports.elements.length;i++){
		if (pDoc.frmListReports.elements[i].type=='checkbox'){
			if(pDoc.frmListReports.elements[i].checked){	
				item_value = pDoc.frmListReports.elements[i].value;
				checksArray[checks]=item_value;
				checks++;
			}
		}
	}  
	
	for (i=0;i<checksArray.length;i++){
		checkVal = checkVal + "&chkReports=" +checksArray[i];
	}
	
	destString = stringVal + checkVal;
	content.location.href = destString;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
