// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

var validationFields = new Array();
var animation = false;

function addEvents() {
  var inputs = document.getElementsByTagName('input');

  for (var i = inputs.length - 1; i >= 0; i--) {
	
    if (inputs[i].type == 'text') {
	
      if ((inputs[i].id.match(/_post_code$/))) {
        validationFields[validationFields.length] = inputs[i].id;
        inputs[i].onblur = function() {
          request_addresses(this.id);
          validateField(this);
        }
        inputs[i].onchange = function() {
          updatePreview(this);
        }
        inputs[i].onkeyup = function() {
          updatePreview(this);
        }
      } else if (inputs[i].id.match(/_confirmation$/)) {
        validationFields[validationFields.length] = inputs[i].id;
        inputs[i].onblur = function() {
          if (checkConfirmation(this.id)) {
            addImage(this.id + '_validation', 'tick.gif', null);
          } else {
            addImage(this.id + '_validation', 'cross.gif', ' The confirmation box should match the above box and must not be empty');
          }
        }
      } else if (!(inputs[i].id.match(/^room/))) {
        validationFields[validationFields.length] = inputs[i].id;
        inputs[i].onblur = function() {
          validateField(this);
        }
        inputs[i].onchange = function() {
          updatePreview(this);
        }
        inputs[i].onkeyup = function() {
          updatePreview(this);
        }
      }
    }
  }

  var textareas = document.getElementsByTagName('textarea');

  for (var i = textareas.length - 1; i >= 0; i--) {
    validationFields[validationFields.length] = textareas[i].id;
    textareas[i].onblur = function() {
      validateField(this);
    }
    textareas[i].onchange = function() {
      updatePreview(this);
    }
  }
}

function validateField(f)
{
  new Ajax.Request('/venues/validate/?field=' + escape(f.id) + '&value=' + escape(f.value), {
    method: 'get',
    onLoading: function() {
      addImage(f.id + '_validation', 'ajax-loader.gif', null);
    },
    onSuccess: function(r) {
      if (r.responseText == 'valid') {
    		if (f.value != '') {
        		addImage(f.id + '_validation', 'tick.gif', null);
        		$(f.id).removeClassName('fieldWithErrors');
    		} else {
    			addImage(f.id + '_validation', null, null);
    		}
      } else {
        addImage(f.id + '_validation', 'cross.gif', ' ' + r.responseText);
      }
    }
  });
}

function removeClass(el, c)
{
  if (el.className.match(c)) {
    el.removeClassName(c);
  }
}

function createImage(i)
{
  var image = document.createElement('img');
  image.src = '/images/' + i;
  image.className = 'ajax';
  return image;
}

function addImage(id, i, t)
{
  if (typeof(id) != 'string') {
    return false;
  }
  span = $(id + '_icon');
  emptyNode(span);
  text = $(id + '_text');
  emptyNode(text);

  if (i != null) {
    span.appendChild(createImage(i))
  }

  if (!empty(t)) {
    text.className = 'errorBlock';
    text.appendChild(document.createTextNode(t));
    Effect.Highlight(text);
  } else {
    text.className = 'hiddenErrorBlock';
  }
}

function emptyNode(n)
{
  if (typeof(n) == 'string') {
    n = $(n);
  }
  while (n.hasChildNodes()) {
    n.removeChild(n.lastChild);
  }
}

function empty(s)
{
  if (typeof(s) == 'array') {
    return (s.length == 0) ? true : false;
  } else {
    return (s == null || s == '' || s == false || s == 0) ? true : false;
  }
}

function checkConfirmation(c)
{
  var t, s;
  
  if (typeof(c) == 'string') {
    if (c.match(/_confirmation$/)) {
      t = $(c);
      s = $(c.replace(/_confirmation$/, ''));
    } else {
      s = $(c);
      t = $(c + '_confirmation');
    }
  } else {
    if (c.id.match(/_confirmation$/)) {
      t = c;
      s = $(c.id.replace(/_confirmation$/, ''));
    } else {
      s = c;
      t = $(c.id + '_confirmation');
    }
  }
  if (!empty(s.value) && !empty(t.value) && s.value == t.value) {
    return true;
  } else {
    return false;
  }
}

function getValueByName(name, type)
{
  if (type == null) {
    type = 'input';
  }
  var els = document.getElementsByTagName(type);
  for (var i = els.length - 1; i >= 0; i--) {
    if (els[i].name == name) {
      return els[i].value;
    }
  }
}

function updateTitle(id, t)
{
  emptyNode($(id));
  $(id).appendChild(document.createTextNode(t));
}

function validateAllFields()
{

  if (!empty(validationFields)) {
	
	for (var i = 0; i < (validationFields.length); i++) {
		
	  if (validationFields[i]) {
		
		if ($(validationFields[i]).style.display != 'none') {
			
	        $(validationFields[i]).focus();
	        $(validationFields[i]).blur();
		}
	  } else {
		// alert(validationFields[i])
	  }
    }
    new Effect.ScrollTo('top', { duration: 0 });
  }
}

function numWords(s, d)
{
  if (empty(s)) {
    return 0;
  } else {
    if (d == null) {
      d = /\s+/;
    }
    return s.split(d).length;
  }
}


function hideField(id, oldStyle)
{
	if (oldStyle == null) {
		oldStyle = 'inline'
	}
	
	if ($(id).style.display == 'none') {
		$(id).style.display = oldStyle
	} else {
		$(id).style.display = 'none';
	}
	
	if ($(id + '_validation_icon')) {
		hideField(id + '_validation_icon')
	}
	
	if ($(id + '_validation_text')) {
		hideField(id + '_validation_text', 'block')
	}
}


// Adds events to page elements for the venue information page.
function add_venue_listing_events()
{
	// Set the behaviour of the directions search form field.
	directions = $('location')
	
	directions.onfocus = function() { alert('blah') }
	
	// directions.onfocus = directions.value = (directions.value == 'Start Location or Post Code') ? '' : directions.value;
	// directions.onblur = directions.value = (directions.value == '') ? 'Start Location or Post Code' : directions.value;
}

function change_view() {
	var className = $('venueList').className;

	if (className == 'venueGrid') {
		$('venueList').className = 'venueList';
		$('switch').src = '/images/list_view.jpg'
		createCookie('view','venueList',365)
	} else if (className == 'venueList'){
		$('venueList').className = 'venueGrid';
		$('switch').src = '/images/grid_view.jpg'
		createCookie('view','venueGrid',365)
	}
}

function updateShortlist(type, id) {
  new Ajax.Updater('venueList', '/shortlists/' + type + '/' + id + "?partial=1", { asynchronous: true } );
}


// inputText
// 
// function for changing the class/value of an element
// 
//   input (object) element to work with
//   text (string) default text
//   focus (boolean) focus event, else must be blur
//   className (string) if set, will set the elements class  as required
// 
// always returns true
// 
function inputText(input, text, focus, className) {
  if (focus) {
    if (input.value == text) {
      input.value = '';
    }
  } else {
    if (input.value == '') {
      input.value = text;
    }
  }
  
  if (typeof className != 'undefined') {
    input.className = className;
  }

  return true;
}



function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}

function togglePreviewPane(link) {
  var pane = $('previewContents');
  if (pane.style.display == 'none') {
    pane.style.display = '';
    link.innerHTML = '<img width="94" height="20" src="/images/buttons/hide_preview.gif" alt="Hide Preview" />';
  } else {
    pane.style.display = 'none';
    link.innerHTML = '<img width="98" height="20" src="/images/buttons/show_preview.gif" alt="Show Preview" />';
  }
  
  return false;
}

// Function that is triggered when a user clicks on a home page featured venue
// thumbnail. Brings the selected venue into tbhe main focus pane.
// 
function makeFeatured(id) {
	
	// Check that no animation is currently ongoing, to prevent it screwing up.
	if (animation == false) { 
		
		animation = true
		
		count = 0
	
		while (count < 3) {
			count++
		
			if ($('featured_focus_' + count).style.display != 'none') {
				Effect.Fade('featured_focus_' + count + '_overlay', { duration: '0.5', queue: {position: 'front', scope: 'focus'} })
				Effect.Shrink('featured_focus_' + count, { direction: 'top-left', queue: {position: 'end', scope: 'focus'} })
			}
		}
	
		Effect.Grow('featured_focus_' + id, { direction: 'top-left', queue: {position: 'end', scope: 'focus'} })
		setTimeout("Effect.Appear('featured_focus_" + id + "_overlay', { duration: '1.0', queue: {position: 'end', scope: 'focus'} })", 1500)
		
		Effect.SlideUp('featured_select_' + id, {queue: {position: 'front', scope: 'selection'} })
		
		if ((id != 1) && ($('featured_select_1').style.display == 'none')) {
			Effect.SlideDown('featured_select_1', {queue: {position: 'end', scope: 'selection'} })
		}
		if ((id != 2) && ($('featured_select_2').style.display == 'none')) {
			Effect.SlideDown('featured_select_2', {queue: {position: 'end', scope: 'selection'} })
		}
		if ((id != 3) && ($('featured_select_3').style.display == 'none')) {
			Effect.SlideDown('featured_select_3', {queue: {position: 'end', scope: 'selection'} })
		}
		
		setTimeout("animation = false", 3000)
	}
}


// livePreview functions
// 
// updatePreview
// change the contents of the preview pane to include the
// 'real' elements contents
// 
function updatePreview(el) {

  if ($('previewPane')) {
    
    if (el == 'map') {
      $('preview_venue_map').src = '/images/previewPane/map.gif';

    } else if (el == 'noImage') {
      $('preview_venue_image').src = '/images/previewPane/noImage.gif';
      
    } else if (!(el.id) && el.match(/^\/system/)) {
      $('preview_venue_image').src = el;
      
    } else if (el.id == 'type_id') {
      $('preview_venue_type').innerHTML = el.options[el.selectedIndex].innerHTML;
      
    } else if (el.id.match(/^keyword/)) {
      var list = $('preview_venue_keywords');
      var label = getLabel(el.id);

      removeItemFromList(list, label);
      
      if (el.checked) {
        var item = document.createElement('li');
        item.innerHTML = label;
        list.appendChild(item);
      }
      
    } else {
      if ($('preview_' + el.id)) {
        $('preview_' + el.id).innerHTML = el.value.replace(/\n/g, '<br/>\n');
      }

    }
     
    return true;
  } else {
    return false;
  }
}

function getLabel(id) {
  var labels = document.getElementsByTagName('label');
  for (var i = labels.length - 1; i >= 0; i--) {
    forAttribute = labels[i].getAttribute('for') || labels[i].getAttribute('htmlFor');
    
    if (forAttribute == id) {
      return labels[i].innerHTML;
    }
  }
  return false;
}

function removeItemFromList(l, s) {
  if (l && s) {
    l = l.childNodes;
    for (var i = l.length - 1; i >= 0; i--) {
      if (l[i].innerHTML == s) {
        return l[i].parentNode.removeChild(l[i]);
      }
    }
  } else {
    return false;
  }
}

function show_venue_info_elements(element) {
	
	var elements = document.getElementsByTagName('div');
	
	for (var i = elements.length - 1; i >= 0; i--) {
		
		if (elements[i].className == 'venueInfoSection') {
			elements[i].style.display = 'none'
		}
	}
	
	var elements = document.getElementsByTagName('li');
	
	for (var i = elements.length - 1; i >= 0; i--) {
		
		if (elements[i].id.match(/^tab_/)) {
			elements[i].className = ''
		}
	}
	
	$(element).style.display  = 'block'
	
	if ($('edit_submit')) {
		$('edit_submit').style.display = 'block'
	}
	
	$('tab_' + element).className = 'edit_tab_selected'
}

var searchFormGo = false;

function searchLoad(form) {
  if (searchFormGo) {
    return true;

  } else {
    if ($('search_location').value != '' && $('search_location').value != 'Post code or town') {
      if ($('search_address_id') && $('search_address_id').value != '') {
        addSearchOverlay();

        searchFormGo = true;

        window.setTimeout(function() { this.submit(); }.bind(form), 1000);
      } else if ($('search_address_id')) {
        alert('Please select a location to search from');

      } else {
        form.style.minHeight = '255px';
        var keywords = convertInput($('search_keywords'));
        var location = convertInput($('search_location'));
        var distance = convertInput($('search_distance'));
        var event = convertInput($('search_event'));
        var venue = convertInput($('search_venue'));
        var attendees = convertInput($('search_attendees'));
        var address_id = document.createElement('input');
        address_id.type = 'hidden';
        address_id.name = 'search_address_id';
        address_id.id = 'search_address_id';
        address_id.value = '';

        form.innerHTML = '';

        form.appendChild(keywords);
        form.appendChild(location);
        form.appendChild(distance);
        form.appendChild(event);
        form.appendChild(venue);
        form.appendChild(attendees);
        form.appendChild(address_id);

        var list = document.createElement('div');
        list.id = 'search_address_list';
        list.innerHTML = '<p style="padding: 30px 10px;"><img src="/images/ajax-loader.gif" alt="Loading..."/> Loading...</p>';

        form.appendChild(list);

        new Ajax.Updater('search_address_list', '/search/get_address_list?popup=1&location=' + escape(location.value), { method: 'get', asynchronous: true, evalScripts: true });
      }
      
      return false;
      
    } else {
      addSearchOverlay();

      searchFormGo = true;

      window.setTimeout(function() { this.submit(); }.bind(form), 1000);
    }

    return false;
  }
}

function addSearchOverlay() {
  var overlay = new Element('div');
  overlay.style.position = 'absolute';
  overlay.style.top = '0px';
  overlay.style.left = '0px';
  overlay.style.width = '100%';
  overlay.style.height = $$('html')[0].getHeight() + 'px';
  overlay.style.background = 'transparent url(/images/lightwindow/black-70.png) top left repeat';
  var message = new Element('div');
  message.style.position = 'absolute';
  message.style.top = ((document.viewport.getHeight() / 2) - 60) + 'px';
  message.style.left = ((document.viewport.getWidth() / 2) - 130) + 'px';
  message.style.width = '230px';
  message.style.paddingLeft = '15px';
  message.style.paddingRight = '15px';
  message.style.height = '90px';
  message.style.backgroundColor = '#ffffff';
  var para = new Element('p');
  para.style.paddingLeft = '45px';
  para.style.paddingTop = '5px';
  para.style.paddingBottom = '5px';
  para.style.paddingRight = '5px';
  para.style.background = 'transparent url(/images/ajax-loader.gif) left center no-repeat';
  var text = document.createTextNode('Searching for venues that match your criteria. Please wait.');

  // add the elements to their parents
  para.appendChild(text);
  message.appendChild(para);
  overlay.appendChild(message);
  document.body.appendChild(overlay);
  
  return true;
}

function convertInput(source, type) {
  if (!type) {
    var type = 'hidden';
  }

  if (source) {
    var destination = document.createElement('input');
    destination.type = type;
    destination.id = source.id;
    destination.name = source.name;

    if (source.tagName.toLowerCase() == 'input') {
      if (source.type.toLowerCase() == 'text' || source.type.toLowerCase() == 'hidden') {
        destination.value = source.value;
        
      } else if (source.type.toLowerCase() == 'checkbox') {
        if (source.checked) {
          destination.value = source.value;
          
        } else {
          destination.value = 0;
        }
      }

    } else if (source.tagName.toLowerCase() == 'select') {
      destination.value = source.options[source.selectedIndex].value;
    }

    return destination;

  } else {
    return false;
  }
}

function changeLocation() {
  $('search_address_id').parentNode.removeChild($('search_address_id'));
  $('search_location_text').parentNode.removeChild($('search_location_text'));
  var location = $('search_location');
  
  var container = location.parentNode;

  var newLocation = convertInput(location, 'text');
  location.name = '';
  location.id = '';

  Element.insert( location, { 'after': newLocation } );
  
  location.parentNode.removeChild(location);
  
  newLocation.value = '';
  newLocation.type = 'text';
  newLocation.style.width = '95%';
  newLocation.className = 'inactiveField';
  newLocation.onfocus = function() {
    inputText(this, '', true, 'activeField');
  }
  newLocation.onblur = function() {
    inputText(this, '', false, 'inactiveField');
  }
  newLocation.focus();

  return true;
}
