	var ha=secz=az=alt=ld=lt=ut=dt=jd=lst=false;
	var Observation = function() {
		if(arguments.length != 0) {
			this.parameter = [];
			for (var i=0; i<arguments.length; i++) {
				switch(arguments[i]) {
					case 'HA':   ha   = true; this.parameter.push('\'HA\''); break;
					case 'secz': secz = true; this.parameter.push('\'secz\''); break;
					case 'az':   az   = true; this.parameter.push('\'az\''); break;
					case 'alt':  alt  = true; this.parameter.push('\'alt\''); break;
					case 'LD':   ld   = true; this.parameter.push('\'LD\''); break;
					case 'LT':   lt   = true; this.parameter.push('\'LT\''); break;
					case 'UT':   ut   = true; this.parameter.push('\'UT\''); break;
					case 'DT':   dt   = true; this.parameter.push('\'DT\''); break;
					case 'JD':   jd   = true; this.parameter.push('\'JD\''); break;
					case 'LST':  lst  = true; this.parameter.push('\'LST\''); break;
				}
			}
		} else { 
			ha=secz=az=alt=ld=lt=ut=dt=jd=lst=true; 
			this.parameter = ['\'HA\'','\'secz\'','\'az\'','\'alt\'','\'LD\'','\'LT\'','\'UT\'','\'DT\'','\'JD\'','\'LST\''];
		}
	}
	
	Observation.prototype.parameter = new Array(10);
	
	Observation.prototype.start = function()
	{
		//alert(ha+','+secz+','+az+','+alt+','+ld+','+lt+','+ut+','+dt+','+jd+','+lst);
		//GLOBAL VARIABLE
		var dlat = Number(document.getElementById('dlat').value);
		var mlat = Number(document.getElementById('mlat').value);
		var slat = Number(document.getElementById('slat').value);
		var latitude = dlat + mlat/60 + slat/3600;
		if (eval("document.myForm.dirLat[0].checked") == true) var dirLat = "N";
		else var dirLat = "S";
		if (dirLat == "N") latitude = Number(latitude);
		if (dirLat == "S") latitude = Number(latitude)*(-1);
		var dlong = Number(document.getElementById('dlong').value);
		var mlong = Number(document.getElementById('mlong').value);
		var slong = Number(document.getElementById('slong').value);
		var longitude = dlong + mlong/60 + slong/3600;
		if (eval("document.myForm.dirLong[0].checked") == true) var dirLong = "E";
		else var dirLong = "W";
		var decDeg = Number(document.getElementById('decDeg').value);
		var decMin = Number(document.getElementById('decMin').value);
		var decSec = Number(document.getElementById('decSec').value);
		var dec = decDeg + decMin/60 + decSec/3600;
		var raHour = Number(document.getElementById('raHour').value);
		var raMin = Number(document.getElementById('raMin').value);
		var raSec = Number(document.getElementById('raSec').value);
		var ra = raHour + raMin/60 + raSec/3600;
		var loc = Number(document.getElementById('gmt').value);
		//alert(loc);
		//var loc = document.myForm.options.gmt.value;
		
		//loc = mov;
		
	  //local time
		var today = new Date();
		var h = today.getHours();
		var m = today.getMinutes();
		var s = today.getSeconds();
		h = checkTime(h);
		m = checkTime(m);   // add a zero in front of numbers<10
		s = checkTime(s);   // add a zero in front of numbers<10
		if(lt) document.getElementById('LT').innerHTML = h + ":" + m + ":" + s;

	  //Universal Time
		var hUT = Number(h) - Math.floor(loc);
		var mUT = Number(m) - (loc - Math.floor(loc))*60;
		var sUT = Number(s);
		var UT = hUT + mUT/60 + sUT/3600;
		mUT = checkTime(mUT);
		sUT = checkTime(sUT);
		if(ut) document.getElementById('UT').innerHTML = checkTime(hUT) + ":" + mUT + ":" + sUT;
	    //var loc = loc + 4;
		//alert('test1' + loc);

	  //Julian Day
		var day = today.getDate();
		var month = today.getMonth();
		var year = today.getFullYear();
		month = month + 1;
		var JD = JulianDay(hUT, mUT, sUT, day, month, year, loc);
		JD = Decimal_digit(String(JD),5);
		if(jd) document.getElementById('JD').innerHTML = JD;
	  //alert("masih ok" + " " + loc);  
      
      //HJD
	    var hjd = HJD(parseFloat(JD),301.8125,37.00556);
		hjd = Decimal_digit(String(hjd),5);
		if(hjd) document.getElementById('HJD').innerHTML = hjd;
	  
	  //Dinamical Time
		var DelT = -15 + (((JD - 2382148)*(JD - 2382148))/41048480);
		var sDT = Math.floor(DelT + sUT);
		var mDT = mUT;
		var hDT = hUT;
		do {
			if (sDT > 60) {
				sDT -= 60;
				mDT++;
				if (mDT > 60) {
					mDT -= 60;
					hDT++;
				}
			}
		}while(sDT > 60);
		if(dt) document.getElementById('DT').innerHTML = checkTime(hDT) + ":" + checkTime(mDT) + ":" + checkTime(sDT);
				
	  //Local Date
		if(ld) document.getElementById('tanggal').innerHTML = day + "/" + month + "/" + year;

	  //Local Sidereal Time
		var T = (JD - 2451545)/36525;
		var T0 = reduce(6.697374558 + (2400.051336*T) + (0.000025862*T*T),24);
		var UT = (hUT + mUT/60 + sUT/3600)*1.002737909;
		var GST = reduce(UT + T0,24);
		//var dirLong = (document.getElementById('dirLong').value)*1;		
		//var dirLong = (document.myForm.dirLong[1].value)*1;
		if (dirLong == 'E') var LST = GST + longitude/15;
		if (dirLong == 'W') var LST = GST - longitude/15;
		//alert('long' + longitude +'dirLong' + dirLong);
		LST = reduce(LST,24);
		var hLST = Math.floor(LST);
		var mLST = Math.floor((LST - hLST)*60);
		var sLST = Math.floor(((LST - hLST)*60 - mLST)*60);
		hLST = checkTime(hLST);
		mLST = checkTime(mLST);
		sLST = checkTime(sLST);
		if(lst) document.getElementById('lst').innerHTML = hLST + ":" + mLST + ":" + sLST;

	  //Hour Angle
		var HA = LST - ra;
		var haunit = document.getElementById('haunit').value;
		if(ha) {
		  if(haunit == "hahour") document.getElementById('HA').innerHTML = Decimal_digit(String(HA),3);
		  else if(haunit == "hahms") document.getElementById('HA').innerHTML = timeFormat(HA,'hour') + ":" + timeFormat(HA,'minute') + ":" + timeFormat(HA,'second');
		  else if(haunit == "hadeg") document.getElementById('HA').innerHTML = Decimal_digit(String(HA*15),3);
		  else if(haunit == "hadms") document.getElementById('HA').innerHTML = timeFormat(HA*15,'hour') + ":" + timeFormat(HA*15,'minute') + ":" + timeFormat(HA*15,'second');
		}
		
	  //Altitude
		var sinH = Math.sin(latitude*Math.PI/180)*Math.sin(dec*Math.PI/180) + Math.cos(latitude*Math.PI/180)*Math.cos(dec*Math.PI/180)*Math.cos(HA*15*Math.PI/180);
		var altitude = Math.asin(sinH)*180/Math.PI;
		var altunit = document.getElementById('altunit').value;
		if(alt) {
		  if(altunit == "altdeg") document.getElementById('altitude').innerHTML = Decimal_digit(String(altitude),3);
		  else if(altunit == "altdms") document.getElementById('altitude').innerHTML = timeFormat(altitude,'hour') + ":" + timeFormat(altitude,'minute') + ":" + timeFormat(altitude,'second');;
		}

	  //Airmass
	    var secz = 1/(Math.sin(latitude*Math.PI/180)*Math.sin(dec*Math.PI/180) + Math.cos(latitude*Math.PI/180)*Math.cos(dec*Math.PI/180)*Math.cos(HA*Math.PI/180));
	    //var secz = 1/Math.cos((90 - altitude)*Math.PI/180);
		if(secz) document.getElementById('secz').innerHTML = Decimal_digit(String(secz),3); 

	  //Azimuth
		var cosA = (Math.sin(dec*Math.PI/180) - Math.sin(latitude*Math.PI/180)*Math.sin(altitude*Math.PI/180))/(Math.cos(latitude*Math.PI/180)*Math.cos(altitude*Math.PI/180));
		var A = Math.acos(cosA)*180/Math.PI;
		var sinHA = Math.sin(HA*15*Math.PI/180);
		if (sinHA < 0) var azimuth = A;
		else var azimuth = 360 - A;
		//alert(altitude);
		//azdeg = Math.floor(azimuth);
		//azmin = Math.floor((azimuth - azdeg)*60);
		//azsec = Math.floor(((azimuth - azdeg)*60 - azmin)*60);
		/*var tanY = Math.sin(HA*15*Math.PI/180);
		var tanX = Math.cos(HA*15*Math.PI/180)*Math.sin(latitude*Math.PI/180) - Math.tan(dec*Math.PI/180)*Math.cos(latitude*Math.PI/180);
		var tanA = tanY/tanX;
		var azimuth = Number(Math.atan(tanA)*180/Math.PI);
		//alert(azimuth + ' ' + tanY + ' ' + tanX);
		azimuth = tan_adjust(azimuth,tanY,tanX);*/
		var azunit = document.getElementById('azunit').value;
		if(az) {
		  if(azunit == "azdeg") document.getElementById('azimuth').innerHTML = Decimal_digit(String(azimuth),3);
		  else if(azunit == "azdms") document.getElementById('azimuth').innerHTML = timeFormat(azimuth,'hour') + ":" + timeFormat(azimuth,'minute') + ":" + timeFormat(azimuth,'second');;;
		}
		//alert('trans('+ this.parameter +')');
		timerID = setTimeout('trans('+ this.parameter +')',1000); 
	}
	
	Observation.prototype.stop = function() {
		clearTimeout(timerID);
	}

	Observation.prototype.reset = function() {
		//document.all.myForm.reset();
		document.getElementById('LT').innerHTML = ' ';
		document.getElementById('UT').innerHTML = ' ';
		document.getElementById('JD').innerHTML = ' ';
		document.getElementById('DT').innerHTML = ' ';
		document.getElementById('tanggal').innerHTML = ' ';
		document.getElementById('lst').innerHTML = ' ';
		document.getElementById('HA').innerHTML = ' ';
		document.getElementById('secz').innerHTML = ' ';
		document.getElementById('azimuth').innerHTML = ' ';
		document.getElementById('altitude').innerHTML = ' '; 
		document.getElementById('staticlog').innerHTML = '';
	}
	
	function trans() {
		//alert(arguments.length);
		var obs = new Observation();
		obs.start();
	}
	
	function checkTime(i) {
		if (i<10) 
			{i = "0" + i};
			return i;
	}

	function JulianDay(h, m, s, date, month, year, loc)
	{
		var h, m, s, month, year, loc, month2, year2;
		var date = date + ((h + m/60 + s/3600 - loc)/24);;
	   
		if ((month == 1)||(month == 2)) {
			year2 = year - 1;
			month2 = month + 12;
		}
		else {
			year2 = year;
			month2 = month;
		}
		var A = Math.floor(year2/100);
		if (year <= 1582) {
			var B = 0; 
		}
		else if ((year == 1582)&&(month <= 10)) { 
			var B = 0; 
		}
		else if ((year == 1582)&&(month == 10)&&(date <= 4)) { 
			var B = 0; 
		}
		else { B = 2 - A + Math.floor(A/4); }
		var JD = Math.floor(365.25*(year2 + 4716)) + Math.floor(30.6001*(month2 + 1)) + date + B - 1524.5;
		return JD;
	}

	function Decimal_digit(number,digit) {
		for (i=0;i<=number.length;i++)
		{
			if (number.charAt(i) == '.')
			{
				x = i + digit + 1;
				//document.write(number.slice(0,x));
				result = number.slice(0,x);
			}
		}
		return result;
	}

	function reduce(red,lim)  //adjust nilai dengan rentang 0 sampai 24
	{
		while (red < 0)  { red += lim; }
		while (red > lim) { red -= lim; }
		return red;
	}

  function getObject() {
    var id = document.getElementById('objectcategory').value;
    if(id == '-') return true;
    else if(id == 'none') {
      document.getElementById('onconstellation').innerHTML = '<input value="" class="obs" id="onmanual" />';
      document.getElementById('raHour').value = '';
      document.getElementById('raMin').value = '';
      document.getElementById('raSec').value = '';
      document.getElementById('decDeg').value = '';
      document.getElementById('decMin').value = '';
      document.getElementById('decSec').value = '';
    }
    else {
      var url = 'modules/observation/observation_ajax.php?id=' + id;
      var url = url + '&query=id';
      AJAX(url,false,false,'objectname');
    }
  }
  
  function getConstellation() {
    var urlC = 'modules/observation/observation_ajax.php?query=constellation';
    AJAX(urlC,false,false,'onconstellation');
    
  }
  
  function getFlamDes(constellation) {
    var url = 'modules/observation/observation_ajax.php?constellation= ' + constellation + 'query=flamdes';
    AJAX(url,false,false,'onflamdes');
  }
  
var logging = function(innit) {
  var staticlog = document.getElementById('staticlog');
  var logstatic = staticlog.innerHTML;
  var exec;
  
  if(innit == 'start') {
    //get Object properties
    var onmanual = document.getElementById('onmanual').value;
    var RA   = document.getElementById('raHour').value + " ";
        RA += document.getElementById('raMin').value + " ";
        RA += document.getElementById('raSec').value + " (hour min sec)";
    var Dec   = document.getElementById('decDeg').value + " ";
        Dec += document.getElementById('decMin').value + " ";
        Dec += document.getElementById('decSec').value + " (deg min sec)";
        
    //get Location properties
    var loc = document.getElementById('loc').value;
    var gmt = document.getElementById('gmt').value;
    var Longitude   = document.getElementById('dlong').value + " ";
        Longitude += document.getElementById('mlong').value + " ";
        Longitude += document.getElementById('slong').value + " (deg min sec)";
    var Latitude   = document.getElementById('dlat').value + " ";
        Latitude += document.getElementById('mlat').value + " ";
        Latitude += document.getElementById('slat').value + " (deg min sec)";
    
    //get Instrument properties
    var telescope = document.getElementById('telescope').value;
    var detector = document.getElementById('detector').value;
    var filter = document.getElementById('filter').value;
    var spectrograph = document.getElementById('spectrograph').value;
    
    //get Observer Properties
    var obsname = document.getElementById('obsname').value;
    var obsaddname = document.getElementById('obsaddname').value;
    var obsnote = document.getElementById('obsnote').value;
    
    //generates info
    var logvalue = 
      "Object<br />------<br/>Name : " +onmanual + "<br />&nbsp;&nbsp;RA : " + RA + "<br />&nbsp;Dec : " + Dec +"<br /><br />" +
      "Location<br />--------<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name : " +loc + "<br />&nbsp;Timezone : " + gmt + "<br />Longitude : " + Longitude +"<br />&nbsp;Latitude : " + Latitude +"<br /><br />" +
      "Instrument<br />----------<br/>&nbsp;&nbsp;&nbsp;Telescope : " +telescope + "<br />&nbsp;&nbsp;&nbsp;&nbsp;Detector : " + detector + "<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Filter : " + filter +"<br />Spectrograph : " + spectrograph +"<br /><br />" +
      "Observer<br />--------<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Observer : " +obsname + "<br />Add. Observer : " + obsaddname + "<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Note : " + obsnote +"<br /><br />" +
      "----------------------[BEGIN LOGGING]-------------------------<br />";
    
    // Change the button
    var buttonstart = document.getElementById("start");
    buttonstart.setAttribute("class","button2");
    buttonstart.setAttribute("id","stop");
    buttonstart.setAttribute("value","Stop!");
    buttonstart.setAttribute("onclick","obs.stop();logging('stop');");
    var buttonreset = document.getElementById("reset");
    buttonreset.setAttribute("type","hidden");
    logstatic = "";
    exec = true;
    
    //document.getElementById('command').innerHTML = 'feed me:';
    
  } else if(innit == 'log') {
    //log
    var log = document.getElementById('log');
    var date = document.getElementById('tanggal').innerHTML;
    var time = document.getElementById('LT').innerHTML;
    //alert(log.value.length)
    var logvalue = "[" + date + ", " + time + "]<br />" + countingCharacter(log.value) + "<br />";
    
    exec = (logstatic.length == 0) ? false : ((logstatic.indexOf("[END LOGGING]") == -1) ? true : false); 
    
    // Clear the form
    log.value = "";
    log.focus();
  } else if(innit == 'stop') {
    var logvalue = "-----------------------[END LOGGING]--------------------------";
    var buttonstart = document.getElementById("stop");
    buttonstart.setAttribute("class","");
    buttonstart.setAttribute("class","button");
    buttonstart.setAttribute("id","start");
    buttonstart.setAttribute("value","Start!");
    buttonstart.setAttribute("onclick","var obs = new Observation();obs.start();logging('start');");
    var buttonreset = document.getElementById("reset");
    buttonreset.setAttribute("type","reset");
    
    exec = true;
  } 

  if(exec) {
    staticlog.innerHTML = logstatic + "<br />" + logvalue;
  } else alert("Oops, can't feed me before the 'Start' button is pressed ^_^");
  //alert(logstatic.length)
  /*
  if(logstatic.length == 0) {  
    staticlog.innerHTML = "" + "<br />" + logvalue;
  } else {
    if (innit == 'stop') {
      staticlog.innerHTML = logstatic + "<br />" + logvalue;
    } else if(innit == 'start') {
      staticlog.innerHTML = "" + "<br />" + logvalue;
    } else alert("please engage the program first!");
  }
  */
  //displayLog();
  var sd = document.getElementById("scrolldown");
  sd.scrollTop = sd.scrollHeight;
}

var countingCharacter = function(str) {
  //var str = "thio loves lizzie, but he has to leave her soon. that's why he's so sad can't be able to see her again";
  var thio = str.split(' ');
  var implode = new Array();
  implode[0] = "";
  var i = 0;
  var j = 0;
  while(i < thio.length) {
    implode[j] += thio[i];
    if(implode[j].length > 50) {
      implode[j] += "<br />";
      j++;
      implode[j] = "";
    } else implode[j] += " ";
    i++;
  }
  var k = 0;
  var reconstruct = "";
  while(k <= j) {
    reconstruct += implode[k];
    k++;
  }
  return reconstruct;
  //alert("Please be patient, we are upgrading the system at the moment. thank you! <br />" + implode);
}   

// Heliocentric correction of Julian Date
var HJD = function(JD,a,d) {
  var a; //right ascension of object ((degree)
  var d; //declination of object (degree)
  var e = 23 + 27/60; //Obliquity of the ecliptic

  //Determine te relative Julian century 
  var T = (JD - 2415020)/36525;

  //Precision from 1950 to date
  var p = (1.396041 + 0.000308*(T + 0.5))*(T - 0.499998);

  //Obtain the mean solar longitude
  var L = 279.696678 + 36000.76892*T + 0.000303*T*T - p;

  //Obtain the 'mean solar anomaly'
  var G = 358.475833 + 35999.04975*T - 0.00015*T*T;

  //Obtain X and Y for 1950
  var X = 0.99986*Math.cos(L*Math.PI/180) 
        - 0.025127*Math.cos((G - L)*Math.PI/180)
        + 0.008374*Math.cos((G + L)*Math.PI/180)
        + 0.000105*Math.cos((2*G + L)*Math.PI/180) 
        + 0.000063*T*Math.cos((G - L)*Math.PI/180)
        + 0.000035*Math.cos((2*G - L)*Math.PI/180);
  var Y = 0.917308*Math.sin(L*Math.PI/180) 
        + 0.023053*Math.sin((G - L)*Math.PI/180)
        + 0.007683*Math.sin((G + L)*Math.PI/180)
        + 0.000097*Math.sin((2*G + L)*Math.PI/180)
        - 0.000057*T*Math.sin((G - L)*Math.PI/180)
        - 0.000032*Math.sin((2*G - L)*Math.PI/180);

  //Calculate delt
  var delt = -0.0057755*(Math.cos(d*Math.PI/180)*Math.cos(a*Math.PI/180)*X + (Math.tan(e*Math.PI/180)*Math.sin(d*Math.PI/180) + Math.cos(d*Math.PI/180)*Math.sin(a*Math.PI/180))*Y);

  //Determine correction heliocentric julian date
  return (JD + delt);
}

//alert(HJD(2441848.9861,301.8125,37.00556));

var precession = function() {
  //Paramter Input
  var a = 296.00607; // known right ascension (degree)
  var d = 10.497453; // known declination (degree)
  var t0 = 1953; //Equinox of the known coordinates (years)
  var tf = 1975; //Equinox to precess to (years)  

  var tm = (tf + t0)/2 - 1900;
  var m = 3.07234 + 0.00001863*tm;
  var ns = 1.336457 - 0.00000569*tm;
  var nii = 20.04685 - 0.0000853*tm;

  var dela = (m + ns*Math.tan(d*Math.PI/180)*Math.sin(a*Math.PI/180))*(tf - t0);
  var deld = nii*Math.cos(a*Math.PI/180)*(tf - t0);

  var aprec = a + dela/3600;
  var dprec = d + deld/3600;
  //document.write(aprec/15 + "<br />" +dprec);
}

var unitSelection = function() {
  document.getElementById(arguments[0] + 'unit').value = arguments[1];
}
//-->
