
     var msg_theSameCities = "The departure and arrival cities are the same, please correct this and try again.";
     var msg_noDate = "The departure date value is blank, please choose the date and try again.";
     var msg_noDateRJ = "The departure date of your return journey is missing, please choose the date and try again.";
     var msg_wrongDate = "The date that you have requested is in the past, please correct this and try again.";
     var msg_wrongDateRJ = "The date that you have requested as your return date is in the past, please correct this and try again.";
     var msg_wrongDate2 = "The date that you have requested for your return journey is earlier than the date you chosed for your outbound journey, please correct this and try again.";
     var msg_wrongDate3 = "One of the dates that you have requested is in the past, please correct this and try again.";
     var msg_RJDateWrong = "You have selected a return journey date that is before your outbound journey, please correct this and try again.";
     var msg_outOf45Days = "As Russian Railways do not provide confirmed train information before 45 days of the requested departure date our system will show you the exact published schedule with estimated ticket classes and prices.";
     var msg_outOf45Days_Short = "Selected date is out of 45 days window";
     var msg_AjaxServerError = "Server connection error, please check your internet connection and reload the page by pressing F5.";

     //Now = new Date();

     DomLoaded.load(function() {

         //big gray semi-transparent covering element is hidden by default
         var bigCover = document.getElementById('bigCover');
         bigCover.style.display = 'none';

         //first of all we position the semi-transparent covering element over the return date LI
         var secondDate = document.getElementById('secondDate');
         var secondDateCover = document.getElementById('cover');
         var secondDateCoords = getBounds(secondDate);
         //alert('domload called');
         ///alert(["secondDateCoords.top=" + secondDateCoords.top + ",\r\n secondDateCoords.offsetTop=" + secondDate.offsetTop, secondDateCoords.width, secondDateCoords.height]);
         secondDateCover.style.top = secondDate.offsetTop + 'px';
         //secondDateCover.style.left = secondDateCoords.left + 'px';
         secondDateCover.style.width = secondDateCoords.width + 'px';
         secondDateCover.style.height = secondDateCoords.height + 'px';

         var oneWayJourneyButton = document.getElementById('oneWayJourneyButton');
         var returnJourneyButton = document.getElementById('returnJourneyButton');

         oneWayJourneyButton.onclick = returnJourneyButton.onclick = function() {
             if (this.id == 'oneWayJourneyButton') document.getElementById('dateFromDec').value = document.getElementById('dateFrom').value = secondDateCover.style.display = '';
             else secondDateCover.style.display = 'none';
         };

		
         //if (typeof in_array == 'undefined') var in_array = function(needle, haystack) { for (var i = 0, n = haystack.length; i < n; i++) if (haystack[i] == needle) return true; return false; }
         //var _ = ('' + document.location).split('?'); if ((_.length > 1) && (typeof _[1] != 'undefined') && (_[1].split('=').length > 2)) for (var v = _[1].split('&'), i = 0, a, queryString = {}; i < v.length; ++i) { a = v[i].split('='); queryString[unescape(a[0])] = unescape(a[1].replace(/#.*/, '')); } else {
         if (typeof in_array == 'undefined') var in_array = function(needle, haystack) { for (var i = 0, n = haystack.length; i < n; i++) if (haystack[i] == needle) return true; return false; }
         var _ = ('' + document.location).split('?'); 
         queryString = {};
		if ((_.length > 1) && (typeof _[1] != 'undefined'))
			for (var v = _[1].split('&'), i = 0, a, queryString = {}; i < v.length; ++i) 
			{ 
				a = v[i].split('='); 
				queryString[unescape(a[0])] = unescape(a[1].replace(/#.*/, '')); 
			}
		if(typeof queryString["travelDate1"] == 'undefined')queryString["travelDate1"] = dateFormatter.ddmmyyyy(Now, '.');
		if(typeof queryString["travelDate2"] == 'undefined')queryString["travelDate2"] = '01.01.1970';
		if(typeof queryString["plusMinus"] == 'undefined')queryString["plusMinus"] = "+";
		if(typeof queryString["period"] == 'undefined')queryString["period"] = "0";
		if(typeof queryString["sttSelect1"] == 'undefined')queryString["sttSelect1"] = "Moscow";
		if(typeof queryString["sttSelect2"] == 'undefined')queryString["sttSelect2"] = "Saint Petersburg";
		if(typeof queryString["sort"] == 'undefined')queryString["sort"] = "";
		if(typeof queryString["time"] == 'undefined')queryString["time"] = "m";
		if(typeof queryString["currency"] == 'undefined')queryString["currency"] = "GBP";
		if(typeof queryString["cntSelect1"] == 'undefined')queryString["cntSelect1"] = "Russia";
		if(typeof queryString["cntSelect2"] == 'undefined')queryString["cntSelect2"] = "Russia";
         /*else 
       	 {
             //default values
             queryString = {};
             queryString["travelDate1"] = dateFormatter.ddmmyyyy(Now, '.');
             queryString["travelDate2"] = '01.01.1970';
             queryString["plusMinus"] = "+";
             queryString["period"] = "0";
             queryString["sttSelect1"] = "Moscow";
             queryString["sttSelect2"] = "Saint Petersburg";
             queryString["sort"] = "";
             queryString["time"] = "m";
             queryString["currency"] = "GBP";
             queryString["cntSelect1"] = "Russia";
             queryString["cntSelect2"] = "Russia";
         }*/

         //alert(queryString["sttSelect2"]);
         //return;

         var setIndexByValue = function(dropdownID, value) {
             var dd = document.getElementById(dropdownID);
             var current = dd.options[dd.selectedIndex].value;
             if (current != value) for (var i = 0, opt; (opt = dd.options[i]); ++i) if (opt.value == value) { dd.selectedIndex = i; break; }
         };

         var qs = function(id) { setIndexByValue(id, queryString[id]); };

         var cntSelect1 = document.getElementById('cntSelect1'), cntSelect2 = document.getElementById('cntSelect2');

         //we save original selectedIndices to compare with passed parameters
         var originalCountry1 = cntSelect1.selectedIndex, originalCountry2 = cntSelect2.selectedIndex;

         //we set countries to those that are passed in GET
         qs('cntSelect1');
         qs('cntSelect2');

         //then we obtain all the stations for the selected country and make passed station current (only if the country has been changed)
         if (cntSelect1.selectedIndex != originalCountry1) refreshStations(cntSelect1, '1', function(strReq) { return strReq.replace('>' + queryString['sttSelect1'], ' selected>' + queryString['sttSelect1']); });
         //otherwise just set the city selectedindex
         else qs('sttSelect1');

         if (cntSelect2.selectedIndex != originalCountry2) refreshStations(cntSelect2, '2', function(strReq) { return strReq.replace('>' + queryString['sttSelect2'], ' selected>' + queryString['sttSelect2']); });
         else qs('sttSelect2');

         //then set passed currency
         qs('currency');

         //then set travelDate1 - if it's been passed as a GET param, it will be parsed into a date object. if not - then it's assumed to be today
         var cal1Date = dateParser.ddmmyyyy(queryString['travelDate1'], '.');

         //if the passed date differs from today, we set it as an input value
         if (dateDiff(cal1Date, Now) > 0) {
             document.getElementById('dateToDec').value = cal1Date.getDate() + ' ' + ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"][(cal1Date.getMonth() + 1)] + ' ' + cal1Date.getFullYear();
             document.getElementById('dateTo').value = dateFormatter.ddmmyyyy(cal1Date, '.');
         }

         //and then travelDate2 - if it's been passed as a GET param and is not equal to the start date of UNIX epoch, then we set it to be the
         //selected date of the second calendar and also set return journey to true, otherwise it's set to NOW
         var cal2Date = Now;
         if ((queryString['travelDate2'] != '') && (queryString['travelDate2'] != '01.01.1970')) {
             cal2Date = dateParser.ddmmyyyy(queryString['travelDate2'], '.');
             document.getElementById('dateFromDec').value = cal2Date.getDate() + ' ' + ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"][(cal2Date.getMonth() + 1)] + ' ' + cal2Date.getFullYear();
             document.getElementById('dateFrom').value = dateFormatter.ddmmyyyy(cal2Date, '.');
             returnJourneyButton.checked = true;
             returnJourneyButton.onclick();
         }

         //then we set if that was plus or minus
         setIndexByValue('varPlusMinus1', queryString['plusMinus']);

         //then we set the period
         setIndexByValue('varPeriod1', queryString['period']);



         var today = new Date();
         today.day = today.getDate();
         today.month = today.getMonth() + 1;
         today.year = today.getFullYear();

         var dateSelected = function() {
             bigCover.style.display = 'none';
             var calDate = this.getSelectedDates()[0];
             document.getElementById(this.inputId + 'Dec').value = calDate.getDate() + ' ' + ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"][(calDate.getMonth() + 1)] + ' ' + calDate.getFullYear();
             document.getElementById(this.inputId).value = calDate.getDate() + '.' + (calDate.getMonth() + 1) + '.' + calDate.getFullYear();
             document.getElementById(this.containerId).style.display = 'none';
             if (dateDiff(calDate, Now) > 44) alert(msg_outOf45Days);
         };

         var dateTo = document.getElementById('dateToDec');
         if (dateTo) {
             dateTo.readOnly = true;

             var cal1Container = document.getElementById('cal0Container');
             cal1Container.style.display = 'none';

             var cal1 = new YAHOO.widget.Calendar("cal0Container");
             cal1.inputId = 'dateTo';

             cal1.cfg.setProperty('START_WEEKDAY', '1');
             /*@cc_on
             cal1.cfg.setProperty('iframe', true);
             @*/
             cal1.cfg.queueProperty("selected", dateFormatter.mmddyyyy(cal1Date, '/'), false);
             cal1.cfg.queueProperty("pagedate", (cal1Date.getMonth() + 1).toString() + "/" + cal1Date.getFullYear(), false);
             cal1.cfg.queueProperty("mindate", today.month + "/" + today.day + "/" + today.year, false);
             cal1.cfg.fireQueue();
             cal1.selectEvent.subscribe(dateSelected, cal1, true);

             cal1.render();
             cal1.ishovered = false;

             cal1Container.onmouseover = function() { cal1.ishovered = true; };
             cal1Container.onmouseout = function() { cal1.ishovered = false; };

             dateTo.onfocus = function() { cal1Container.style.display = bigCover.style.display = 'block'; };
             dateTo.onblur = function() { if (!cal1.ishovered) cal1Container.style.display = bigCover.style.display = 'none'; };
         }


         var dateFrom = document.getElementById('dateFromDec');
         if (dateFrom) {
             dateFrom.readOnly = true;

             var cal2Container = document.getElementById('cal1Container');
             cal2Container.style.display = 'none';

             var cal2 = new YAHOO.widget.Calendar("cal1Container");
             cal2.inputId = 'dateFrom';

             cal2.cfg.setProperty('START_WEEKDAY', '1');
             /*@cc_on
             cal2.cfg.setProperty('iframe', true);
             @*/
             cal2.cfg.queueProperty("selected", dateFormatter.mmddyyyy(cal2Date, '/'), false);
             cal2.cfg.queueProperty("pagedate", (cal2Date.getMonth() + 1).toString() + "/" + cal2Date.getFullYear(), false);
             cal2.cfg.queueProperty("mindate", today.month + "/" + today.day + "/" + today.year, false);
             cal2.cfg.fireQueue();
             cal2.selectEvent.subscribe(dateSelected, cal2, true);

             cal2.render();
             cal2.ishovered = false;


             cal2.div = cal2Container;

             cal2Container.onmouseover = function() { cal2.ishovered = true; };
             cal2Container.onmouseout = function() { cal2.ishovered = false; };

             dateFrom.onfocus = function() { cal2Container.style.display = bigCover.style.display = 'block'; };
             dateFrom.onblur = function() { if (!cal2.ishovered) cal2Container.style.display = bigCover.style.display = 'none'; };
         }

         var f = function(obj, message) {
             alert(message);
             if (obj.focus) obj.focus();
             return false;
         };

         var ARTForm = document.getElementById('ARTForm');
         //ARTForm.target = '_blank';
         ARTForm.onsubmit = function() {
             var sttSelect1 = document.getElementById('sttSelect1'),
                 sttSelect2 = document.getElementById('sttSelect2');

             var firstTown = sttSelect1.options[sttSelect1.selectedIndex].value,
                 secondTown = sttSelect2.options[sttSelect2.selectedIndex].value;

             //you can't select the same cities as arrival and departure stations
             if (firstTown == secondTown) return f(secondTown, msg_theSameCities)

             //you can't have departure date field empty 
             var date1 = (dateTo.value + '').trim();
             if (date1 == '') return f(dateTo, msg_noDate);

             var date1Obj = dateParser.ddMMMMyyyy(date1);

             //departure date can't be in the past - do we still need it?
             //if (dateDiff(date1Obj, Now) < 1) return f(dateTo, msg_wrongDate);

             var returnJourneyButton = document.getElementById('returnJourneyButton');
             if (returnJourneyButton.checked) {

                 //you can't have the return date field empty
                 var date2 = (dateFrom.value + '').trim();
                 if (date2 == '') return f(dateFrom, msg_noDateRJ);

                 var date2Obj = dateParser.ddMMMMyyyy(date2);

                 //return journey date can't be in the past - do we still need it?
                 //if (dateDiff(date2Obj, Now) < 1) return f(dateFrom, msg_wrongDateRJ);

                 //return journey date can't be earlier than the first trip date
                 if (dateDiff(date2Obj, date1Obj) < 0) return f(dateFrom, msg_wrongDate2);

             }

         };

     });

     function alertClient(http_request, sttDiv, callback) {
         var sD;
         if (http_request.readyState == 4) {
             if (http_request.status == 200) {
                 sD = document.getElementById("sttSpan" + sttDiv);
                 strReq = "<select id='sttSelect" + sttDiv + "' name='sttSelect" + sttDiv + "' style='width:150px;' onChange='changeStt" + sttDiv + "(this);'>" + http_request.responseText + "</select> ";

                 //if city argument is passed, we find such a city and set it to be selected
                 //if (typeof city != 'undefined') strReq = strReq.replace('>' + city, ' selected>' + city);

                 //alert('result: ' + strReq);
                 //alert([typeof callback, callback(strReq)]);
                 if (typeof callback == 'function') sD.innerHTML = callback(strReq);

                 else sD.innerHTML = strReq;
                 
             }
             //else alert('Sorry, your internet seem to be offline.');
         }
     }


     function makeRequest(url, sttDiv, callback) {
         var http_request = false;

         if (window.XMLHttpRequest) {http_request = new XMLHttpRequest(); if (http_request.overrideMimeType) { http_request.overrideMimeType('text/xml'); }} else if (window.ActiveXObject) { try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { http_request = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) { } } }
         http_request.onreadystatechange = function() {
             alertClient(http_request, sttDiv, callback);
         };
         http_request.open('GET', url, true);
         http_request.send(null);
     }

     function refreshStations(div, sttDiv, callback) {makeRequest("/trains/refreshStation.php?action=1" + '&country=' + div.value, sttDiv, callback); }

     var changeStt1 = changeStt2 = dateWork = set_currencies = step2ChangeString = function() { };

