using System;
	using System.IO;
	using System.Text;
	using System.Text.RegularExpressions;
	using System.Collections;
	using System.Xml;
	using System.Threading;
	using System.Net;
	using System.Web;
	using DotNetWikiBot;


	class MyBot : Bot
	{
			static StringBuilder sb  = new StringBuilder();
			static byte[]        buf = new byte[8192];
			static int count;
			static string tempString;
			private static string getPage(string url)
			{
					HttpWebRequest  request  = (HttpWebRequest)WebRequest.Create(url);
					HttpWebResponse response = (HttpWebResponse)request.GetResponse();
					Stream resStream = response.GetResponseStream();
					sb.Length = 0;
					tempString = null;
					count      = 0;
					do
					{
							count = resStream.Read(buf, 0, buf.Length);
							if (count != 0)
							{
									tempString = Encoding.UTF8.GetString(buf, 0, count);
									sb.Append(tempString);
							}
					}
					while (count > 0);
					return sb.ToString();
			}
			private static string getURLPost(string uri, string parameters)
			{
					WebRequest webRequest   = WebRequest.Create (uri);
					byte[]     bytes        = Encoding.ASCII.GetBytes (parameters);
					Stream     outputStream = null;

					webRequest.Method      = "POST";
					webRequest.ContentType = "application/x-www-form-urlencoded";

					try
					{
							webRequest.ContentLength = bytes.Length;
							outputStream = webRequest.GetRequestStream();
							outputStream.Write(bytes, 0, bytes.Length);
					}
					catch (WebException ex)
					{
							Console.WriteLine(ex.Message +  "Error with request!");
					}
					finally
					{
							if (outputStream != null)
									outputStream.Close();
					}

					try
					{
							WebResponse webResponse = webRequest.GetResponse();
							if (webResponse == null) 
									return null;
							StreamReader myStreamReader = new StreamReader(webResponse.GetResponseStream());
							return myStreamReader.ReadToEnd().Trim();
					}
					catch (WebException ex)
					{
							Console.WriteLine(ex.Message + "Error with response!");
					}
					return null;
			}
			private static string avrunda(string siffra, string sigma)
			{
				siffra = siffra.Replace(".", ",");
				sigma = sigma.Replace(".", ",");
				if(siffra.IndexOf("<br>") != -1)
					siffra = siffra.Substring(0, siffra.IndexOf("<br>"));
				double en = double.Parse(siffra);
				double edn = 0;
				if(sigma.IndexOf("<br>") != -1)
					sigma = sigma.Substring(0, sigma.IndexOf("<br>"));
				if(sigma != "n/a")
					edn = double.Parse(sigma);
				else
					edn = en/1000;
				double l = Math.Round(Math.Log10(edn));
				en = Math.Round(en*Math.Pow(10, -l))/Math.Pow(10, -l);
				return en.ToString();
			}
			private static string au(string siffra, string sigma)
			{
				siffra = siffra.Replace(".", ",");
				sigma = sigma.Replace(".", ",");
				string h = avrunda(siffra, sigma);
				int l = h.Replace(",", "").Length;
				double km = double.Parse(siffra)*149597870.691;
				string k = km.ToString();
				double skm = 0;
				string sk = "";
				if(sigma != "n/a")
				{
					skm = double.Parse(sigma)*149597870.691;
					sk = skm.ToString();
				}
				else
					sk = sigma;
				return avrunda(k, sk);
			}
			private static string enkel(string kod, string src)
			{
				src = src.Substring(src.IndexOf("sbdb_help.cgi?name="+kod));
				src = src.Substring(src.IndexOf("size=\"2\">")+9);
				string e = "0"+src.Substring(0,src.IndexOf("</font>"));
				src = src.Substring(src.IndexOf("size=\"2\">")+9);
				string ed = src.Substring(0,src.IndexOf("</font>"));
				return  avrunda(e, ed);
			}
			private static string enkel2(string kod, string src)
			{
				if(src.IndexOf("sbdb_help.cgi?name="+kod) != -1)
				{
					src = src.Substring(src.IndexOf("sbdb_help.cgi?name="+kod));
					src = src.Substring(src.IndexOf("size=\"2\">")+9);
					string e = "0"+src.Substring(0,src.IndexOf("</font>"));
					src = src.Substring(src.IndexOf("size=\"2\">")+9);
					src = src.Substring(src.IndexOf("size=\"2\">")+9);
					string ed = src.Substring(0,src.IndexOf("</font>"));
					return ed;
				}
				else
					return "";
			}
			
			private static string knepigare1(string kod, string src)
			{
				src = src.Substring(src.IndexOf("sbdb_help.cgi?name="+kod));
				src = src.Substring(src.IndexOf("size=\"2\">")+9);
				string a = "0"+src.Substring(0,src.IndexOf("</font>"));
				src = src.Substring(src.IndexOf("size=\"2\">")+9);
				string ed = src.Substring(0,src.IndexOf("</font>"));
				return  avrunda(a, ed);
			}
			private static string knepigare2(string kod, string src)
			{
				src = src.Substring(src.IndexOf("sbdb_help.cgi?name="+kod));
				src = src.Substring(src.IndexOf("size=\"2\">")+9);
				string a = "0"+src.Substring(0,src.IndexOf("</font>"));
				src = src.Substring(src.IndexOf("size=\"2\">")+9);
				string ed = src.Substring(0,src.IndexOf("</font>"));
				return  au(a, ed);
			}
			
			private static string tusen(string value)
			{
				if(value.IndexOf(",")!=-1)
					value=value.Substring(0, value.IndexOf(","));
				string value1 = value;
				if(value.Length > 3)
				{
					string def = value.Substring(0,value.Length-3);
					string hepp = value.Substring(value.Length-3);
					value1 = tusen(def)+" "+hepp;
				}
				return value1;
			}
			/**/
		public static void Main()
		{
			DateTime time = DateTime.Now;
			string datum = String.Format("{0:d MMMMMMMMMM yyyy}", time);
			bool okToRun = true;
			string r = File.ReadAllText("Räknare.txt");
			string str = "http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=";
				int r1 = int.Parse(r)+1;
			r = r1.ToString();
			str = str + r;
			string arkiv = "";
			
			string tmpStr = getURLPost("http://www.webcitation.org/archive.php", "url=" + str + "&email=la.vallen@yahoo.se");
			arkiv = "http://"+tmpStr.Substring(tmpStr.IndexOf("An archive of this page should shortly be available at </p><br /><p>") + 83, 29);	
			if(!arkiv.StartsWith("http://www.webcitation.org"))
				okToRun = false;
			/**/
			if(okToRun)
			{
				string src = getPage(str);
			
				src = src.Substring(src.IndexOf("<!-- START OF PAGE CONTENT -->"));
			
				//Hämtar namnet på kroppen
				src = src.Substring(src.IndexOf("<table bgcolor="));
				src = src.Substring(src.IndexOf("<font face="));
				src = src.Substring(src.IndexOf("<b>")+3);
				string titel = src.Substring(0,src.IndexOf("</b>"));

				string kod = "";
				string namn = titel;
				if(titel.IndexOf("(") != -1)
				{
					namn = titel.Substring(0,titel.IndexOf("(")).Trim();
					kod = titel.Substring(titel.IndexOf("(")+1);
					kod = kod.Substring(0,kod.IndexOf(")"));
				}
				if(namn == r)
					namn = "";
				if(titel.IndexOf(" ") != -1)
					titel = titel.Substring(titel.IndexOf(" ")).Trim();
				//Hämtar klassifikation
				src = src.Substring(src.IndexOf("<b>Classification:</b>"));
				string klass = src.Substring(0,src.IndexOf("</a></font>"));
				klass = klass.Substring(klass.LastIndexOf(">")+1);
				klass = klass.Replace("Amor", "[[Amor-asteroid]]");
				klass = klass.Replace("Main-belt Asteroid", "[[Asteroidbältet]]");
				bool neo = false;
				bool pha = false;
			
				if(src.Substring(0,300).IndexOf("NEO") != -1)
					neo = true;
				if(src.Substring(0,300).IndexOf("PHA") != -1)
					pha = true;
				
				//Hämtar Epoken
				src = src.Substring(src.IndexOf("Orbital Elements at Epoch"));
				src = src.Substring(src.IndexOf("(")+1);
				string epok = src.Substring(0, src.IndexOf(")"));
				if(epok.IndexOf(".")!= -1)
					epok = epok.Substring(0, epok.IndexOf("."));
				epok = String.Format("{0:d MMMMMMMMMM yyyy}", DateTime.Parse(epok));

			
				//Hämtar 'e'
				string e = enkel("e", src);
			
				//Hämtar 'a'
				string akm = knepigare2("a", src);
				string a = knepigare1("a", src);
				akm = tusen(akm);
				
				
				//Hämtar 'q'
				string qkm = knepigare2("q", src);
				string q = knepigare1("q", src);
				qkm = tusen(qkm);
			
				//Hämtar 'i'
				string ii = enkel("i", src);
			
				//Hämtar 'node'
				string node = enkel("om", src);
			
				//Hämtar 'peri'
				string peri = enkel("w", src);

				//Hämtar 'M'
				string M = enkel("ma", src);

				//Hämtar 'per'
				string per = enkel("per", src);
				per = tusen(per.Substring(0,per.IndexOf(",")))+per.Substring(per.IndexOf(","));
				src = src.Substring(src.IndexOf("sbdb_help.cgi?name=per"));
				src = src.Substring(src.IndexOf("size=\"2\">")+9);
				src = src.Substring(src.IndexOf("<br>")+4);
				string y = src.Substring(0,src.IndexOf("</font>"));
				y = y.Replace(".", ",");
				double v1 = double.Parse(a)*149597870.691*3.1415927*2/double.Parse(y)/365.25/24/3600;
				string v = v1.ToString();
				v = v.Substring(0, v.IndexOf(",")+4);
				Console.WriteLine(v);
				
				//Hämtar 'Q'
				string Qkm = knepigare2("ad", src);
				string Q = knepigare1("ad", src);
				Qkm = tusen(Qkm);
			
				//Hämtar 'H'
				string H = enkel2("H", src);
				H = H.Replace(".", ",");
			
				//Hämtar alternate designation
				string alt = "";
				if(src.IndexOf("<b>Alternate Designations</b>") != -1)
				{
					src = src.Substring(src.IndexOf("<b>Alternate Designations</b>"));
					src = src.Substring(src.IndexOf("size=\"2\">")+9);
					string s = src.Substring(0,src.IndexOf("</font>"));
					s = s.Replace(" ","");
					s = s.Replace("<b>","'''");
					s = s.Replace("</b>","'''");
					string [] alta = s.Split('=');
					foreach(string s3 in alta)
					{
						string s2 = s3.Trim();
						s2 = s2.Replace(" ", " ");
						alt = alt + s2+", ";
					}
					alt = alt.Substring(0, alt.Length -2);
				}
				if(neo)
					klass = klass+"<br>[[Jordnära objekt]]";
				if(pha)
					klass = klass+"<br>[[Potentiellt farliga objekt]]";
					
				//"[[NASA]] [[Jet Propulsion Laboratory|JPL]] Small-Body Database Browser on"
				
				Site site = new Site("http://sv.wikipedia.org", "Innocent bot", "********");
				string title = namn;
				if(titel == "")
					title = kod;
				Page p = new Page(site, title);
				p.Load();
				File.WriteAllText("prefe.txt", p.text);
				if(p.Exists())
				{
					if(p.text.ToLower().Trim().StartsWith("#omdirigering") || p.text.ToLower().Trim().StartsWith("#redirect"))
					{
						string s = p.text.Substring(p.text.IndexOf("[[")+2);
						s = s.Substring(0, s.IndexOf("]]")).Trim();
						p.title = s;
						p.Load();
						File.WriteAllText("prefe.txt", p.text);
					}
					string referens = "<ref name=\"JPL\">{{Webbref|url=http://ssd.jpl.nasa.gov/sbdb.cgi?sstr="+r+"|titel=JPL Small-Body Database Browser on "+titel+"|utgivare=[[NASA]], [[Jet Propulsion Laboratory|JPL]]|språk=engelska|";
					if(arkiv != "")
						referens = referens + "arkivurl="+arkiv+"|arkivdatum="+datum+"|";
					referens = referens + "hämtdatum="+datum+"}}</ref>";
					string texten = p.text;
					if(Mallhantering.finnsmallen(texten, "Infobox planet"))
					{
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "omloppsbana_ref", referens);
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "mp_namn", namn);
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "mp_kategori", klass);
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "epok", epok);
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "alt_namn", alt);
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "namn", titel);
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "aphelium", Q+" [[Astronomisk enhet|AU]]<br />"+Qkm+" [[Kilometer|km]]");
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "perihelium", q+" AU<br />"+qkm+" km");
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "halv_storaxel", a+" AU<br />"+akm+" km");
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "excentricitet", e);
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "period", per+" d ("+y+" år)");
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "medelhastighet", v+" km/s");
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "inklination", ii+"°");
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "uppst_nod", node+"°");
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "medelanomali", M+"°");
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "peri_arg", peri+"°");
						texten = Mallhantering.sättvärde(texten, "Infobox planet", 0, "abs_magnitud", H);
						Bot.editComment = "Uppdaterar banelement mm från [[Jet Propulsion Laboratory|JPL]] med arkivurl.";
						if(arkiv == "")
							Bot.editComment = "Uppdaterar banelement mm från [[Jet Propulsion Laboratory|JPL]].";
						Bot.isMinorEdit = true;
						p.text = texten;
						p.Save();
							Console.WriteLine(texten);
					}
				}
			}
		}
		
	}