/**
 * Copyright (C) 2006-2007 Garrett Murray
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program (doc/LICENSE); if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301 USA.
 * --------------------------------------
 * fun tag behavior, written by garrett murray
 *
 * based on the behavior i've seen at del.icio.us
 * but written from the ground up because their javascript
 * was really complicated and i didn't bother trying to
 * figure it out
 */
var Tag = {
	initialize : function()
	{
		var taggables = $$('.taggable');
		var el = $('tag_input');
		
		if (taggables && taggables.length > 0) 
		{
			taggables.each(function(tag)
			{
				tag.observe('click', Tag.toggleTags.bindAsEventListener());
			});	
		}
		
	    if (el)
	    {
	        Tag.highlightTags(el);
			el.observe('keyup', Tag.highlightTagsKey.bindAsEventListener());
	    }
	},
	toggleTags : function(e)
	{
		var target = e.target || e.srcElement;
		var tagName = Tag.parseId(target.id);
		var form = $('post_form');
		var input = form['tag_input'];
		Tag.tagSwap(input, tagName);
		Event.stop(e);
	},
	parseId : function(tag)
	{
		return tag.replace(/^tag_/, '');
	},
	tagSwap : function(el, name)
	{
	    if (!Tag.findTag(el, name))
	    {
	        var normalized = el.value.replace(/^(,?\s*)|(\s*,?)$/g,'');
	        el.value = (normalized == '' ? '' : normalized + ', ') + name;
	        Tag.highlightTags(el);
	    }
	    else
	    {
	        tags = Tag.splitTags(el);
	        newTags = new Array();
	        for (var i = 0; i <= tags.length; i++)
	        {
	            if (tags[i] != name && tags[i] != undefined)
	            {
	                newTags[newTags.length] = tags[i];
	            }
	        }

			newTagsLength = newTags.length;
			joined_tags = '';
			for (var l=0; l < newTagsLength; l++) {
				joined_tags += (l == (newTagsLength-1) ? newTags[l] : newTags[l] + ', ');
			}

			el.value = joined_tags;
	        Tag.highlightTags(el);
	    }
	},
	findTag : function(el, name)
	{
	    var tags = Tag.splitTags(el);
		
	    for (var i = 0; i <= tags.length; i++)
	    {
	        if (tags[i] == name)
	        {
	            return true;   
	        }
	    }
	    return false;
	},
	splitTags : function(el)
	{
		return el.value.split(', ');
	},
	highlightTagsKey : function(e)
	{
		var el = e.target || e.srcElement;
		Tag.highlightTags(el);
	},
	highlightTags : function(el)
	{
	    var tags = Tag.splitTags(el);
	    Tag.clearHighlight();
	
		tags.each(function(tag)
		{
			var tempTag = $('tag_' + tag);
			if (tempTag) 
			{
				tempTag.addClassName('tag_selected');
			}
		});
	},
	clearHighlight : function()
	{
		var highlightedTags = $$('.tag_tag.tag_selected');
		
		highlightedTags.each(function(tag)
		{
			tag.removeClassName('tag_selected');
		});
	}
}

var Reflect = {
	initialize : function()
	{
		Reflect.popup();
		
		var formContent = $('views');
		
		if (!formContent) { return };
		
		var firstField = (formContent.getElementsByTagName('input') || formContent.getElementsByTagName('textarea'))[0];
		
		if (firstField) 
		{
			firstField.focus();
		}

		var haveJs = document.getElementsByTagName('body')[0];

		if (haveJs) 
		{
			$(haveJs).addClassName('has-js');
		}
	},
	start : function(obj)
	{
		document.observe("dom:loaded", obj.initialize);
	},
	goToUrl : function(mySelect)
	{
		myIndex = mySelect.selectedIndex; 
		myValue = mySelect.options[myIndex].value; 
		window.location.href = myValue;
	},
	updateVisibileList : function()
	{
		FileWidget.initialize();
	},
	fadeFlash : function()
	{
		Effect.Fade('success-flash', {duration: .5});
	},
	showflash : function(msg)
	{
		Element.update('success-flash', msg);
		Element.show('success-flash');
		setTimeout("Reflect.fadeFlash()", 3000);
	},
	action_toggle : function(btn, element, focus)
	{
		new Effect.toggle(element, 'blind', {duration: 0.2});
		Element.toggleClassName(btn,'active');
		var e = document.getElementById(focus);
		if(e) e.focus();
	},
	uploadComplete : function()
	{
		window.location = window.location.href+"?upload=complete";
	},
	decrement : function(id)
	{
		var elm = document.getElementById(id);
		var current = parseInt(elm.innerHTML);
		var decrement = current-1;

		elm.update(decrement);
	},
	popup : function()
	{
		var ext_links = document.getElementsByTagName('a');
		if (!ext_links) { return; }
		
		for(var i = 0; i < ext_links.length; i++)
		{
			var main_link = ext_links[i];
			if(main_link.getAttribute('rel') == 'popup')
			{
				main_link.onclick = function()
				{
					return Reflect.popup_window(this.href);
				}
				
			}
		}
	},
	popup_window : function(url)
	{
		newwindow = window.open(url,'name','height=400,width=600,scrollbars=yes');
		if (window.focus) { newwindow.focus() }
		return false;
	}
}

var Tab = {
	toggleElements : [],
	navItems : function()
	{
		return $$("ul.tabbable-nav li a");
	},
	listItems : function()
	{
		return $$(".tabbable");
	},
	initialize : function()
	{
		var navItems = Tab.navItems();
		var listItems = Tab.listItems();
		var first = true;
		
		if (!navItems) { return };
		
		navItems.each(function(item) 
		{ 
			var id_name = Tab.getHrefId(item);
			var target = $(id_name);

			Tab.toggleElements[Tab.toggleElements.length] = target;
			/*
			if (id_name == location.hash.substring(1)) 
			{
				first = false;
				$(item).addClassName('active');
				Tab.createCurrentTab(id_name);
			}
			*/
			if (first) 
			{
				first = false;
				$(item).addClassName('active');
				Tab.createCurrentTab(Tab.getHrefId(item));
			}
			else
			{
				$(target).addClassName('hidden');
			}
			$(item).observe('click', Tab.toggle.bindAsEventListener());
		});
	},
	toggle : function(e)
	{
		Tab.toggleNav(e);
		Tab.toggleContent(e);
		Reflect.updateVisibileList(e);
	},
	toggleNav : function(e)
	{
		var source = e.target || e.srcElement;
		var id = Tab.getHrefId(source);
		this.updateCurrentTab(id);
		var navItems = Tab.navItems();
		navItems.each(function(item)
		{
			var id_name = Tab.getHrefId(item);
			id_name != id ? item.removeClassName('active') : item.addClassName('active');
		});
	},
	createCurrentTab : function(current_tab)
	{
		$('views').insert('<input type="hidden" id="current_tab_value" name="current_tab" value="' + current_tab + '"');
	},
	updateCurrentTab : function(current_tab)
	{
		var curTab = $('current_tab_value');
		if (!curTab) { return };
		curTab.value = current_tab;
	},
	toggleContent : function(e)
	{	
		var source = e.target || e.srcElement;
		var id = Tab.getHrefId(source);
		Tab.toggleElements.each(function(elem)
		{
			elem.id != id ? $(elem).addClassName('hidden') : $(elem).removeClassName('hidden');	
		});
		Event.stop(e);
	},
	getHrefId : function(item)
	{
		return item.href.split('#')[1];
	}
}

var Toggler = {
	initialize : function()
	{
		var checkboxes = $$('.toggle');
		
		if (!checkboxes) { return };
		
		Toggler.toggle(checkboxes);
	},
	toggle : function(elements)
	{
		elements.each(function(el)
		{
			el.classNames().each(function(c)
			{
				if (c.match(/id_(.*)/)) {
					var toggleEl = Toggler.parseId(c);
					
					if (el.checked == true) 
					{
						$(toggleEl).removeClassName('toggleable');
					}

					el.observe('click', function()
					{
						$(toggleEl).toggleClassName('toggleable');
					})
				};
			});
		})
	},
	parseId : function(el)
	{
		return el.replace(/^id_/, '');
	}
}

var Clickable = {
	initialize : function()
	{
		var clickableItem = $$('.clickable')[0];
		if (!clickableItem) { return };
		var clickableNodeName = clickableItem.nodeName.toLowerCase();

		var clickableNodes = {
			"ul" : { "childNodeName" : "li" },
			"table" : { "childNodeName" : "tr" }
		}
		var items = $$(clickableNodeName + '.clickable')[0];

		if (!items) { return };
		var clickableAreas = items.getElementsBySelector(clickableNodes[clickableNodeName]['childNodeName']);
		
		clickableAreas.each(function(row)
		{
			//check to see if we have one checked by default?
			var formElement = $(row).getElementsBySelector('input')[0];

			if (!formElement) { return };
			formElement.addClassName('hidden');
			if (formElement.checked == true)
			{
				Clickable.normalizeAll(clickableAreas);
				row.addClassName('hover-active');	
			}
			
			row.observe('mouseover', function()
			{
				row.addClassName('hover');
			})
			
			row.observe('mouseout', function()
			{
				row.removeClassName('hover');
			})
			
			row.observe('click', function()
			{
				formElement.checked = true;
				
				Clickable.normalizeAll(clickableAreas);
				row.addClassName('hover-active');
			})
		})
	},
	normalizeAll : function(items)
	{
		items.each(function(r)
		{
			if (r.hasClassName('hover-active')) 
			{
				r.removeClassName('hover-active');
			};
		});
	}
}

var FileWidget = {
	initialize : function()
	{
		var lists = $('views');
		
		if (!lists || lists.length <= 1) { return };
		
		lists.childElements().each(function(item)
		{
			FileWidget.normalizeAll(item);

			if (!item.hasClassName('hidden') && !item.hasClassName('tab-nav')) 
			{
				var allFields = FileWidget.getFields(item);
				
				//do we have any textareas or inputs on the page?
				if(allFields.length == 0) { return; }
				
				allFields.last().addClassName('active-edit-pad');
								
				allFields.each(function(field)
				{
					if (field.id == 'tag_input') { return };
					$(field).observe('focus', function()
					{
						FileWidget.normalizeAll(item);
						$(field).addClassName('active-edit-pad');
					})
				})
			};
		})
	},
	getFields : function(item)
	{
		var textAreas = item.getElementsBySelector('textarea');
		var inputFields = item.getElementsBySelector('input[type="text"]');
		var allFields = textAreas.concat(inputFields).without($('tag_input'));
		return allFields;
	},
	normalizeAll : function(item)
	{
		var allFields = FileWidget.getFields(item);
		
		allFields.each(function(field)
		{
			if (field.hasClassName('active-edit-pad')) 
			{
				field.removeClassName('active-edit-pad');
			}
		})
	},
	insertFile : function(parent_id, file, formattingType)
	{
		var element = window.parent.document.getElementById('views').getElementsByClassName('active-edit-pad')[0];
		if (!element) { return; }
		var link_file = (element.nodeName == 'TEXTAREA' || 'html' != formattingType) ? '<a href="' + file + '" title="">' + file + '</a>' : file;
		FileWidget.addToField(element, formattingType, link_file);
	},
	insertLink : function(path, link_title, formattingType)
	{
		var element = window.parent.document.getElementById('views').getElementsByClassName('active-edit-pad')[0];
		if (!element) { return; }
		var link_file = (element.nodeName == 'TEXTAREA' || 'html' != formattingType) ? '<a href="' + path + '" title="' + link_title + '">' + link_title + '</a>' : path;
		FileWidget.addToField(element, formattingType, link_file);
	},
	insertImage : function(parent_id, displayImg, formattingType)
	{
		var element = window.parent.document.getElementById('views').getElementsByClassName('active-edit-pad')[0];
		if (!element) { return; }
		var img_file = (element.nodeName == 'TEXTAREA' || 'html' != formattingType) ? '<img src="' + displayImg + '" alt="">' : displayImg;
		FileWidget.addToField(element, formattingType, img_file);		
	},
	addToField : function(element, formattingType, file)
	{
		if ('html' == formattingType) 
		{	
			FileWidget.insertAtCursor(element, file);
		}
		else
		{
			window.parent.tinyMCE.selectedInstance.execCommand('mceInsertContent', false, file);
		}
	},
	insertAtCursor : function(myField, myValue)
	{
		if (document.selection) 
		{
			myField.focus();
			sel = document.selection.createRange();
			sel.text = myValue;
			myField.focus();
		}
		else if (myField.selectionStart || myField.selectionStart == '0') 
		{
			var startPos = myField.selectionStart;
			var endPos = myField.selectionEnd;
			myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length);
			myField.focus();
			myField.selectionStart = startPos + myValue.length;
			myField.selectionEnd = startPos + myValue.length;
		}
		else
		{
			myField.value += myValue;
			myField.focus();
		}
	}
}

var DatePicker = {
	initialize : function()
	{
		var startDate = $('datetime-start-picker');
		var endDate = $('datetime-end-picker');
		if (!startDate || !endDate) { return };
		endDate.addClassName('hidden');
		startDate.insert('<input type="checkbox" name="has_datetime_end" id="datetime-toggler"> <label for="datetime-toggler">Select End Day/Time</label>');
		var endDateToggler = $('datetime-toggler');
		
		if (startDate.hasClassName('has-end-date')) 
		{
			endDate.removeClassName('hidden');
			endDateToggler.checked = 'checked';
		}
	
		endDateToggler.observe('click', function()
		{
			endDate.toggleClassName('hidden');
		});
	}
}

var Duplicator = {
	observe : true,
	initialize : function()
	{
		var observableField = $$('.observable')[0];
		var observerField = $$('.observer')[0];
		
		if (!observableField && !observerField) { return };

		observerField.observe('keyup', function()
		{
			Duplicator.observe = false;
		})
		

		observableField.observe('keyup', function()
		{
			if (!Duplicator.observe) { return };
			//observerField.value = observableField.value.gsub(/\//,'-');
			observerField.value = observableField.value.gsub(/\//,' ').gsub(/^\s/,'').gsub(/\s$/,'').gsub(/\s/,'-');
		})
	}
}

var Highlighter = {
	initialize : function()
	{
		var lists = $$('.highlight');
		if (!lists || !lists.length > 0 ) { return };
		
		lists.each(function(list)
		{
			var rows = list.childElements();
			if (!rows || !rows.length > 0) { return };
			
			rows.each(function(row)
			{
				row.observe('mouseover', function()
				{
					row.addClassName('hover');
				})

				row.observe('mouseout', function()
				{
					row.removeClassName('hover');
				})
			})
		})
	}
}

var	Permission = {
	initialize : function()
	{
		var checkboxes = Permission.box_list();
		if (!checkboxes) { return };
		
		checkboxes.each(function(checkbox)
		{
			if (checkbox.id.match(/^everything_/)) 
			{
				if (checkbox.checked) { Permission.disable_boxes(checkbox, checkboxes) };
				checkbox.observe('click', Permission.toggle_boxes.bindAsEventListener());
			};
			
			if (checkbox.id.match(/^admin_/)) 
			{
				if (checkbox.checked) { Permission.disable_boxes(checkbox, checkboxes) };
				checkbox.observe('click', Permission.toggle_boxes.bindAsEventListener());
			};
		});
	},
	box_list : function()
	{
		return $$('input[type="checkbox"]');
	},
	disable_boxes : function(target, boxes)
	{
		boxes.each(function(checkbox)
		{
			if (checkbox.id != target.id) 
			{
				checkbox.disabled = true;
				checkbox.checked = false;
			};
		})
	},
	enable_boxes : function(target, boxes)
	{
		boxes.each(function(checkbox)
		{
			if (checkbox.id != target.id) 
			{
				checkbox.disabled = false;
			};
		})
	},
	toggle_boxes : function(e)
	{
		var target = e.target || e.srcElement;
		var checkboxes = Permission.box_list();
		if (!checkboxes) { return };
		
		Permission.toggle(target, checkboxes);
	},
	toggle : function(target, checkboxes)
	{
		target.checked ? Permission.disable_boxes(target, checkboxes) : Permission.enable_boxes(target, checkboxes);
	}
}

var FormAction = {
	make_post : function(element)
	{
		var f = document.createElement('form'); 
		f.style.display = 'none'; 
		element.parentNode.appendChild(f); 
		f.method = 'POST'; 
		f.action = element.href;
		f.submit();
	}
}

var ScreenMessage = {
	total_messages : 0,
	initialize : function()
	{
		var screen_msg = $('screen-message');
		if (!screen_msg) { return };
		
		var msg_links = $$('#screen-message a.hide');
		if (!msg_links) { return }
		
		msg_links.each(function(ml)
		{
			ml.observe('click', ScreenMessage.hide.bindAsEventListener());
		})
	},
	hide : function(e)
	{
		var screen_msg = $('screen-message');
		var child_msgs = screen_msg.childElements();
		ScreenMessage.total_messages = child_msgs.length;
		child_msgs.each(function(msg)
		{
			if (msg.hasClassName('removed')) { ScreenMessage.total_messages--; };
		})

		var source = e.target || e.srcElement;
		var url = source.href;
		
		var source_id = ScreenMessage.total_messages > 1 ? $(source).classNames().toArray()[1] : screen_msg;
		
		//FormAction.make_post(source);
		
		new Ajax.Request(url, {
		  method: 'get',
		  onComplete: function(transport) {
			$(source_id).addClassName('removed');
			//Effect.BlindUp(source_id, { duration: 0.2 });
			Effect.SwitchOff(source_id);
		  }
		});
		
		Event.stop(e);
	}
}

Reflect.start(Reflect);
Reflect.start(Tag);
Reflect.start(Tab);
Reflect.start(FileWidget);
Reflect.start(DatePicker);
Reflect.start(Clickable);
Reflect.start(Toggler);
Reflect.start(Duplicator);
Reflect.start(Highlighter);
Reflect.start(Permission);
Reflect.start(ScreenMessage)