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

function setTextAreaMaxLengths() {
  var textareas = document.getElementsByTagName('textarea');
  var counter = document.createElement('div');
  counter.className = 'textarea_counter';
  for (var i=0; i < textareas.length; i++) {
    if (textareas[i].getAttribute('maxlength')) {
      var counterClone = counter.cloneNode(true);
      counterClone.relatedElement = textareas[i];
      counterClone.innerHTML = '<span>0</span> characters entered (limit = ' +
                               textareas[i].getAttribute('maxlength') +
                               ')';
      textareas[i].parentNode.insertBefore(counterClone,textareas[i].nextSibling);
      textareas[i].relatedElement = counterClone.getElementsByTagName('span')[0];

      textareas[i].onkeyup = textareas[i].onchange = checkTextAreaMaxLength;
      textareas[i].onkeyup();
    }
  }
}
  
function checkTextAreaMaxLength() {
  var maxLength = this.getAttribute('maxlength');
  var currentLength = this.value.length;
  if (currentLength > maxLength) {
    this.relatedElement.className = 'too_many';
  } else {
    this.relatedElement.className = '';
  }
	this.relatedElement.firstChild.nodeValue = currentLength;
}

function ensure_only_digits(field) {
	field = $(field);
	field.value = field.value.gsub('[^0-9]', '').truncate(9, '');
	if ((field.value - 0) == 0) {
		field.value = '';
	}
}

function showAsNumber(field) {
	field = $(field);
  money = field.value.strip();

	ensure_only_digits(field);
}

function showAsMoney(field, zero_value) {
	field  = $(field);
	ensure_only_digits(field);
  number = field.value.strip();

  if (number == '' || (number - 0) == 0 || number == zero_value || number == '999999999') {
    field.value = zero_value;
  } else {
	  field.value = outputDollars(Math.floor(number - 0) + '');
	}
}

function outputDollars(number) {
  if (number.length <= 3) {
    return '$' + (number == '' ? '0' : number);
  } else {
    var mod = number.length % 3;
    var output = (mod == 0 ? '' : (number.substring(0, mod)));
    for (i=0 ; i < Math.floor(number.length / 3) ; i++) {
      if ((mod ==0) && (i ==0)) {
        output += number.substring(mod+3*i, mod+3*i+3);
      } else {
        output += ',' + number.substring(mod+3*i, mod+3*i+3);
      }
    }
      
    return '$' + output;
  }
}
  
function onChangeSearchNumber(object, param, absolute_min, absolute_max) {
	var min_field = $(object + '_min_' + param);
	var max_field = $(object + '_max_' + param);
	var min_border = $('min_' + param + '_border');
	var max_border = $('max_' + param + '_border');
	var explain   = $('explain_' + param);
	var submit    = $('sizes_submit');

  var min       = +min_field.value;
  var max       = +max_field.value;
	var output    = '';
	var garage    = (param == 'garage');

  min_border.removeClassName('fieldWithErrors');
  max_border.removeClassName('fieldWithErrors');
  explain.removeClassName('fieldWithErrors');
	min_border.setStyle({marginBottom: '2px'});
	max_border.setStyle({marginBottom: '2px'});
	if (submit) {
		submit.enable().removeClassName('disabled');
	}
		
	if (min > max) {
	  output = 'ERROR';
	  min_border.addClassName('fieldWithErrors');
	  max_border.addClassName('fieldWithErrors');
	  explain.addClassName('fieldWithErrors');
		min_border.setStyle({marginBottom: '0'});
		max_border.setStyle({marginBottom: '0'});
		if (submit) {
			submit.disable().addClassName('disabled');
		}
		
	} else if (min == +absolute_min && max == +absolute_max) {
		output = 'Any ' + (garage ? 'size' : 'number');

	} else if (min == max) {
    output = (min == 0 ? 'None' : ('Exactly ' + min + (garage ? '-car' : '')));

	} else if (min == +absolute_min) {
    output = 'Up to ' + max + (garage ? '-car' : '');

	} else if (max == +absolute_max) {
    output = 'At least ' + min + (garage ? '-car' : '');

	} else {
	  output = min + ' to ' + max;
  }

	if (output.length > 0) {
    explain.innerHTML = '(' + output.gsub('\\\.0', '').gsub(/^0/, '').gsub(/ 0\\\.5$/, ' 0\\\.5').gsub('\\\.5', '&frac12;') + ')';
	} else {
	  explain.innerHTML = '';
	}
}

var on_change_search_money_running = false;

function onChangeSearchMoney(object, param, current) {
  if (on_change_search_money_running) {
    return;
  }

	on_change_search_money_running = true;
	
	var min_field = $(object + '_min_' + param);
	var max_field = $(object + '_max_' + param);
	var explain   = $('explain_' + param);
	var submit    = $('price_range_submit');
	
	var absolute_min = 0;
	var absolute_max = 999999999;

  var min = min_field.value.gsub('[^0-9]', '');
	var display_min = outputDollars(min);
  min = min.empty() ? absolute_min : +min;

  var max = max_field.value.gsub('[^0-9]', '');
	var display_max = outputDollars(max);
	max = max.empty() ? absolute_max : +max;

	min_field.setStyle({marginBottom: '10px', width: '85px'});
	max_field.setStyle({marginBottom: '10px', width: '85px'});
  min_field.removeClassName('fieldWithErrors');
  max_field.removeClassName('fieldWithErrors');
	var output = '';

  explain.removeClassName('fieldWithErrors');
	if (submit &&
	    ($('user_search_is_fsbo').checked ||
       $('user_search_is_rto').checked ||
       $('user_search_is_rental').checked) &&
      all_money_ranges_are_correct()) {
		submit.enable().removeClassName('disabled');
	}
		
	if (min > max) {
	  output = 'ERROR';
	  min_field.addClassName('fieldWithErrors');
	  max_field.addClassName('fieldWithErrors');
	  explain.addClassName('fieldWithErrors');
		min_field.setStyle({marginBottom: '8px', width: '83px'});
		max_field.setStyle({marginBottom: '8px', width: '83px'});
		if (submit) {
			submit.disable().addClassName('disabled');
		}
		if (current) {
	    showAsNumber(current);
			$(current).focus();
		}
				
	} else if (min == absolute_min && max == absolute_max) {
		output = 'Any amount';

	} else if (min == max) {
	  output = 'Exactly ' + display_min;

	} else if (min == absolute_min) {
    output = 'Up to ' + display_max;

	} else if (max == absolute_max) {
    output = 'At least ' + display_min;

	} else {
	  output = display_min + ' to ' + display_max;
  }

	if (output.length > 0) {
    explain.innerHTML = '(' + output + ')';
	}

	on_change_search_money_running = false;
}

function range_is_correct(param) {
  var min_value = $('user_search_min_' + param).value.gsub('[^0-9]', '');
  min_value = (min_value.empty() ? 0 : +min_value);

  var max_value = $('user_search_max_' + param).value.gsub('[^0-9]', '');
  max_value = (max_value.empty() ? 999999999 : +max_value);

  return (min_value <= max_value);
}

function all_money_ranges_are_correct() {
	return range_is_correct('price') &&
          range_is_correct('option') &&
          range_is_correct('rent');
}



//function onChangeMax(object, param, value, increment) {
//	if (+$(object + '_min_' + param).value >= +value) {	
//		var new_value = (+value) - increment;
//		if (param == 'baths' && ! String(new_value).endsWith('.5')) {
//		  new_value += '.0';
//		}
//		$(param + '_min').value = new_value;
//	  $(object + '_min_' + param).value = new_value;
//		$(param + '_at_least').value = new_value;
//	}
//}
