// element toggle auxiliary function
function wbs_toggle(element, link, message_show, message_hide) {
	if (!$(element).visible()) {
		$(element).show();
		$(link).innerHTML = message_hide;
	} else {
		$(element).hide();
		$(link).innerHTML = message_show;
	}
}

function ask_for_category_name(select, url, token, labelText) {
	select = Element.extend(select);

	if (select.getValue() == 0) {
		select.up().insert({
			after: new Element('div').addClassName('field').writeAttribute('id', 'new_category_field').insert({
				bottom: '<label for="category_name">' + labelText + '</label>'
			}).insert({
				bottom: '<input id="category_name" name="category[name]" size="30" type="text" />'
			})
		});
	} else if ($('new_category_field')) {
		$('new_category_field').remove();
	}
}

function edit_comment(comment, add_comment_form, comment_id, options) {
	$(comment).hide();
	$(add_comment_form).hide();

	if ($("edit_comment")) { // replace old edit with new edit and show hidden comment
		$("edit_comment").previous().show();
		$("edit_comment").remove();
	}

	// build edit comment form
	$(comment).insert({
		after: '<div id="edit_comment" style="margin-bottom: 15px;">' + '<form action="' + options.submit_url + '" method="post" onsubmit="new Ajax.Request(\'' + options.submit_url + '\', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;">' + '<input name="authenticity_token" type="hidden" value="' + options.token + '"/>' + '<fieldset id="comment_fieldset"> <div class="field"><textarea cols="110" id="edit_comment_text" name="comment[text]" rows="5">' + options.default_text.stripScripts() + '</textarea></div>' + '<div class="submit"><input id="save_comment_button" name="commit" type="submit" value="' + options.submit_label + '" onclick="$(\'edit_comment_text_editor\').fire(\'field:change\');return false;" /> ' + ' <a href="#" onclick="close_edit_comment(); return false;">' + options.cancel_label + '</a></div>' + '</fieldset></form></div>'
	});
	
	// wysiwyg editor for comment edits
	var e = WysiHat.Editor.attach('edit_comment_text');
	var t = new WysiHat.Toolbar(e);
	t.addButtonSet(WysiHat.Toolbar.ButtonSets.Basic);
	t.addButton({ name: "link", label: "Link", handler: function(editor) { return editor.promptLinkSelection(); }});
	t.addButton({	name: "olist", label: "Ordered List", handler: function(editor) { return editor.toggleOrderedList(); }});
	t.addButton({	name: "ulist", label: "Unordered List", handler: function(editor) { return editor.toggleUnorderedList(); }});
	t.addButton({ name: "image", label: "Image", handler: function(editor) { return editor.promptImageURL(); }});
	e.observe("field:change", function(event) {
		$('edit_comment_text').setValue(WysiHat.Formatting.getApplicationMarkupFrom(e));
	});
	
	
	$('save_comment_button').observe('click', function(ev) {
		var e = Event.element(ev);
		var on = !e.disabled;
		e.disable();
		if (on) {
			e.up(2).onsubmit();
		}
	});
}



function close_edit_comment() {
	$("edit_comment").previous().show();
	$("edit_comment").remove();
	$("add_comment").show();
}

// tag filtering
document.observe("dom:loaded", function() {
	$$(".tag_link").each(function(e) {
		e.observe('click', function(evt) {
			var element = Event.element(evt);
			if (element.hasClassName('tag_selected')) {
				// undo tag selection. show all elements in list
				$$('.tagged_item').each(function(t) {
					if (t.hasClassName('fade')) {
						t.removeClassName('event_faded');
					} else {
						//t.show();
						t.removeClassName('hidden_tag');
					}
				});
				// remove selected flag from tag link
				element.removeClassName('tag_selected');
			} else {
				// user clicked a different (or new) tag
				// remove flag from all tag links
				$$(".tag_link").each(function(f) {
					f.removeClassName('tag_selected');
				});
				// filters items. shows only those with selected tags
				$$('.tagged_item').each(function(t) {
					if (t.hasClassName(element.id)) {
						if (t.hasClassName('fade')) {
							t.removeClassName('event_faded');
						} else {
							//t.show();
							t.removeClassName('hidden_tag');
						}
					} else {
						if (t.hasClassName('fade')) {
							t.addClassName('event_faded');
						} else {
							//t.hide();
							t.addClassName('hidden_tag');
						}
					}
				});
				// adds selected tag
				element.addClassName('tag_selected');
			}
		});
	});
});

// //focus on the first form in the page
document.observe("dom:loaded", function() {
	var form = $$('#bd form').first();
	if (form) {
		//form found, focus on it
		form.focusFirstElement();
	}
});

//highlight the correct menu
document.observe("dom:loaded", function() {
	var submenu = document.getElementById('submenu');
	if (submenu) {
		var location_highlight = document.location.href.match(/^https?:\/\/.+?\/.+?\/((.+?)((#|\/).+?)?)$/);
		if (location_highlight) {
			if (location_highlight[2] == "calendar") {
				location_highlight[2] = "event";
			}
			if (location_highlight[2] == "milestone") {
				$('project_link').addClassName('current');
			}
			var el = null;
			el = $(location_highlight[2] + '_link');
			if (el) {
				el.addClassName('current');
			}
		} else {
			//dashboard
			$('project_link').addClassName('current');
		}
	}

	var sub_submenu = document.getElementById('sub_submenu');
	if (sub_submenu) {
		var sub_location_highlight = document.location.href.match(/^https?:\/\/.+?\/.+?\/(\w+)$/);
		var ee = null;
		if (sub_location_highlight) {
			if (sub_location_highlight[1]) {
				ee = $('sub_' + sub_location_highlight[1]);
				if (ee) {
					ee.addClassName('current');
				} else {

				}
			}
		} else {
			//no match, we'r at a HOME screen
			ee = $('sub_home');
			if (ee) {
				ee.addClassName('current');
			}
		}
	}
});

//AJAX responders
Ajax.Responders.register({
	onCreate: function() {
		if (Ajax.activeRequestCount === 1) {
			//show the spinner
			$('ajax_indicator').show();
		}
	},
	onComplete: function() {
		if (Ajax.activeRequestCount === 0) {
			//hide the spinner
			$('ajax_indicator').hide();
		}
	}
});

var WBS = window.WBS || {};
if (!WBS.AjaxValidation || typeof(WBS.AjaxValidation) == 'undefined') {
	WBS.AjaxValidation = function(validation_url, form, field, ex, attr) {
		//var dummy = $(form);
		var serialized_form = form.serialize(true);

		Object.extend(serialized_form, {
			field_to_test: field,
			_method: 'post'
		});

		var more_data = {};
		//$.extend(more_data, {field_to_test: field, _method: 'post'});
		if (ex) {
			Object.extend(serialized_form, {
				existing: ex
			});
			//$.extend(more_data, {existing:ex});
		}
		if (attr) {
			Object.extend(serialized_form, {
				attributes: attr
			});
			//$.extend(more_data, {attributes:attr});
		}

		return new Ajax.Request(validation_url, {
			method: 'post',
			parameters: serialized_form
		});
	};
}



function send_feedback(auth_token, title, msg, send, close) {
	var o = $('overlay');

	var close_link = new Element('a').writeAttribute('href', '#').writeAttribute('onclick', 'return false;').update(' or close');
	var error_msg = new Element('span').writeAttribute('id', 'feedback_error').writeAttribute('style', 'margin-left:20px;');

	var form = new Element('form').writeAttribute('id', 'feedback_form').addClassName('mb clearfix').writeAttribute('method', 'post').insert({
		bottom: new Element('fieldset').insert({
			bottom: new Element('div').addClassName('field').insert({
				bottom: '<label for="feedback_title">' + title + '</label>'
			}).insert({
				bottom: new Element('input').writeAttribute('type', 'text').writeAttribute('value', '').writeAttribute('name', 'feedback[title]')
			})
		}).insert({
			bottom: new Element('div').addClassName('field').insert({
				bottom: '<label for="feedback_text">' + msg + '</label>'
			}).insert({
				bottom: new Element('textarea').writeAttribute('cols', '40').writeAttribute('rows', '10').writeAttribute('name', 'feedback[message]')
			}).insert({
				bottom: new Element('input').writeAttribute('type', 'hidden').writeAttribute('name', 'authenticity_token').writeAttribute('value', auth_token)
			})
		}).insert({
			bottom: new Element('div').addClassName('submit').insert({
				bottom: new Element('input').writeAttribute('type', 'submit').writeAttribute('value', send)
			}).insert({
				bottom: close_link
			}).insert({
				bottom: error_msg
			})
		})
	});
	var layer = new Element('div').writeAttribute('id', 'overlay');
	var feedback = new Element('div').writeAttribute('id', 'feedback');

	layer.reposition = function() {
		layer.setStyle({
			width: (document.viewport.getWidth() + document.viewport.getScrollOffsets().left) + 'px',
			height: (document.viewport.getHeight() + document.viewport.getScrollOffsets().top) + 'px'
		}).setOpacity(0.6);
	};
	layer.reposition();

	$('doc3').insert({
		after: layer
	}).insert({
		after: feedback.insert({
			bottom: form
		})
	});
	feedback.reposition = function() {
		feedback.setStyle({
			left: ((document.viewport.getWidth() / 2) + document.viewport.getScrollOffsets().left - (feedback.getWidth() / 2)) + 'px',
			top: ((document.viewport.getHeight() / 2) + document.viewport.getScrollOffsets().top - (feedback.getHeight() / 2)) + 'px'
		});
	};
	feedback.reposition();

	var close_modal = function() {
		layer.remove();
		feedback.remove();
	};
	var reposition_all = function() {
		layer.reposition();
		feedback.reposition();
	};

	var send_f = function() {
		new Ajax.Request('/account/send_feedback', {
			method: 'post',
			parameters: form.serialize(true)
		});
		return false;
	};
	form.onsubmit = send_f;
	close_link.observe('click', close_modal);
	layer.observe('click', close_modal);
	Event.observe(window, 'resize', reposition_all);
}



function login_help(auth_token) {
	var close_link = new Element('a').writeAttribute('href', '#').writeAttribute('onclick', 'return false;').update('&times;').setStyle({
		'float': 'right',
		'color': 'red'
	});
	var layer = new Element('div').writeAttribute('id', 'overlay');
	var help = new Element('div').writeAttribute('id', 'loginhelp').insert({
		bottom: '<h1>Logging into Goplan</h1><p class="font12">Logging into Goplan is done through your company\'s subdomain. If you don\'t know this information, please contact the person responsible for creating your Goplan account or our <a href="mailto:support@goplanapp.com">customer support</a>. Your login page is typically in the form of:</p><p><span class=\'em grey georgia font12\'><img src="/images/icons/pin.png" class="va" /> http://{company}.goplanapp.com</span></p>'
	});

	help.insert({
		top: close_link
	});

	layer.reposition = function() {
		layer.setStyle({
			width: (document.viewport.getWidth() + document.viewport.getScrollOffsets().left) + 'px',
			height: (document.viewport.getHeight() + document.viewport.getScrollOffsets().top) + 'px'
		}).setOpacity(0.9);
	};
	layer.reposition();

	help.reposition = function() {
		help.setStyle({
			left: ((document.viewport.getWidth() / 2) + document.viewport.getScrollOffsets().left - (help.getWidth() / 2)) + 'px',
			top: ((document.viewport.getHeight() / 2) + document.viewport.getScrollOffsets().top - (help.getHeight() / 2)) + 'px'
		});
	};
	help.reposition();

	$('doc4').insert({
		after: layer
	}).insert({
		after: help
	});

	var o = $('overview');
	if (o) {
		o.hide();
	}

	var close_modal = function() {
		layer.remove();
		help.remove();
		if (o) {
			o.show();
		}
	};
	var reposition_all = function() {
		layer.reposition();
		help.reposition();
	};

	help.reposition();
	close_link.observe('click', close_modal);
	layer.observe('click', close_modal);
	Event.observe(window, 'resize', reposition_all);
}

/* TEXTAREA RESIZER */
document.observe('dom:loaded', function() {
	$$('textarea').each(function(t) {
		t.observe('focus', function(e) {
			var el = Event.element(e);
			if (el.rows >= 20)
			    return;
			var str = el.getValue();
			var sum = 0;
			for (var i = 0; i < str.length && sum < 20; i++) {
				if (str.charAt(i) == '\n') {
					sum++;
				}
			}
			if (sum < 5) {
				sum = 5;
			}
			el.rows = sum;
		});
		t.observe('keyup', function(ev) {
			if (ev.keyCode == Event.KEY_RETURN) {
				var el = Event.element(ev);
				if (el.rows < 16) {
					el.rows = el.rows + 1;
				}
			}
		});
	});
});

/* TIME TRACKING */
function slide_tt_hide() {
	new Effect.Morph('ttrack', {
		duration: 0.4,
		style: 'bottom: -172px',
		afterFinish: function() {
			$('ttrack').setStyle({
				'bottom': '30px',
				'display': 'none'
			});
		}
	});
}



function slide_tt_show() {
	new Effect.Morph('ttrack', {
		duration: 0.4,
		style: 'bottom: 30px',
		beforeSetup: function() {
			$('ttrack').setStyle({
				'bottom': '-172px',
				'display': 'block'
			});
		}
	});
}



function update_clocks(ongoing) {
	Timetrack.ongoing = ongoing;
	$$('.tt_clock').each(function(e) {
		if (ongoing) {
			e.href = e.href.sub('/create', '/finish');
			//e.writeAttribute('onclick',e.readAttribute('onclick').sub('/create','/finish'));
		} else {
			e.href = e.href.sub('/finish', '/create');
			//e.writeAttribute('onclick',e.readAttribute('onclick').sub('/finish','/create'));
		}
	});
}


// start a timetrack for the asset (used by the clock buttons on task list, ticket list and milestone view)
function start_timetracking(project, type, cid) {
    target_link =  "/"+project+"/timetrack/"+((Timetrack.ongoing)?('finish'):('create'))+"?link%5Baction%5D=view&link%5Bcontroller%5D="+type+"&link%5Bid%5D="+cid+"&startnew=1";
    new Ajax.Request(target_link, {
        asynchronous:true,
        evalScripts:true,
        method:'get'
    });
    return false;
}


/* wysiwyg */


WysiHat.Commands.promptLinkSelection = function() {
	if (this.linkSelected()) {
		if (confirm("Remove link?")) {
			this.unlinkSelection();
		}
	} else {
		var value = prompt("Enter a URL", "http://www.google.com/");
		if (value) {
			this.linkSelection(value);
		}
	}
};

WysiHat.Commands.promptImageURL = function() {
	var value = prompt("Enter the image URL", "http://example.com/image.jpg");
	if (value) {
		this.insertImage(value);
	}
};

function setupeditor(element) {
	var editor = WysiHat.Editor.attach(element);
	var toolbar = new WysiHat.Toolbar(editor);
	toolbar.addButtonSet(WysiHat.Toolbar.ButtonSets.Basic);
	toolbar.addButton({ name: "link", label: "Link", handler: function(editor) { return editor.promptLinkSelection(); }});
	toolbar.addButton({	name: "olist", label: "Ordered List", handler: function(editor) { return editor.toggleOrderedList(); }});
	toolbar.addButton({	name: "ulist", label: "Unordered List", handler: function(editor) { return editor.toggleUnorderedList(); }});
	toolbar.addButton({ name: "image", label: "Image", handler: function(editor) { return editor.promptImageURL(); }});
	editor.observe("field:change", function(event) {
		$(element).setValue(WysiHat.Formatting.getApplicationMarkupFrom(editor));
	});
}
