// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults
function setup_change_tracking()
{
  window.onbeforeunload = confirm_exit;
  $A(document.forms).each(function(form) {
    Form.getInputs(form).each(function(input) {
      track_changes(input);
    });
  });
}

// Confirm that a page can be exited
function confirm_exit()
{
	if (page_changed)
		return 'Data on this page has been changed.';
}

// Track changes on an element
function track_changes(element)
{
	element = $(element);
	element.original_value = element.readAttribute("original_value");
	if (element.original_value != null)
	{
	  element.original_name = element.name;
	  element.name = null;
	}
	Element.observe(element, 'change', function() {mark_changed(element);});
}

// Mark an element as changed
function mark_changed(element)
{
	element = $(element);
	original_value = element.readAttribute("original_value")
	if (element.value != original_value) {
	  if (element.original_value != null) element.name = element.original_name;
		page_changed = true;
	}
}

// Fire an event
function fire_event(element, event)
{
	element = $(element);
	if (document.createEventObject) {
	// dispatch for IE
		var evt = document.createEventObject();
		return element.fireEvent('on'+event,evt)
	}
	else {
		// dispatch for firefox + others
		var evt = document.createEvent("HTMLEvents");
		evt.initEvent(event, true, true ); // event type,bubbling,cancelable
		return !element.dispatchEvent(evt);
	}
}

// Show an element, according to the effect
function show_effect(element, effect_type)
{
	element = $(element);
	var queue_options = { position: 'end', scope: element.id };
	if (effect_type == "plain") {
		Element.show(element);
	} else if (effect_type == "fade") {
		Effect.Appear(element, { duration: 0.5, queue: queue_options });
	} else if (effect_type == "drop") {
		Effect.SlideDown(element, { duration: 0.2, queue: queue_options });
	} else if (effect_type == "disable") {
		enable_children(element, true);
	} else {
		alert("Effect <" + effect_type + "> not found!");
	}

}

// Hide an element, according to the effect
function hide_effect(element, effect_type)
{
	element = $(element);
	var queue_options = { position: 'end', scope: element.id };
	if (effect_type == "plain") {
		Element.hide(element);
	} else if (effect_type == "fade") {
		Effect.Fade(element, { duration: 0.5, queue: queue_options });
	} else if (effect_type == "drop") {
		Effect.SlideUp(element, { duration: 0.2, queue: queue_options });
	} else if (effect_type == "disable") {
		disable_children(element, true);
	} else {
		alert("Effect <" + effect_type + "> not found!");
	}
}

// Toggle block according to checkbox
function toggle_checkbox(checkbox, block, effect_type)
{
	checkbox = $(checkbox);
	block = $(block);

	if (checkbox.checked) {
		show_effect(block, effect_type);
	} else {
		hide_effect(block, effect_type);
	}
}

// Update a tree select, showing and hiding children
function update_tree(select, input, effect_type)
{
	select = $(select);
	input = $(input);

	// Show the container
	var container = $(select.getAttribute('container'));
	show_effect(container, effect_type);

	// Check which option is selected
	var index = select.selectedIndex;
	for(var i = 0; i < select.options.length; i++) {
		var option = select.options[i];
		if (i == index) {
			// Check if there is a child select
			var child_id = option.getAttribute('child_id');
			if (child_id == undefined) {
				// Set the value to the leaf value
				input.value = option.value;
				fire_event(input, 'change');
			} else {
				// Set the value to the node value
				var child = $(child_id);
				update_tree(child, input, effect_type);
			}
		} else {
			// Hide the option if its not selected
			hide_option(option, effect_type);
		}
	}
}

// Hide an option, including the children
function hide_option(option, effect_type)
{
	option = $(option);

	// Check if there are children
	var child_id = option.getAttribute('child_id');
	if (child_id != undefined) {
		var child = $(child_id);
		// Hide all the children
		for(var i = 0; i < child.options.length; i++) {
			hide_option(child.options[i], effect_type);
		}
		// Hide the child container
		var container = $(child.getAttribute('container'));
		hide_effect(container, effect_type);
	}
}

// Update conditions based on a conditional
function update_conditions(conditional, conditional_input, effect_type)
{
	conditional = $(conditional);
	conditional_input = $(conditional_input);

	// Get the selected value
	var selected_value = conditional_input.value;
	if (conditional_input.type == 'checkbox' && !conditional_input.checked) {
	  selected_value = '0'
	}

	var link = conditional_input.getAttribute("link");
	if (link) {
		selected_value = conditional_input.options[conditional_input.selectedIndex].getAttribute(link);
	}

	// Figure out if the selected condition is null
	if (conditional.list.get(selected_value) == undefined) selected_value = "null";

	// Go through each condition, updating them
	conditional.list.keys().each(function(condition_value) {
		var condition_ids = conditional.list.get(condition_value);
		condition_ids.each(function(condition_id) {
			if (selected_value == condition_value) {
				show_effect(condition_id, effect_type);
			} else {
				hide_effect(condition_id, effect_type);
			}
		});
	});
}

// Add a repetition if appropriate
function add_repetition(select, type, title, url)
{
	select = $(select);
	if (select.value == "-1")
	{
		$('pop_up').style.top = window.pageYOffset + 250 + 'px';
		$('pop_up').style.left = window.pageXOffset + 225 + 'px';
		$('pop_up').style.width = window.innerWidth - 550 + 'px';

		$('pop_up_indicator').show();
		new Ajax.Updater('pop_up_contents',
			url,
			{
				asynchronous: true,
				evalScripts: true,
				onLoading: function(request)
				{
					document.forms[1].disable();
					show_effect('pop_up_indicator', 'plain');},
				onFailure: function(request){alert('Error adding new ' + title);},
				onComplete: function(request)
				{
					hide_effect('pop_up_indicator', 'plain');
					show_effect('pop_up_contents', 'fade');
				}
			}
		);
	}
}

// Update the appliance info
function after_appliance_update(element, value)
{
    element = $(element);
    ['kwh_per_year', 'energy_factor'].each(function(attribute){
	    var input_id = element.id.replace('model', attribute) + '_lookup';
	    $(input_id).value = value.getAttribute(attribute);
	    if (attribute == 'kwh_per_year')
		{
		    group_id = element.id.replace('model', 'energy_method_group');
		    if ($(input_id).value == 'NA')
			{
			    show_effect(group_id, 'fade');
			} else {
			hide_effect(group_id, 'fade');
		    }
		} else {
		group_id = element.id.replace('model', 'cycles_per_week_group');
		if ($(input_id).value == 'NA' || $(input_id).value == '')
		    {
			hide_effect(group_id, 'fade');
		    } else {
		    show_effect(group_id, 'fade');
		}
	    }
	});
}

// Update the equipment info
function after_equipment_update(element, value)
{
    element = $(element);
    ['afue', 'seer'].each(function(attribute) {
	    var input_id = element.id.replace('model', attribute) + '_lookup';
	    $(input_id).value = value.getAttribute(attribute);
	    if (attribute == 'afue') {
		group_id = element.id.replace('model', 'details_group');
		if ($(input_id).value == 'NA') {
		    show_effect(group_id, 'fade');
		} else {
		    hide_effect(group_id, 'fade');
		}
	    }
	});
}

// Update the water heater info
function after_water_heater_update(element, value)
{
    element = $(element);
    attribute = 'recovery_efficiency';
    var input_id = element.id.replace('model', attribute) + '_lookup';
    $(input_id).value = value.getAttribute(attribute);
    group_id = element.id.replace('model', 'details_group');
    if ($(input_id).value == 'NA') {
	show_effect(group_id, 'fade');
    } else {
	hide_effect(group_id, 'fade');
    }	
}

// Update the pool info
function after_pool_pump_update(element, value)
{
    element = $(element);
    attribute = 'motor_efficiency';
    var input_id = element.id.replace('pump_model', attribute) + '_lookup';
    $(input_id).value = value.getAttribute(attribute);
    group_id = element.id.replace('model', 'pool_pump_group');
    if ($(input_id).value == 'NA') {
	show_effect(group_id, 'fade');
    } else {
	hide_effect(group_id, 'fade');
    }
}

// Disable all children
function disable_children(element, lock)
{
	element = $(element);
	if (lock) element.setAttribute('locked', 'true');

	element.blur();
	element.disabled = true;

	element.childElements().each(function(element)
	{
		disable_children(element, lock);
	});
}

// Enable all children
function enable_children(element, unlock)
{
	element = $(element);
	if (unlock || element.getAttribute('locked') != 'true')
	{
		if (unlock) element.setAttribute('locked', 'false')

		element.disabled = false;

		element.childElements().each(function(element)
		{
			enable_children(element, unlock);
		});
	}
}

/************************/

// Toggle an element based off a checkbox
function checkbox_toggle(checkbox, element)
{
	// Disable the checkbox to prevent repeat clicks
	$(checkbox).disabled = true;

	// Toggle options
    options = {duration: 0.3, afterFinish:function(){$(checkbox).disabled = false;}};
	if ($(checkbox).checked)
		Effect.Appear(element, options);
	else
		Effect.Fade(element, options);
}

// The following functions are for specialt controls

// Update an advance select
function advanced_select_update(id, value_id, junk)
{
	var selected_value = $(id).value;
	var value_id_2 = value_id + '_2';

	if (selected_value == '')
	{
		$('pop_up').style.top = window.pageYOffset + 250 + 'px';
		$('pop_up').style.left = window.pageXOffset + 25 + 'px';
		$('pop_up').style.width = window.innerWidth - 50 + 'px';

		var add_new_address = $(value_id).getAttribute('add_new') + "&select_id=" + id;
		new Ajax.Updater('pop_up_contents', add_new_address,
		{
			asynchronous: true,
			evalScripts: true,
			onLoading: function(request)
			{
				disable_children(document.forms[0], false);
				Effect.Appear('pop_up_indicator');
			},
			onComplete: function (request)
			{
				Element.show('pop_up_contents');
				Element.hide('pop_up_indicator');
			}
		});
	}
	else
	{
		if ($(value_id_2) != undefined) {
			var split_index = selected_value.indexOf('|');
			var second_value = selected_value.substr(split_index + 1, selected_value.length);
			$(value_id_2).value = second_value;
			if ($(value_id_2).onchange != undefined)
				$(value_id_2).onchange();
			selected_value = selected_value.substr(0, split_index);
		}
		$(value_id).value = selected_value;
		if ($(value_id).onchange != undefined)
			$(value_id).onchange();
		$(id).setAttribute('last_index', $(id).selectedIndex);
	}
}

// Update a select, cascading down to children if necessary
function tree_select_update(id, value_id)
{
	var selected = $(id).value;
	var type = selected.substr(0, 4);
	var select_value = selected.substr(5, selected.length - 5);

	// Hide the previously selected child
	hide_selected(id, 'hide')

	if (type == "leaf")
	{
		$(id).setAttribute('selected', '');
		$(value_id).value = select_value;
		if ($(value_id).onchange != undefined)
			$(value_id).onchange();
	}
	else
	{
		// Show the selected child
		$(id).setAttribute('selected', select_value);
		toggle_element_container(select_value, 'show');
		tree_select_update(select_value, value_id);
	}
}

// Toggle an element's container
function toggle_element_container(id, action)
{
	var container = $(id).getAttribute('container');
	toggle_element(container, action);
}

// Hide, show, enable, or disable an input
function toggle_element(id, action)
{
	if (action == 'show')
	{
		Effect.Appear(id, { duration: 0.25 });
	}
	else if (action == 'hide')
	{
		Effect.Fade(id, { duration: 0.25, queue: 'end' });
	}
	else if (action == 'enable')
	{
		enable_children(id);
	}
	else if (action == 'disable')
	{
		disable_children(id, true);
	}
}

// Hide (or disable) an input selected children (and cascade recursively)
function hide_selected(id, action)
{
	var selected_child = $(id).getAttribute('selected');
	if (selected_child != '')
	{
		hide_selected(selected_child, action);
		toggle_element_container(selected_child, action);
	}
}

// Update the conditions under a conditional
function update_conditional(id, prefix, hide_type)
{
	var show = 'show';
	var hide = 'hide';
	if (hide_type == 'disable') {
		show = 'enable';
		hide = 'disable';
	}

	old_value = $(id).getAttribute('current');
	new_value = $(id).value;
	old_condition_id = prefix + old_value;
	new_condition_id = prefix + new_value;
	if ($(old_condition_id) != undefined || $(new_condition_id) != undefined)
	{
		toggle_condition(old_condition_id, prefix, hide);
		toggle_condition(new_condition_id, prefix, show);
	}

	$(id).setAttribute('current', $(id).value);
}

function toggle_condition(condition_id, prefix, action)
{
	default_id = prefix + "default";
	if ($(condition_id) != undefined)
	{
		toggle_element(condition_id, action);
	}
	else if ($(default_id) != undefined)
	{
		toggle_element(default_id, action);
	}
}
