/**
 * PROTOTYPE
 */

Object.extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}

String.prototype.strip = function() {
  return this.replace(/^\s+/, '').replace(/\s+$/, '');
};

Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}

Function.prototype.bindAsEventListener = function(object) {
  var __method = this;
  return function(event) {
    return __method.call(object, event || window.event);
  }
}

function $() {
  var results = [], element;
  for (var i = 0; i < arguments.length; i++) {
    element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);
//    results.push(Element.extend(element));
      results.push(element);
  }
  return results.length < 2 ? results[0] : results;
}

if (!window.Event) {
  var Event = new Object();
}

Object.extend(Event, {
  KEY_BACKSPACE: 8,
  KEY_TAB:       9,
  KEY_RETURN:   13,
  KEY_ESC:      27,
  KEY_LEFT:     37,
  KEY_UP:       38,
  KEY_RIGHT:    39,
  KEY_DOWN:     40,
  KEY_DELETE:   46,

  element: function(event) {
    return event.target || event.srcElement;
  },

  isLeftClick: function(event) {
    return (((event.which) && (event.which == 1)) ||
            ((event.button) && (event.button == 1)));
  },

  pointerX: function(event) {
    return event.pageX || (event.clientX +
      (document.documentElement.scrollLeft || document.body.scrollLeft));
  },

  pointerY: function(event) {
    return event.pageY || (event.clientY +
      (document.documentElement.scrollTop || document.body.scrollTop));
  },

  stop: function(event) {
    if (event.preventDefault) {
      event.preventDefault();
      event.stopPropagation();
    } else {
      event.returnValue = false;
      event.cancelBubble = true;
    }
  },

  // find the first node with the given tagName, starting from the
  // node the event was triggered on; traverses the DOM upwards
  findElement: function(event, tagName) {
    var element = Event.element(event);
    while (element.parentNode && (!element.tagName ||
        (element.tagName.toUpperCase() != tagName.toUpperCase())))
      element = element.parentNode;
    return element;
  },

  observers: false,

  _observeAndCache: function(element, name, observer, useCapture) {
    if (!this.observers) this.observers = [];
    if (element.addEventListener) {
      this.observers.push([element, name, observer, useCapture]);
      element.addEventListener(name, observer, useCapture);
    } else if (element.attachEvent) {
      this.observers.push([element, name, observer, useCapture]);
      element.attachEvent('on' + name, observer);
    }
  },

  unloadCache: function() {
    if (!Event.observers) return;
    for (var i = 0; i < Event.observers.length; i++) {
      Event.stopObserving.apply(this, Event.observers[i]);
      Event.observers[i][0] = null;
    }
    Event.observers = false;
  },

  observe: function(element, name, observer, useCapture) {
    var element = $(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
        || element.attachEvent))
      name = 'keydown';

    this._observeAndCache(element, name, observer, useCapture);
  },

  stopObserving: function(element, name, observer, useCapture) {
    var element = $(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
        || element.detachEvent))
      name = 'keydown';

    if (element.removeEventListener) {
      element.removeEventListener(name, observer, useCapture);
    } else if (element.detachEvent) {
      element.detachEvent('on' + name, observer);
    }
  }
});

/* prevent memory leaks in IE */
if (navigator.appVersion.match(/\bMSIE\b/))
  Event.observe(window, 'unload', Event.unloadCache, false);


/**
 * XSITE
 */

function XSite(url)
{
    this.url = url;

	if(this.url.indexOf('?') == -1)
	{
	    this.noCacheIE = '?noCache=' + (new Date()).getTime();
	}
	else
	{
	    this.noCacheIE = '&noCache=' + (new Date()).getTime();
	}

    this.head = document.getElementsByTagName('head').item(0);
    this.id = 'XSITE' + XSite.count++;

    this.create();
    this.run();
}

XSite.count = 1;

XSite.prototype =
{
	create: function ()
	{
		this.element = document.createElement('script');

		this.element.setAttribute('type', 'text/javascript');
		this.element.setAttribute('charset', 'utf-8');
		this.element.setAttribute('src', this.url + this.noCacheIE);
		this.element.setAttribute('id', this.id);
	},

	run: function ()
	{
		this.head.appendChild(this.element);
	},

	destroy: function ()
	{
	    this.head.removeChild(this.element);
	}
};


/**
 * ILEADS
 */

var iLeads =
{
	Submit: function(formID, surnameID, telephoneID, emailID, postcodeID, purchaseID, loanID)
	{
		if ($(surnameID).value == '')
		{
			alert('Please enter your Surname');
			$(surnameID).focus();
			return false;
		}

		if ($(telephoneID).value == '' || $(telephoneID).value.length < 10)
		{
			alert('Please enter a valid telephone number\n\nA call with a mortgage adviser will be necessary in order to obtain your free, no-obligation quote');
			$(telephoneID).focus();
			return false;
		}

		var reg_exp = /^[a-z0-9][^\(\)\<\>\@\,\;\:\\\"\[\]]*\@[a-z0-9][a-z0-9\-\.]*\.[a-z]{2,4}$/i;

		if (!reg_exp.test($(emailID).value))
		{
			alert('Please enter a valid E-Mail Address');
			$(emailID).focus();
			return false;
		}

		if ($(postcodeID).value == '')
		{
			alert('Please enter your Postcode');
			$(postcodeID).focus();
			return false;
		}

		if ($(purchaseID).value == '')
		{
			alert('Please enter Purchase Price');
			$(purchaseID).focus();
			return false;
		}

		if ($(loanID).value == '')
		{
			alert('Please enter Mortgage Required');
			$(loanID).focus();
			return false;
		}

		$(formID).submit();
	},

	ExpressConsent: function(channelID, postcode1ID, bizTypeID, leadTypeID, feedbackID, allocID, loanID)
	{
		if (!$(channelID))
		{
			alert('iLeads Express Consent Error\n\nChannel ID element does not exist');
		}

		if (!$(postcode1ID))
		{
			alert('iLeads Express Consent Error\n\nPostcode 1 element does not exist');
		}

		if (!$(bizTypeID))
		{
			alert('iLeads Express Consent Error\n\nBiz Type ID element (' + bizTypeID + ') does not exist');
		}

		if (!$(leadTypeID))
		{
			alert('iLeads Express Consent Error\n\nLead Type ID element (' + leadTypeID + ') does not exist');
		}

		if (!$(feedbackID))
		{
			alert('iLeads Express Consent Error\n\nFeedback element does not exist');
		}

		if (!$(allocID))
		{
			alert('iLeads Express Consent Error\n\nAllocatiion ID element does not exist');
		}

		if (!$(loanID))
		{
			alert('iLeads Express Consent Error\n\nLoan ID element does not exist');
		}

		this.channelID = channelID;
		this.postcode1ID = postcode1ID;
		this.bizTypeID = bizTypeID;
		this.leadTypeID = leadTypeID;
		this.feedbackID = feedbackID;
		this.allocID = allocID;
		this.loanID = loanID;

		var callback = this.__callback.bindAsEventListener(this);
		Event.observe($(postcode1ID), 'change', callback);
		Event.observe($(bizTypeID), 'change', callback);
		Event.observe($(leadTypeID), 'change', callback);
		Event.observe($(loanID), 'change', callback);
		Event.observe(window, 'load', callback);
	}
};

iLeads.ExpressConsent.prototype =
{
	__callback: function()
	{
		var bizTypeID = $(this.bizTypeID).value.strip();
		var leadTypeID = $(this.leadTypeID).value.strip();
		var postcode1 = $(this.postcode1ID).value.strip();
		var loan = $(this.loanID).value.strip();

		if (bizTypeID.length > 0 && leadTypeID.length > 0 && postcode1.length > 0 && loan.length > 0)
		{
			var request = 'http://www.ileads.co.uk/service/lead/express-consent?channelID=' + escape($(this.channelID).value.strip()) + '&postcode1=' + escape(postcode1) + '&bizTypeID=' + escape($(this.bizTypeID).value.strip()) + '&leadTypeID=' + escape(leadTypeID) + '&feedbackID=' + escape(this.feedbackID) + '&allocID=' + escape(this.allocID) + '&alloc=' + escape($(this.allocID).value.strip()) + '&loan=' + escape(loan);
			var xs = new XSite(request);
		}
	}
};
