var ArrangeMyDelivery = Class.create({

	stepNumber: 1,

	initialize: function() {			
		if ($('startTime') && $('arrivalTime') && $('order_number')) {
			new PeriodicalExecuter(this.updateProgress, 5);
		}				
		this.directionsChecker();
		this.initPrint();
		this.initSteps();
	},
	
	updateProgress: function() {
		var orderNumberValue = $('order_number').value;	
		if (orderNumberValue!='' && orderNumberValue != '0000021864') {		/* <--- FUDGE!!! */
			new Ajax.Updater('delivery', 'delivery_progress.xml', {
				method: 'post',
				parameters: {order_number:orderNumberValue}
			});
		}
	},
	
	directionsChecker: function() {
		var directions = $('directions');
		if (directions) {
			directions.observe('keyup', (function() { 				
				this.checkLength(directions, 80);
			}).bind(this));
			directions.observe('blur', (function() { 				
				this.checkLength(directions, 80);
			}).bind(this));
		}
	},
	
	checkLength: function(element, length) {		
		if (element.value.length > length) {	
			element.value = element.value.substring(0, length);
		}
	},
	
	initPrint: function() {
		var myPrint = $('print');
		if (myPrint) {
			myPrint.observe('click', function() {
				window.print();
			});
		}
	},
	
	initSteps: function() {
		if (this.stepNumber != '') {			
			$$('input.nextStepButton').invoke('observe', 'click', function () {					
				$('step'+this.stepNumber).hide();
				this.stepNumber++;
				$('step'+this.stepNumber).show();
			}.bind(this));			
			$$('input.previousStepButton').invoke('observe', 'click', function () {					
				$('step'+this.stepNumber).hide();
				this.stepNumber--;
				$('step'+this.stepNumber).show();
			}.bind(this));
		}
	}
});

document.observe('dom:loaded', function () { new ArrangeMyDelivery(); });




window.onload = function()
{
  if (document.getElementsByTagName('body'))
  {
    if (document.getElementsByTagName('body')[0])
    {
      var myBody = document.getElementsByTagName('body')[0];
      var myNewScriptDiv = document.createElement('div');
      myNewScriptDiv.setAttribute('id', 'scriptInfo');
      var myNewStepDiv = document.createElement('div');
      myNewStepDiv.setAttribute('id', 'stepNumber');
      var myNewStepNumber = document.createTextNode('1');
      myNewStepDiv.appendChild(myNewStepNumber);
      myNewScriptDiv.appendChild(myNewStepDiv);
      myBody.appendChild(myNewScriptDiv);
    }
  }
  /*if (document.getElementById('directions'))
  {
    myDirections = document.getElementById('directions');
    myDirections.onkeyup = function()
    {
      checkLength(this, '80');
    }
    myDirections.onchange = function()
    {
      checkLength(this, '80');
    }
    myDirections.onblur = function()
    {
      checkLength(this, '80');
    }
  }*/
  if (document.getElementById('print'))
  {
    myPrint = document.getElementById('print');
    myPrint.onclick = function()
    {
      window.print();
    }
  }
  if (document.getElementById('startTime'))
  {
    if (document.getElementById('arrivalTime'))
    {
      //moveStartFinish();
    }
  }
}

/*function moveStartFinish()
{
  if (document.getElementById('order_number'))
  {
    var myOrder = document.getElementById('order_number');
    var myOrderNumber = getValue(myOrder);
    getTimes(myOrderNumber);
    movement = setTimeout('moveStartFinish()', 10000);
  }
}

function getTimes(myOrderNumber)
{
  if (myOrderNumber != '')
  {
	var randomNumber = Math.floor(Math.random()*9999999);
    var myAJAXUrl = 'delivery_progress.xml?order_number=' + myOrderNumber + '&randomNumber=' + randomNumber;
    doAJAXRequest(myAJAXUrl);
  }
}*/

function newCalendar()
{
  if (document.getElementById('calendar'))
  {
    if (document.getElementById('postcode'))
    {
      if (document.getElementById('order_number'))
      {
        var myCalendar = document.getElementById('calendar');
        var myPostcode = document.getElementById('postcode');
        var myPostcodeValue = getValue(myPostcode);
        var myOrderNumber = document.getElementById('order_number');
        var myOrderNumberValue = getValue(myOrderNumber);
        var myAJAXUrl = '/calendar.xml?order_number=' + myOrderNumberValue + '&postcode=' + myPostcodeValue;
        doAJAXRequest(myAJAXUrl);
      }
    }
  }
}

function doAJAXRequest(AJAXUrl)
{
  if (window.XMLHttpRequest)
  {
    req = new XMLHttpRequest();
  }
  else if (window.ActiveXObject)
  {
    req = new ActiveXObject("Microsoft.XMLHTTP");
  }
  if (req)
  {
    req.onreadystatechange = processAJAXRequest;
    req.open("GET", AJAXUrl, true);
    req.send(null);
  }
}

function processAJAXRequest()
{
  if (req.readyState == 4)
  {
    if (req.status == 200)
    {
      var response;
      response = req.responseXML;
      if (response)
      {
        if (response.getElementsByTagName('calendar')[0])
        {
          if (document.getElementById('calendar'))
          {
            var myCalendar = document.getElementById('calendar');
            var myCalendarNodes = myCalendar.childNodes;
            for (i=myCalendarNodes.length - 1; i>=0; i--)
            {
              myCalendar.removeChild(myCalendarNodes[i]);
            }
            var myCalendarXML = response.getElementsByTagName('calendar')[0];
            myCalendar.innerHTML = getXMLNodeSerialisation(myCalendarXML);
          }
        }
        else if (response.getElementsByTagName('delivery')[0])
        {
          if (document.getElementById('delivery'))
          {
            var myDelivery = document.getElementById('delivery');
            var myDeliveryNodes = myDelivery.childNodes;
            for (i=myDeliveryNodes.length - 1; i>=0; i--)
            {
              myDelivery.removeChild(myDeliveryNodes[i]);
            }
            var myDeliveryXML = response.getElementsByTagName('delivery')[0];
            myDelivery.innerHTML = getXMLNodeSerialisation(myDeliveryXML);
          }
        }
      }
    }
  }
}

function getXMLNodeSerialisation(xmlNode) {
  var text = false;
  try
  {
    var serializer = new XMLSerializer();
    text = serializer.serializeToString(xmlNode);
  }
  catch (e)
  {
    try
    {
      text = xmlNode.xml;
    }
    catch (e) {}
  }
  return text;
}

function changeDateText(date)
{
  if (document.getElementById('calendarInstruction'))
  {
    myInstruction = document.getElementById('calendarInstruction');
    myInstructionNodes = myInstruction.childNodes;
    for (i=myInstructionNodes.length - 1; i>=0; i--)
    {
      myInstruction.removeChild(myInstructionNodes[i]);
    }
    myInstructionText = document.createTextNode('You have selected ' + date.substring(6, 8) + '/' + date.substring(4, 6) + '/' + date.substring(0, 4) + ' as your delivery date.');
    myInstruction.appendChild(myInstructionText);
  }
}

function checkLength(element, length)
{
  if (element)
  {
    if (length > 0)
    {
      myValue = getValue(element);
      if (myValue.length > length)
      {
        myNewValue = myValue.substring(0, length);
        setValue(element, myNewValue);
      }
    }
  }
}

function getElementsByClassName(className, tag, elm)
{
  var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
  var tag = tag || "*";
  var elm = elm || document;
  var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
  var returnElements = [];
  var current;
  var length = elements.length;
  for(var i=0; i<length; i++)
  {
    current = elements[i];
    if(testClass.test(current.className))
    {
      returnElements.push(current);
    }
  }
  return returnElements;
}

function getValue(element)
{
  if (element)
  {
    if (element.value || element.value == '')
    {
      return element.value;
    }
    else if (element.lastChild)
    {
      return element.lastChild.nodeValue;
    }
    else
    {
      return element.nodeValue;
    }
  }
}

function setValue(element, value)
{
  if (element)
  {
    if (element.value || element.value == '')
    {
      element.value = value;
    }
    else if (element.lastChild)
    {
      element.lastChild.nodeValue = value;
    }
    else
    {
      element.nodeValue = value;
    }
  }
}

function calNextMonth(oldMonth, newMonth)
{
  if (document.getElementById(oldMonth))
  {
    if (document.getElementById(newMonth))
    {
      myOldMonth = document.getElementById(oldMonth);
      myNewMonth = document.getElementById(newMonth);
      myOldMonth.style.display = 'none';
      myNewMonth.style.display = 'block';
    }
  }
}

function selectDate(element, date)
{
  if (document.getElementById('selectedDate'))
  {
    mySelectedDate = document.getElementById('selectedDate');
    setValue(mySelectedDate, date);
    changeDateText(date);
    if (document.getElementById('calendar'))
    {
      myCalendar = document.getElementById('calendar');
      mySelectedDates = getElementsByClassName('calCellSelected', 'td', myCalendar);
      for (i=0; i<mySelectedDates.length; i++)
      {
        mySelectedDates[i].className = 'calCellLink';
      }
      element.className = 'calCellSelected';
    }
  }
}

function changeStep(newStepNumber)
{
  if (document.getElementById('stepNumber'))
  {
    myStepCounter = document.getElementById('stepNumber');
    myOldStepNumber = getValue(myStepCounter);
    if (myOldStepNumber == 1)
    {
      newCalendar();
    }
    myOldStepName = 'step' + myOldStepNumber;
    myNewStepName = 'step' + newStepNumber;
    if (document.getElementById(myOldStepName))
    {
      if (document.getElementById(myNewStepName))
      {
        myOldStep = document.getElementById(myOldStepName);
        myNewStep = document.getElementById(myNewStepName);
		myOldStep.style.display = 'none';
		myNewStep.style.display = 'block';/*
        myOldStepContainer = getElementsByClassName('stepContainer', 'div', myOldStep);
        myNewStepContainer = getElementsByClassName('stepContainer', 'div', myNewStep);
        for (i=0; i<myOldStepContainer.length; i++)
        {
          myOldStepContainer[i].style.display = 'none';
        }
        for (i=0; i<myNewStepContainer.length; i++)
        {
          myNewStepContainer[i].style.display = 'block';
        }*/
        setValue(myStepCounter, newStepNumber);
      }
    }
  }
}