/* Listphile Javascripts */

function redirect_to(location) {
	if (/Safari/.test(navigator.userAgent)) {
		var special_redirect_form = document.createElement("form");
		special_redirect_form.action = location;
		special_redirect_form.method = "POST";
		special_redirect_form.name = "hidden_redirect_form";
		document.body.appendChild(special_redirect_form);
		special_redirect_form.submit();
	} else {
		window.location.href = location;
	}
}

function notImplemented() {
	alert("This feature is not yet implemented");
}

function flashNotice(msg) {
	$('flash_notice').down('.notice').innerHTML = msg;
}

/**
 * Question is, why doesn't Prototype have this built in?
 */
Form.Element.setValue = function(field, value) {
	field = $(field);
	if (field.length) {
		for (var i=0; i < field.length; i++) {
			field[i].checked = (field[i].value == value);
		}
	}
	else if (field.tagName == 'textarea') {
		return field.innerHTML = value;
	}
	else {
		return field.value = value;
	}
}

/**
 * Sheesh, c'mon Prototype!
 */
Form.Element.originalGetValue = Form.Element.getValue;
Form.Element.getValue = function(field) {
	if (field.length) {
		for (var i=0; i < field.length; i++) {
			if (field[i].checked) return field[i].value;
		}
	}
	else {
		return Form.Element.originalGetValue(field);
	}
}

var Application = {
	search: function() {
		alert('Search is not implemented yet');
	},
	urlName: function() {
		var loc = "" + window.location;
		var match = loc.match(/https?:\/\/[^\/]*\/([^\/]*)/);
		return match[1];
	},
	urlFor: function(options) {
		var action = options.action;
		return '/' + Application.urlName() + '/exec/' + action;
	},
	setFieldInstructions: function(field, instructionsText) {
		Event.observe(window, 'load', function() {
			field = $(field);
			if (!Form.Element.getValue(field)) {
				Form.Element.setValue(field, instructionsText);
				field.clear_on_submit = true;
				field.onfocus = function() {
					Form.Element.setValue(field, "");
					field.clear_on_submit = false;
				}
				Event.observe(field.form, 'submit', function() {
					if (field.clear_on_submit) Form.Element.setValue(field, "");
				});
			}
		});
	}
}

var SitePages = {
  selectVideo: function(link, id) {
      $('video').update('');
      var obj = $(id).cloneNode(true);
      obj.id = null; $('video').appendChild(obj);
      Element.siblings(link.parentNode).each(function(s){s.removeClassName('selected');});
      link.parentNode.addClassName('selected');
  }
}

var ListSettings = {
	votingClicked: function() {
		if (ListSettings.sortOrder() != 'vote_rank') {
			Form.Element.setValue(ListSettings.form()['list[sort_method]'], 'vote_rank');
			if ($('list_form').className == 'settings') {
				alert("We've changed your list's sort method to 'Vote / Rank'");
			}
		}
	},
	nonVotingClicked: function() {
		if (ListSettings.sortOrder() != 'alpha') {
			Form.Element.setValue(ListSettings.form()['list[sort_method]'], 'alpha');
			if ($('list_form').className == 'settings') {
				alert("We've changed your list's sort method to 'Alphabetical'");
			}
		}
	},
	votingStatus: function() {
		return Form.Element.getValue(ListSettings.form()['list[voting]']) == 'true';
	},
	sortOrder: function() {
		return Form.Element.getValue(ListSettings.form()['list[sort_method]']);
	},
	form: function() {
		return $('list_form');
	},
	activateEditLinks: function() {
		Element.getElementsBySelector(document.body, 'legend a.edit').each(function (link) {
			link.onclick = function () {
				var fieldset = link.up('fieldset');
				if (fieldset.hasClassName('closed')) {
					link.innerHTML = 'HIDE v';
					fieldset.removeClassName('closed');
				}
				else {
					link.innerHTML = 'EDIT &gt;';
					fieldset.addClassName('closed');
				}
			}
		})
	},
	toggleClosed: function(source) {
		//console.log("source=" + source);
	},
	onTemplateChange: function(radio) {
	  Form.Element.setValue($('list_form')['list[default_display]'], radio.defaultDisplay || radio.readAttribute('defaultDisplay'));
	  Form.Element.setValue($('list_form')['list[sort_method]'], radio.sortMethod || radio.readAttribute('sortMethod'));
	}
}

var CustomizeFields = {
	listId: function() {
		return $('list_id').value;
	},
	fieldSave: function (id) {
		var form = $('modal_container').down('form');
		var query = Form.serialize(form);
		Control.Modal.close();
		if (query) query += '&'
		query += 'field_id=' + id;
		new Ajax.Updater('field_positions', Application.urlFor({action:'customize_save_field'}), {
			method: 'post',
			onFailure: function() { alert("Failed to add field"); },
			onComplete: function() {
			  Application.modalizeLinks($('field_positions'));
			},
			parameters: query
		});
	},
	fieldAdd: function (link, type) {
		new Ajax.Updater('field_positions', link.href, {
			method: 'post',
			onFailure: function() { alert("Failed to add field"); },
			onComplete: function() {
			  Application.modalizeLinks($('field_positions'));
			},
			parameters: {type: type},
			evalScripts: true
		});
		CustomizeFields.fieldAddFake(type);
	},
	fieldAddFake: function (type) {
		if (type == 'location' || type == 'image' || type == 'video') {
			var container = $('dim2_positions');
			var div = document.createElement('div');
			Element.addClassName(div, 'field');
			div.style.cssText = "height: 60px; background-color: #e2e2e2; padding: 10px; margin-bottom: 15px";
			div.id = 'field_row[-1]';
			container.appendChild(div);
			div.innerHTML = "<img src=\"/images/lists/customize-blank-image.gif\" width=\"50\" height=\"50\" style=\"float: left; margin-right: 10px\" class=\"item-thumb\" />" +
				"<span style=\"font-weight: bold: display: block\">[" + type + "]</span><br />" +
				"<a href=\"javascript:;\">edit</a> |" +
				"<a href=\"javascript:;\">up</a> |" +
				"<a href=\"javascript:;\">down</a> |" +
				"<a href=\"javascript:;\">delete</a>";
			new Effect.Highlight(div);
		}
		else {
			var dim1Positions = $('dim1_positions');
			var row = document.createElement('div');
			Element.addClassName(row, 'field-position');
			Element.addClassName(row, 'dim1-field')
			row.id = "field_row[-1]";
			dim1Positions.appendChild(row);
			row.innerHTML = "<span class=\"title\">[" + type + "]</span>" +
				"<span class=\"field-links\">" +
				"  <a href=\"javascript:;\">edit</a> | " +
				"  <a href=\"javascript:;\">up</a> | " +
				"  <a href=\"javascript:;\">down</a> | " +
				"  <a href=\"javascript:;\">delete</a>" +
				"</span>";
			new Effect.Highlight(row);
		}
	},
	fieldDelete: function (id) {
		new Ajax.Updater('field_positions', Application.urlFor({action:'customize_destroy_field'}), {
			method: 'post',
			onFailure: function() { alert("Failed to delete field"); },
			onComplete: function() {
			  Application.modalizeLinks($('field_positions'));
			},
			parameters: {field_id: id}
		});
		CustomizeFields.fieldDeleteFake(id);
	},
	fieldDeleteFake: function (id) {
		var tr = $('field_row['+id+']');
		tr.parentNode.removeChild(tr);
		new Effect.Highlight($('field_positions'));
	},
	fieldHigher: function (id) {
		new Ajax.Updater('field_positions', Application.urlFor({action:'customize_field_higher'}), {
			method: 'post',
			onFailure: function() { alert("Failed to raise field"); },
			onComplete: function() {
			  Application.modalizeLinks($('field_positions'));
			},
			parameters: {field_id: id}
		});
		CustomizeFields.fieldHigherFake(id);
	},
	fieldHigherFake: function (id) {
		var tr = $('field_row['+id+']');
		var prev_sibling = tr.previous();
		if (!prev_sibling) return;
		tr.parentNode.insertBefore(tr, prev_sibling);
	},
	fieldLower: function (id) {
		new Ajax.Updater('field_positions', Application.urlFor({action:'customize_field_lower'}), {
			method: 'post',
			onFailure: function() { alert("Failed to lower field"); },
			onComplete: function() {
			  Application.modalizeLinks($('field_positions'));
			},
			parameters: {field_id: id}
		});
		CustomizeFields.fieldLowerFake(id);
	},
	fieldLowerFake: function (id) {
		var tr = $('field_row['+id+']');
		var next_sibling = tr.next();
		if (!next_sibling) return;
		// Insert next before this
		tr.parentNode.insertBefore(next_sibling, tr);
	},
	addNewOption: function () {
		var divs = $('compound_options').immediateDescendants('div');
		var existingCount = 0;
		var i = 0;
		// Find the last newX
		divs.each(function(div) {
			if (match = div.down('input').name.match(/new(\d+)/)) {
				var newIndex = parseInt(match[1])
				if (newIndex >= i) i = newIndex + 1;
			}
			else {
				existingCount++;
			}
		});
		var template = $('option_template').down('div');
		var div = template.cloneNode(true);

		var name = div.down('input').name;
		name = name.replace('0', i);

		var field = div.down('input');
		field.id = name;
		field.name = name;

		var label = div.down('label');
		label.setAttribute('for', name);
		label.innerHTML = 'Item ' + (existingCount + i);

		$('compound_options').appendChild(div);
	},
	applyTemplate: function (template)
	{
		new Ajax.Updater('field_positions', Application.urlFor({action:'customize_apply_template'}), {
			method: 'post',
			onFailure: function() { alert("Failed to select template"); },
			parameters: {template: template}
		});
	}
}

var ListView = {
	getItemRow: function(id) {
		return $('item_row_' + id);
	},
	onSearchFocus: function() {
		var form = ListView.getSearchForm();
		var field = form.q;
		if (!field.touched) {
			field.value = '';
			field.touched = true;
		}
	},
	getSearchForm: function() {
		return $('list-search-form');
	},
	search: function() {
		alert('Search is not implemented yet');
	},
	changeSortMethod: function(url) {
	  window.location.href = url;
	  $('progress_indicator').show();
	}
}

var ItemEdit = {
	editImageSubField: function(index, subField) {
		var imageRow = $('image_' + index);
		var editor = imageRow.down('.' + subField + '_edit_block');
		editor.down('.add_' + subField).style.display = "none";
		editor.down('.edit_' + subField).style.display = "block";
	},
	editImageTitle: function(index) {
		ItemEdit.editImageSubField(index, 'title');
	},
	editImageCredit: function(index) {
		ItemEdit.editImageSubField(index, 'credit');
	},
	editImageRights: function(index) {
		ItemEdit.editImageSubField(index, 'rights');
	},
	addFieldRow: function(rowClassName, field_id, max) {
		var rows = Element.getElementsBySelector(document.body, '.' + rowClassName);

		var templateRow = rows[0];
		var inputName = templateRow.down('input').name;
		var lastRow = rows[rows.length-1];
		var name = lastRow.down('input').name;
		var match = name.match(/^detail\[-?\d+(\.(\d))?\]/);
		var labelId = $('link_field_id').value;
		var index = 0;
		if (match[2]) {
			index = parseInt(match[2]) + 1;
		}

		var row = templateRow.cloneNode(true);
		
		// Change field names
		var tryFields = ['title', 'url'];
		tryFields.each(function (fieldName) {
			var className = "link_" + fieldName;
			var input = row.down('input.' + className);
			input.name = "detail[-" + labelId + "." + index + "][" + fieldName + "]";
			input.value = "";
			input.id = null;
			var label = row.down('label.' + className);
			label.parentNode.removeChild(label);
		});

		lastRow.parentNode.insertBefore(row, lastRow.next());
		if (rows.size() + 2 > max ) {
		   $('add-more-links').hide()
		}
	}
}
