var AstroMath={isFloat:function(a){if(!(/^[-+]?\d*\.?\d*$/.test(a))||isNaN(parseFloat(a))){return false}else{return true}},isInteger:function(a){if(!(/^[-+]?\d+$/.test(a))||isNaN(parseInt(a))){return false}else{return true}},parseText:function(a){if(!this.isFloat(a)){alert("Please enter a decimal degree value.");return false}return true},isSexagesimal:function(a){if(a.match(/[:\s]+/)&&a.split(":").length==3){values=a.split(":");if(this.isFloat(values[0])&&this.isFloat(values[1])&&this.isFloat(values[2])){return true}return false}return false},isPosition:function(a){if(this.isSexagesimal(a)){return true}else{if(this.isFloat(a)){return true}}return false},raToDegrees:function(a){if(this.isSexagesimal(a)){hms=a.split(":");hours=hms[0];min=hms[1];sec=hms[2];degrees=(parseFloat(hours)*15)+(parseFloat(min)*15/60)+(parseFloat(sec)*15/(60*60));return degrees}else{if(this.isFloat(a)){return parseFloat(a)}}return null},decToDegrees:function(a){if(this.isSexagesimal(a)){damas=a.split(":");degree=parseFloat(damas[0]);arcmin=parseFloat(damas[1])/60;arcsec=parseFloat(damas[2])/(60*60);if(degree<0){return(degree-arcmin-arcsec)}else{return(degree+arcmin+arcsec)}}else{if(this.isFloat(a)){return parseFloat(a)}}return null},raInRange:function(a){if(a>=0&&a<=360){return true}return false},decInRange:function(a){if(a>=-90&&a<=90){return true}return false},radiansToDegree:function(a){return(180*a)/Math.PI}};var AstroString={textFormat:function(b){var a={success:false,explanation:"Expecting a non empty text, or without quotes (', \")."};b=this.trim(b);if(!(/^$|^(\w*['"]\w*)+$/.test(b))){a.success=true;a.explanation="text is OK"}return a},propIdFormat:function(c){var b={success:false,explanation:"Expecting prop_id to be in Y[YYY]%, YYYYS%, YYYYS-N[NNN]%, or YYYYS-NNNN format but found '"+c+"'."};var a=new Array("^\\d{1,4}%$","^\\d{4}[AaBbTt](-\\d{1,3}){0,1}%$","^\\d{4}[AaBbTt]-\\d{4}$");if((new RegExp(a.join("|"))).test(c)){b.success=true;b.explanation="prop_id is OK"}return b},startDateFormat:function(b){var a={success:false,explanation:"Expecting date to be in YYYY%, YYYY-M%, or YYYY-MM-DD format but found '"+b+"'."};if(b.search(/%/)!=-1){var c=new Array("^\\d{1,4}%$","^\\d{4}(-\\d{1,2}){0,1}%$","^\\d{4}-\\d{2}(-\\d{1}){0,1}%$");if((new RegExp(c.join("|"))).test(b)){a.success=true;a.explanation="startDate is OK"}}else{a=this.dateFormat(b,a.explanation)}return a},dateObsFormat:function(b){var a={success:false,explanation:"Expecting date to be in YYYY%, YYYY-M%, YYYY-MM-DD% or YYYY-MM-DDThh:mm:ss format but found '"+b+"'."};if(b.search(/%/)!=-1){var c=new Array("^\\d{1,4}%$","^\\d{4}(-\\d{1,2}){0,1}%$","^\\d{4}-\\d{2}(-\\d{1}){0,1}%$","^\\d{4}-\\d{2}-\\d{2}(T\\d{1,2}){0,1}%$","^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{1,2}){0,1}%$");if((new RegExp(c.join("|"))).test(b)){a.success=true;a.explanation="date_obs is OK"}}else{if(/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}.?\d*){0,1}$/.test(b)){if(b.search(/T/)!=-1){dateTimeArray=b.split("T");a=this.dateFormat(dateTimeArray[0],a.explanation);if(a.success){a.success=false;a.explanation="Expecting date to be in YYYY%, YYYY-M%, YYYY-MM-DD% or YYYY-MM-DDThh:mm:ss format but found '"+b+"'.";a=this.timeFormat(dateTimeArray[1],a.explanation)}}else{a=this.dateFormat(b,a.explanation)}}}return a},dateFormat:function(c,b){if(typeof b=="undefined"||b==""){b="Expecting date to be in YYYY-MM-DD format but found '"+c+"'."}var a={success:false,explanation:b};if(/^\d{4}-\d{2}-\d{2}$/.test(c)){dateArray=c.split("-");if(dateArray.length>0){year=month=day=null;if(typeof dateArray[0]!="undefined"){year=parseInt(dateArray[0])}if(typeof dateArray[1]!="undefined"){month=parseInt(dateArray[1].replace(/^0/,""))}if(typeof dateArray[2]!="undefined"){day=parseInt(dateArray[2].replace(/^0/,""))}if(year&&!(year>=1970&&year<=(new Date()).getFullYear())){a.success=false;a.explanation="Please make sure year is between 1970 and current year";return a}if(month&&!(month>=1&&month<=12)){a.success=false;a.explanation="Please make sure month is between 01 and 12";return a}monthDayArray=new Array(31,28,31,30,31,30,31,31,30,31,30,31);if(month==2&&(year%4==0&&(year%100!=0||year%400==0))){monthDayArray[1]=29}if(day&&!(day>=1&&day<=monthDayArray[month-1])){a.success=false;a.explanation="Please make sure day is between 01 and "+monthDayArray[month-1];return a}a.success=true;a.explanation="Date is OK"}}return a},timeFormat:function(b,c){if(typeof c=="undefined"||c==""){c="Expecting time to be in hh:mm:ss format but found '"+b+"'."}var a={success:false,explanation:c};if(/^\d{2}:\d{2}:\d{2}.?\d*$/.test(b)){timeArray=b.split(":");if(timeArray.length>0){hour=min=sec=null;if(typeof timeArray[0]!="undefined"){hour=parseInt(timeArray[0].replace(/^0/,""))}if(typeof timeArray[1]!="undefined"){min=parseInt(timeArray[1].replace(/^0/,""))}if(typeof timeArray[2]!="undefined"){sec=parseFloat(timeArray[2].replace(/^0/,""))}if(hour&&!(hour>=0&&hour<=24)){a.success=false;a.explanation="Please make sure hour is between 0 and 24";return a}if(min&&!(min>=0&&min<=59)){a.success=false;a.explanation="Please make sure minutes is between 0 and 59";return a}if(sec&&!(sec>=0&&sec<=59.999999999999)){a.success=false;a.explanation="Please make sure seconds is between 0 and 59";return a}if(hour==24&&!(min==0&&sec==0)){a.success=false;a.explanation="Please make sure minutes and seconds equals 0";return a}a.success=true;a.explanation="Time is OK"}}return a},trim:function(a){a=a.replace(/^\s+/g,"");return a.replace(/\s+$/g,"")}};var AstroCoordValidations={coordinateSpec:function(f){var e=[];var b=this.fieldSeparators(f,[1,2]);if(b.success){var a=b.results;var d=a[0];var g=a[1];var c=a[2];b=this.raFormat((d||"").strip());if(b.success){e[0]=b.results;b=this.decFormat((g||"").strip())}if(b.success){e[1]=b.results;if(c!=null){b=this.dateFormat(c.strip());if(b.success){e[2]=b.results}}}}if(b.success){b.results=e}return b},coordinateListSpec:function(c){var b=[];var a=1;c.strip().split(/\n+/).each(function(e){var d=AstroCoordValidations.coordinateSpec(e);if(!d.success){d.explanation="Line "+a+": "+d.explanation}b.push(d);a++});return b},fieldSeparators:function(e,d){var b=e.split(/\s*,\s*/);var a={};if(d.include(b.length-1)){a.success=true;a.results=b}else{a.success=false;var c=d.pop();a.explanation="Expecting "+d.join(", ")+" or "+c+" commas (i.e. 14:39:60, -35:30:00 or 14:39:60, -35:30:00, 2005-02-02) but found "+(b.length-1)+"."}return a},raFormat:function(b){var a={};if(b.indexOf(":")==-1){a=this.raAsDecimal(b)}else{a=this.raAsSexagesimal(b)}return a},decFormat:function(b){var a={};if(b.indexOf(":")==-1){a=this.decAsDecimal(b)}else{a=this.decAsSexagesimal(b)}return a},dateFormat:function(b){var a={};if(/^\d\d\d\d-\d\d-\d\d$/.test(b)){a.success=true;a.results=b}else{a.success=false;a.explanation="Expecting date to be in YYYY-MM-DD format but found '"+b+"'."}return a},raAsDecimal:function(b){var a={};if(AstroMath.isFloat(b)){var c=parseFloat(b);if(AstroMath.raInRange(c)){a.success=true;a.results=c}else{a.success=false;a.explanation="Expecting RA to be between 0 and 360 degrees but found "+c+" degrees."}}else{a.success=false;a.explanation="Expecting RA to be in decimal format (i.e. 14.2) but found '"+b+"'."}return a},decAsDecimal:function(c){var a={};if(AstroMath.isFloat(c)){var b=parseFloat(c);if(AstroMath.decInRange(b)){a.success=true;a.results=b}else{a.success=false;a.explanation="Expecting Dec to be between -90 and 90 degrees but found "+b+" degrees."}}else{a.success=false;a.explanation="Expecting Dec to be in decimal format (i.e. 14.2) but found '"+c+"'."}return a},raAsSexagesimal:function(f){var j={};var i=f.split(":");if(i.length==3){j.success=true;j.results=i}else{j.success=false;j.explanation="Expecting 2 colons in a sexagesimal RA (i.e. 14:39:60.1) but found "+(i.length-1)+"."}if(j.success){var a=i[0];var b=i[1];var c=i[2];var d;var e;var h;if(!AstroMath.isInteger(a)){j.success=false;j.explanation="Expecting hours of RA to be an integer (i.e. 15) but found '"+a+"'."}else{d=parseInt(a);if(d<0||d>24){j.success=false;j.explanation="Expecting hours of RA to be between 0 and 24 but found "+d+"."}else{j.success=true}}if(j.success){if(!AstroMath.isInteger(b)){j.success=false;j.explanation="Expecting minutes of RA to be an integer (i.e. 49) but found '"+b+"'."}else{e=parseInt(b);if(e<0||e>=60){j.success=false;j.explanation="Expecting minutes of RA to be between 0 and 59 but found "+e+"."}else{j.success=true}}}if(j.success){if(!AstroMath.isFloat(c)){j.success=false;j.explanation="Expecting seconds of RA to be a floating number (i.e. 32.1) but found '"+c+"'."}else{h=parseFloat(c);if(h<0||h>=60){j.success=false;j.explanation="Expecting seconds of RA to be between 0.0 and 59.9 but found "+h+"."}else{j.success=true}}}if(j.success){j.results=[d,e,h]}}if(j.success){var g=(j.results[0]*15)+(j.results[1]*15/60)+(j.results[2]*15/(60*60));if(AstroMath.raInRange(g)){j.success=true;j.results=g.toFixed(3)}else{j.success=false;j.explanation="Expecting RA to be between 0 and 360 degrees but found "+g+"."}}return j},decAsSexagesimal:function(i){var m={};var g=i.split(":");if(g.length==3){m.success=true;m.results=g}else{m.success=false;m.explanation="Expecting 2 colons in a sexagesimal Dec (i.e. 35:30:0.1) but found "+(g.length-1)+"."}if(m.success){var h=g[0];var c=g[1];var d=g[2];var k;var f;var l;if(!AstroMath.isInteger(h)){m.success=false;m.explanation="Expecting degrees of Dec to be an integer (i.e. 15) but found '"+h+"'."}else{k=parseInt(h);if(k<-90||k>90){m.success=false;m.explanation="Expecting degrees of Dec to be between -90 and 90 but found "+k+"."}else{m.success=true}}if(m.success){if(!AstroMath.isInteger(c)){m.success=false;m.explanation="Expecting arcminutes of Dec to be an integer (i.e. 49) but found '"+c+"'."}else{f=parseInt(c);if(f<0||f>=60){m.success=false;m.explanation="Expecting arcminutes of Dec to be between 0 and 59 but found "+f+"."}else{m.success=true}}}if(m.success){if(!AstroMath.isFloat(d)){m.success=false;m.explanation="Expecting arcseconds of Dec to be a floating number (i.e. 32.1) but found '"+d+"'."}else{l=parseFloat(d);if(l<0||l>=60){m.success=false;m.explanation="Expecting arcseconds of Dec to be between 0.0 and 59.9 but found "+l+"."}else{m.success=true}}}if(m.success){m.results=[k,f,l]}}if(m.success){var b=m.results[0];var e=m.results[1]/60;var j=m.results[2]/(60*60);var a;if(b<0){a=(b-e-j)}else{a=(b+e+j)}if(AstroMath.decInRange(a)){m.success=true;m.results=a.toFixed(3)}else{m.success=false;m.explanation="Expecting Dec to be between -90 and 90 degrees but found "+a+"."}}return m}};