var Global_REF_NUM_TYPE = new Array();
var Global_LISTNER_COUNTER = 0;
var Global_QUERY_STATE_ERROR = "ERROR"
var Global_QUERY_STATE_START = "PROCESSING"
var Global_QUERY_STATE_OK = "OK"

var Global_Abort_Check = false;


Global_REF_NUM_TYPE[0] = ""
Global_REF_NUM_TYPE[1] = "Registration"
Global_REF_NUM_TYPE[2] = "C&L notification"
Global_REF_NUM_TYPE[3] = "Substance in article notification"
Global_REF_NUM_TYPE[4] = "PPORD notification"
Global_REF_NUM_TYPE[5] = "Pre-registration"
Global_REF_NUM_TYPE[6] = "Inquiry prior to registration"
Global_REF_NUM_TYPE[7] = "On-site isolated intermediates*"
Global_REF_NUM_TYPE[8] = "Transported on-site isolated intermediates*"
Global_REF_NUM_TYPE[9] = "Data holder notification"

Global_REF_NUM_TYPE[10] = "Downstream user notification"
Global_REF_NUM_TYPE[11] = "Application for Authorisation"
Global_REF_NUM_TYPE[12] = "Substance Evaluation"
Global_REF_NUM_TYPE[13] = "Annex XV – C&L Harmonization"
Global_REF_NUM_TYPE[14] = "Annex XV – Authorisation"
Global_REF_NUM_TYPE[15] = "Annex XV – Restriction"
Global_REF_NUM_TYPE[16] = "Internal usage"

Global_REF_NUM_TYPE[17] = "Late Pre-registration"



function ResetListenerCounter() {Global_LISTNER_COUNTER =0;}
function GetListenerCount() { return Global_LISTNER_COUNTER}
function IncrementListenerCounter() { return ++Global_LISTNER_COUNTER;}



function  AbortCheckNumber()
{
	Global_Abort_Check = true;
}


function FetchRefNumberTypeText(TYPE)
{
	var Index = parseInt(TYPE,10)
	return (isNaN(Index)) ? "" :  Global_REF_NUM_TYPE[Index]
}

////////////////////////////////////////////
//
////////////////////////////////////////////
function CheckerTokenClass(InputString, Functor)
{
	this.HasCar = false;
	this.IntegerString = "";
	this.CharString = "";
	this.InitialValue = InputString;
	this.ParsedToken = "";
	this.Pattern = "";
	this.DigitsOnly = true;
	this.Error = false;
	this.Functor = Functor;
	
	this.TYPE="";
	this.BASE_NUMBER="";
	this.CHECKSUM="";
	this.INDEX_NUMBER="";
	
	Functor(this);
}


////////////////////////////////////////////
//
////////////////////////////////////////////
function IsChar(Char)
{
	return ( 
			((Char.charCodeAt(0) >= 65) && (Char.charCodeAt(0) <= 90)) ||
			((Char.charCodeAt(0) >= 97) && (Char.charCodeAt(0) <= 122)) 
		  );

}

////////////////////////////////////////////
//
////////////////////////////////////////////
function IsDigit(Char)
{
	return ((Char.charCodeAt(0) >= 48) && (Char.charCodeAt(0) <= 57));
}


////////////////////////////////////////////
//
////////////////////////////////////////////
function Parse_RefNumber_Fct(token)
{
	var Char="";
	for (var i=0; i< token.InitialValue.length; i++)
	{
		Char = token.InitialValue.charAt(i);
		if (IsDigit(Char))
		{
			token.IntegerString =  token.IntegerString + Char ;
		}
		else if (IsChar(Char))
		{
			token.HasCar = true;
			token.DigitsOnly = false;
			token.CharString =  token.CharString + Char ;
		}
		
		if (IsDigit(Char) || Char == '-')
		{
			token.Pattern =  token.Pattern + Char ;
		}

	}
	
	var Len = token.IntegerString.length;
	LeadDigit = parseInt(token.IntegerString.charAt(0));
	
	if (Len != 18)
	{
		token.Error = true;
	}
	else
	{
		for (var i=0; i< Len; i++)
		{
			Char = token.IntegerString.charAt(i);
			
			if ((i>=0) && (i<=1))
			{
				token.TYPE += Char
			}
			else if ((i>=2) && (i<=11))
			{
				token.BASE_NUMBER += Char
			}
			else if ((i>=12) && (i<=13))
			{
				token.CHECKSUM += Char
			}
			else if ((i>=14) && (i<=17))
			{
				token.INDEX_NUMBER += Char
			}
			token.ParsedToken += Char 
			if ((i==1) || (i==11) || (i==13)) {token.ParsedToken += '-'}
		}

		if ( ! token.Error)
		{
			var Int_Type_Value = parseInt(token.TYPE.replace(/^0+/g, ''))  // remove leading zeros
			if (
				(Int_Type_Value < 1) ||
				(Int_Type_Value > 17) 
		   	)
			{
				token.Error = true;
			}
		}

	}
	
	/*
	if (token.INDEX_NUMBER != "0000")  // In the early process step only - need to be deactivated at a later time
	{
		token.Error = true;
	}
	*/
}


////////////////////////////////////////////
//
////////////////////////////////////////////
function CheckerTrimString (str) {
  return str.replace(/^\s+/g, '').replace(/\s+$/g, '');
}



////////////////////////////////////////////
//
////////////////////////////////////////////
function ParseRefNumber(Form, RefNumber)
{
	if (Form)
	{
		/////if (GetListenerCount() > 0 ){alert (GetListenerCount()); return false;} // Query in process
		RefNumberChecker = CheckerTrimString (RefNumber)
		if (!RefNumberChecker) {CheckerSetStatus(Form, "", 0); return false;}
		var REFNUM_Token = new CheckerTokenClass(RefNumber, Parse_RefNumber_Fct);
		
		if (REFNUM_Token.Error)
		{
			CheckerSetStatus(Form, "INVALID", -1)
		}
		else
		{
			var InputRefNumMember = document.getElementById('blands_input_ref_number');
			InputRefNumMember.value = REFNUM_Token.ParsedToken // assign correct structure
			CheckerSetStatus(Form, "", 0)  // default state
		}
		
		return REFNUM_Token
	}
	else
	{
		alert("Form not found");
	}
}

////////////////////////////////////////////
//
////////////////////////////////////////////
function CheckRefNumber(Form, RefNumber)
{
	if (Form)
	{
		RefNumberChecker = CheckerTrimString (RefNumber)
		if (!RefNumberChecker) return;
		var REFNUM_Token = ParseRefNumber(Form, RefNumber);
		if (!REFNUM_Token) return false;
		if (REFNUM_Token.Error) return false;
		
		var ReferenceNumber = REFNUM_Token.ParsedToken
		var TYPE= REFNUM_Token.TYPE
		var BASE_NUMBER= REFNUM_Token.BASE_NUMBER
		var CHECKSUM= REFNUM_Token.CHECKSUM
		var INDEX_NUMBER= REFNUM_Token.INDEX_NUMBER
		var CheckSumFct = "EvaluateCHECKSUM" +"(" + "'" + ReferenceNumber + "'" + ',' + "'" + TYPE + "'"  + ',' + "'" + BASE_NUMBER + "'" + ',' + "'" + CHECKSUM + "'" + ',' + "'" + INDEX_NUMBER+ "'" +")";
		setTimeout(CheckSumFct,10);
	}
	else
	{
		alert("Form not found");
	}
	
}


////////////////////////////////////////////
//
////////////////////////////////////////////
function SetCheckerStatusBkgColor(Node, ColorMode)
{
		switch (ColorMode)
		{
			case -1:
			{
				Node.style.background="#FC1B1B";  // Error
			}
			break;
			case 0:
			{
				Node.style.background="#CCD9FF";  // Default
			}
			break;
			case 1:
			{
				Node.style.background="#FFFF00"; // Registration
			}
			break;
			case 2:
			{
				Node.style.background="#CC99CC"; // C&L notification
			}
			break;
			case 3:
			{
				Node.style.background="#CC00CC";  // Substance in article notification
			}
			break;
			case 4:
			{
				Node.style.background="#FF9999";  // PPORD notification
			}
			break;
			case 5:
			{
				Node.style.background="#33FF33";  // Pre-registration 
			}
			break;
			case 6:
			{
				Node.style.background="#CCFF33";  // Inquiry prior to registration
			}
			break;
			case 7:
			{
				Node.style.background="#FFCC33";  // On-site isolated intermediates
			}
			break;
			case 8:
			{
				Node.style.background="#FF9900";  // Transported on-site isolated intermediates
			}
			break;
			case 9:
			{
				Node.style.background="#0066FF";  // Data holder notification
			}
			break;
			case 10:
			{
				Node.style.background="#CCFFFF";  // Downstream User notification
			}
			break;
			case 11:
			{
				Node.style.background="#FF0099";  // Application for Authorisation
			}
			break;
			case 12:
			{
				Node.style.background="#BFE2FF";  // Substance Evaluation
			}
			break;
			case 13:
			{
				Node.style.background="#9900CC";  // Annex XV – C&L Harmonization
			}
			break;
			case 14:
			{
				Node.style.background="#FF0033";  // Annex XV – Authorisation
			}
			break;
			case 15:
			{
				Node.style.background="#CC0066";  // Annex XV – Restriction
			}
			break;
			case 16:
			{
				Node.style.background="#999999";  // Internal usage
			}
			break;
			case 17:
			{
				Node.style.background="#00FF99";  // Late Pre-registration 
			}
			break;
			default:		
		}
}


////////////////////////////////////////////
//
////////////////////////////////////////////
function ChangeFRServer(Base)
{
	var Location = window.location.href
	if(Location.indexOf(Base) != -1)
	{
		window.location.href = 'http://www.reach-compliance.eu/french/index.html#TopCheck'
	}
}

////////////////////////////////////////////
//
////////////////////////////////////////////
function CheckerSetStatus(Form, Message, Level)
{
	var StatusMember = document.getElementById('blands_input_check_status');
	SetCheckerStatusBkgColor(StatusMember, Level)
 	StatusMember.value =  Message;
}


function EvaluateCHECKSUM(ReferenceNumber,TYPE,BASE_NUMBER,CHECKSUM,INDEX_NUMBER)
{
	var FctArgs = "(" + "'" + ReferenceNumber + "'" + ',' + "'" + TYPE + "'"  + ',' + "'" + BASE_NUMBER + "'" + ',' + "'" + CHECKSUM + "'" + ',' + "'" + INDEX_NUMBER+ "'" +")";
	var ListenerFct = "ListenerReferenceNumber" + FctArgs;
	var VerifyCHECKSUMFct = "VerifyCHECKSUM" + FctArgs;
	ResetListenerCounter()
	CheckerSetStatus(null, "Processing...", 0);
	var StatusMember = document.getElementById('blands_input_check_status');
	//SetCookie ("EvalRefNumber", Global_QUERY_STATE_START, null, "/");
	//var QueryStatus = GetCookie ("EvalRefNumber");
	Global_Abort_Check = false;
	setTimeout(ListenerFct,5000);
	setTimeout(VerifyCHECKSUMFct,0);
}



function ListenerReferenceNumber(ReferenceNumber,TYPE,BASE_NUMBER,CHECKSUM,INDEX_NUMBER)
{
	var PERIOD = 100 // milliseconds
	var MAX_WAIT = 0.5 // minutes
	var MAX_COUNT = Math.round((1000 * 60*MAX_WAIT) / PERIOD)
	var ListeningCounts = IncrementListenerCounter();
	var ListenerFct = "ListenerReferenceNumber" +"(" + "'" + ReferenceNumber + "'" + ',' + "'" + TYPE + "'"  + ',' + "'" + BASE_NUMBER + "'" + ',' + "'" + CHECKSUM + "'" + ',' + "'" + INDEX_NUMBER+ "'" +")";
	var QueryStatus = GetCookie ("EvalRefNumber");
	
	if (Global_Abort_Check)
	{
		Global_Abort_Check = false;
		ResetListenerCounter(); //
		return;
	}
	
	if (  (QueryStatus) && (QueryStatus != Global_QUERY_STATE_START))
	{
		if (QueryStatus.indexOf(Global_QUERY_STATE_OK) != -1)
		{  //OK
				CheckerSetStatus(null, FetchRefNumberTypeText(TYPE), parseInt(TYPE,10))
				return;
		}
		else  if(QueryStatus.indexOf(Global_QUERY_STATE_ERROR) != -1)
		{  // ERROR
			CheckerSetStatus(null, "INVALID", -1)
			return;
		}
		
	} 
	
	
	if (ListeningCounts > MAX_COUNT)
	{
		CheckerSetStatus(null, "Server not responding", 0);
		ResetListenerCounter();
	}
	else
	{
		setTimeout(ListenerFct, PERIOD);
	}
}


function SetCookie (name, value) 
{
	var argv=SetCookie.arguments;
	var argc=SetCookie.arguments.length;
	var expires=(argc > 2) ? argv[2] : null;
	var path=(argc > 3) ? argv[3] : null;
	var domain=(argc > 4) ? argv[4] : null;
	var secure=(argc > 5) ? argv[5] : false;
	document.cookie=name+"="+escape(value)+
		((expires==null) ? "" : ("; expires="+expires.toGMTString()))+
		((path==null) ? "" : ("; path="+path))+
		((domain==null) ? "" : ("; domain="+domain))+
		((secure==true) ? "; secure" : "");
}


function getCookieVal(offset) 
{
	var endstr=document.cookie.indexOf (";", offset);
	if (endstr==-1)
      		endstr=document.cookie.length;
	return unescape(document.cookie.substring(offset, endstr));
}

function GetCookie (name) 
{
	var arg=name+"=";
	var alen=arg.length;
	var clen=document.cookie.length;
	var i=0;
	while (i<clen) {
		var j=i+alen;
		if (document.cookie.substring(i, j)==arg)
                        return getCookieVal (j);
                i=document.cookie.indexOf(" ",i)+1;
                        if (i==0) break;}
	return null;
}



function LaunchWindow(theURL, TargetWin) 
{
	var Height = 240 ;
	var Width = 240 ;
	var NewWindow=window.open(theURL,TargetWin,'toolbar=no,location=no,menubar=no,status=no,scrollbars=yes,resizable=yes,top=0,left=0,width='+Width+',height='+Height);
	//NewWindow.focus();
	return NewWindow;
}

function VerifyCHECKSUM(ReferenceNumber,TYPE,BASE_NUMBER,CHECKSUM,INDEX_NUMBER)
{
	var Form = document.forms['REACHcheckerForm']
	if (!Form) {Form = document.REACHcheckerForm;}
	//Form.target = 'REACHchecker';
	Form.blands_reference_number.value = ReferenceNumber 
	Form.blands_rn_type.value  = TYPE
	Form.blands_rn_base_number.value  = BASE_NUMBER
	Form.blands_rn_check_sum.value  = CHECKSUM
	Form.blands_rn_index_number.value  = INDEX_NUMBER
	Form.blands_rn_query_failed.value  = Global_QUERY_STATE_ERROR
	Form.blands_rn_query_ok.value  = Global_QUERY_STATE_OK
	//Qwin = LaunchWindow('http://www.reach-compliance.eu/english/forums/forums.html', Form.target);		
	Form.submit();
}



