// calctrig.js

// (C)1996 2001 Copyright calculator.com
// All rigths reserved
// Duplication of this code in whole or in part
// without prior written permission from calculator.com
// is prohibited

//=======================
function togleMode(modein)
{
	if(modein == "DEG"){
		mode = "DEG";
		swapImage("sci_rad_img",sci_deg_img.src);
		crlunit=Math.PI/180.0;
	}else if(modein == "RAD"){
		mode = "RAD";
		swapImage("sci_rad_img",sci_rad_img.src);
		crlunit=1.0;
	}else if(modein == "GRAD"){
		mode = "GRAD";
		swapImage("sci_rad_img",sci_grad_img.src);
		crlunit=(Math.PI/200.0);
	}
}
//=======================
function trigfunc(f)
{
var fs=""; //function string the function pretty name for the tape

	enter();
	
 	switch(f){
		case  "sin":
			value = Math.sin(value * crlunit);
			fs="in "+mode +" "+f;
			break;
		case  "cos":
			value = Math.cos(value * crlunit);
			fs="in "+mode +" "+f;
			break;
		case  "tan":
			value = Math.tan(value * crlunit);
			fs="in "+mode +" "+f;
			break;
		case  "asin":
			value = Math.asin(value) / crlunit;
			fs="in "+mode +" "+f;
			break;
		case  "acos":
			value = Math.acos(value) / crlunit;
			fs="in "+mode +" "+f;
			break;
		case  "atan":
			value = Math.atan(value) / crlunit;
			fs="in "+mode +" "+f;
			break;
		case  "sh":
			value = hypsin(value);
			fs="hyp sin"
			break;
		case  "ch":
			value = hypcos(value);
			fs="hyp cos"
			break;
		case  "th":
			value = hyptan(value);
			fs="hyp tan"
			break;
		case  "ash":
			value = hypasin(value);
			fs="hyp asin"
			break;
		case  "ach":
			value = hypacos(value);
			fs="hyp acos"
			break;
		case  "ath":
			value = hypatan(value);
			fs="hyp atan"
			break;
		default: 
		
	}	
	if(fs=="")	
		fs=f;
	refresh();	
	
	document.result.taperoll.value +=""+fs+"\n "+ document.result.result.value+"\n\n";
	rvcroll();
}
//=======================
// hyperbolic sine
//
function hypsin(value)
{
var buf = 1.0;
var z = value*value;

	if( Math.abs(value)<0.1 ){
		for (var i=41; i>2; i=i-2) { buf = 1+z*buf/(i*(i-1)) }
		value = value*buf
	}else{
		value = 0.5*(Math.exp(value)-Math.exp(-value))
	}
	return value;
}

//=======================
// hyperbolic arc sine
//
function hypasin(value)
{
var z = value;
var buf = 1.0/43.0;
var z2 = z*z;

	if( Math.abs(z)<0.1 ){
		for (var i=41; i>0; i=i-2) { buf = 1.0/i-i*z2*buf/(i+1) }
		value = z*buf
	}else{
		az = Math.abs(z)
		if (az > 10.0e15){
			buf = Math.log(2*az)
		}else{
			buf = Math.log(az+Math.sqrt(1+az*az))
		}
		if(z<0){
			value = -buf
		}else{
			value = buf
		}
	}
	return value;
}

//=====================
// hyperbolic arc sine
//
function hypcos(value)
{
var buf = 1.0;
var z = value*value;

	if( Math.abs(value)<0.1 ){
		for (var i=40; i>1; i=i-2) { buf = 1+z*buf/(i*(i-1)); }
		value = buf;
	}else{
		value = 0.5*(Math.exp(value)+Math.exp(-value));
	}
	return value;
}

//=======================
// hyperbolic arc cosine
//
function hypacos(value)
{
var z = value;
	if( z<1 ){
		value = "Error";
	}else{
		if (z > 10.0e15){
			value = Math.log(2*z);
		}else{
			value = Math.log(z+Math.sqrt(z*z-1));
		}
	}
	return value;
}

//========================
// hyperbolic tangent
//
function hyptan(value)
{
var num = 1.0;	
var z = value*value;
var denom = 1.0;

	if( Math.abs(value)<0.1 ){
		for (var i=41; i>2; i=i-2) { num = 1+z*num/(i*(i-1)) }
		for (var i=40; i>1; i=i-2) { denom = 1+z*denom/(i*(i-1)) }
		value = (num/denom)*value;
	}else{
		if (Math.abs(value)>100){
			if (value>0){
				value = 1
			}else{
				value = -1
			}
		}else{
			num = Math.exp(value)-Math.exp(-value)
			denom = Math.exp(value)+Math.exp(-value)
			value = num/denom
		}
	}
	return value;
}
//========================
// hyperbolic arc tangent
//
function hypatan(value)
{
var	z = value;
var buf = 1.0/43.0;
var z2 = z*z;

	if( Math.abs(z)<0.1 ){
		for (var i=41; i>0; i=i-2) { buf = 1.0/i + z2*buf }
			value = z*buf
	}else{
		az = Math.abs(z)
		if (az >= 1.0){
			value = "Error"
		}else{
			buf = 0.5*Math.log((1+az)/(1-az))
			if(z<0){
				value = -buf
			}else{
				value = buf
			}
		}
	}
	return value;
}
      
      
