<!-- Beginning of JavaScript -
function getXMLHTTP() {
//fuction to return the xml http object
 var xmlhttp=false;
try{
	xmlhttp=new XMLHttpRequest();
}
catch(e)	{
	try{
		xmlhttp= new ActiveXObject("Microsoft.XMLHTTP");
	}
	catch(e){
		try{
		req = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch(e1){
			xmlhttp=false;
		}
	}
}

return xmlhttp;
}

function doReq(strUrl,divName){
  	var req = getXMLHTTP();

	if (req) {
 		req.onreadystatechange = function() {
		if (req.readyState == 4) {
		// only if "OK"
			if (req.status == 200) {
				document.getElementById(divName).innerHTML=req.responseText;
			} else {
				alert("There was a problem while using XMLHTTP:\n" + req.statusText);
			}
		}
	}
	req.open("GET", strUrl, true);
	req.send(null);
	}

	//document.getElementById(divName).innerHTML = strUrl;
}


function info(sMesaj) {
 document.getElementById('1').innerHTML = sMesaj ;
}


function help(id){
 sMessage = "Bau";
 sCR = "<br>";
 iMess = 0;

 switch(id.name){

 case "pret_futures":
    sMessage = "     PRET FUTURES: Introduceti pretul curent al contractului futures ce constituie activul suport al actiunii.";
    sMessage += sCR + "Valorile acceptate sunt de la 0 la 999.9999 .";
    break;

case "volatilitate":
    sMessage = "     VOLATILITATE ANUALIZATA: Introduceti valoarea anticipata a volatilitatii activului suport (% anualizat) , care se poate estima considerand volatilita";
    sMessage += "tea istorica redata cu ajutorul calculatorului de volatilitate.";
    sMessage += sCR + "Valorile acceptate sunt de la 0 la 999.99";
    break;

case "rata_dob":
    sMessage = "     RATA DOBANZII: Introduceti rata anuala a dobanzii considerata fara risc exprimata in procente.";
    sMessage += sCR + "Valorile acceptate sunt de la 0 la  99.99 .";
    break;


case "perioada":
   sMessage = "     PERIOADA:  Introduceti durata de timp pana la scadenta (exprimata in ani),";
   sMessage += " care se va calcula impartind numarul de zile lucratoare ramase pana la scadenta, la numarul total de zile lucratoare dintr-un an (care poate fi considerat 252).";
   sMessage += sCR + "Valorile acceptate sunt de la 0.00 la 1 .";
   break;

case "pret_ex":
    sMessage = "     PRET DE EXERCITARE:  Introduceti pretul de exercitare al optiunii Call sau Put.";
    sMessage += sCR + "Valorile acceptate sunt de la 0 la 999.9999 .";
    break;

case "pasi":
    sMessage = "    NUMAR DE PASI: Introduceti numarul de subintervale in care este impartita perioada ramasa pana la scadenta ,  care se poate considera egal cu ";
    sMessage += "numarul de zile ramase pana la scadenta .";
    sMessage += sCR + "Valorile acceptate sunt de la 0 la  999 .";
    break;

default :
    sMessage = "";
    break;
 }

  
  Tip(sMessage, WIDTH, 350, SHADOW, true, FADEIN, 400, FADEOUT, 400, FONTCOLOR, '#5E90C4')
  
  
}

function calcul(obj){
  calculate(obj,"PUT");
  calculate(obj,"CALL");

}


function calculate(obj,type){
    // in
    price = obj.pret_futures.value;
    strike = obj.pret_ex.value; // strike - exercise price
    rate = obj.rata_dob.value / 100; // Risk-Free Rate
    vol = obj.volatilitate.value / 100; //volatility
    T = obj.perioada.value; // time to maturity
    N = obj.pasi.value; // no of steps
    // out
    i = 0;
    j = 0;
    prob = 0.00;  // probability of Up movement
    
//    double S[][] = new Array[N+1][N+1];
      var S = new Array(N+1);
      for(i = 0; i < N+1; i = i + 1){
         S[i] = new Array(N+1);
      }
//    double c[][] = new double[N+1][N+1];
      var c = new Array(N+1);
      for(i = 0; i < N+1; i = i + 1){
         c[i] = new Array(N+1);
      }


    a = 0.00;
    num = 0.0;
    up = 0.0;
    down = 0.0;
    dt = 0.0;

    dt = T/N;
    up = Math.exp(vol*Math.sqrt(dt));
    down = 1/up;
    a = 1;
    prob = (a - down) / (up - down);
    
    // document.write(up + " - " + down + " - " + dt + " - " + vol + "<br>");

    test = "x";
    // compute stock price at each node
    // initialize call prices
    for(i = 0; i <= N; i++){
      for(j = 0; j <= i; j++)
      {
        S[i][j] = price*(Math.pow(up,j))*(Math.pow(down,i-j));
        c[i][j] = 0;
        // document.write(S[i][j] + " - " + c[i][j] + "<br>");
      }
    }

    // compute terminal payoffs
    for(j = N; j >=0; j--){
      if (type == "CALL"){
        c[N][j] = Math.max(S[N][j] - strike , 0.0);
      }
      else{
        c[N][j] = Math.max(strike - S[N][j] , 0);
      }

    }
    // work backords
    for(i = N-1; i >= 0; i--){
      for(j = i; j >=0; j--){
        c[i][j] = Math.exp(-rate*dt)*(prob*(c[i+1][j+1]) + (1 - prob) * (c[i+1][j]));
        if (type == "CALL"){
          c[i][j] = Math.max(S[i][j] - strike,c[i][j]);
        }
        else{
          c[i][j] = Math.max(strike - S[i][j],c[i][j]);
        }
      }
    }


    price = Math.round(c[0][0] * 1000000)/1000000;
    delta = Math.round((c[1][1]-c[1][0])/(S[1][1] - S[1][0]) * 1000000)/1000000;
    gama = (((c[2][2] - c[2][1])/(S[2][2] - S[2][1])) - ((c[2][1] - c[2][0])/(S[2][1] - S[2][0]))) / ( 0.5 * (S[2][2] - S[2][0]));
    gama = Math.round(gama * 1000000) / 1000000;
/*
    BigDecimal mBD;
    int decimals = 6;

    mBD = new BigDecimal (price);
    mBD = mBD.setScale(decimals,BigDecimal.ROUND_HALF_EVEN);
    price = mBD.doubleValue();

    mBD = new BigDecimal (delta);
    mBD = mBD.setScale(decimals,BigDecimal.ROUND_HALF_EVEN);
    delta = mBD.doubleValue();

    mBD = new BigDecimal (gama);
    mBD = mBD.setScale(decimals,BigDecimal.ROUND_HALF_EVEN);
    gama = mBD.doubleValue();
 */

    if (type == "CALL"){
      obj.call_prima.value = price;
      obj.call_delta.value = delta;
      obj.call_gamma.value = gama;
    }
    else{
      obj.put_prima.value = price;
      obj.put_delta.value = delta;
      obj.put_gamma.value = gama;
    }

  //  alert("calculate");
}



// - End of JavaScript - -->

