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

var JT = JT || {};

function mark_for_destroy(element, className) { 
  $(element).next('.should_destroy').value = 1 
  $(element).up('.'+className).hide(); 
}

// Override Scriptaculous Autocompleter: This one takes a json response 
// and builds the html list on the client. It also uses GET which is arguably
// the right http method to request a list.

Ajax.RestfulAutocompleter = Class.create();
Object.extend(Object.extend(Ajax.RestfulAutocompleter.prototype, Autocompleter.Base.prototype), {
  initialize: function(element, update, url, options) {
    this.baseInitialize(element, update, options);
    this.options.asynchronous  = true;
    this.options.onComplete    = this.onComplete.bind(this);
    this.options.defaultParams = this.options.parameters || null;
    this.options.method        = 'get';
    this.url                   = url;
    this.template              = Templates[element] || function(){};
  },

  getUpdatedChoices: function() {
    entry = encodeURIComponent(this.options.paramName) + '=' + 
      encodeURIComponent(this.getToken());

    this.options.parameters = this.options.callback ?
      this.options.callback(this.element, entry) : entry;

    if(this.options.defaultParams) 
      this.options.parameters += '&' + this.options.defaultParams;

    new Ajax.Request(this.url, this.options);
  },

  onComplete: function(request) {
    this.processResponse(request.responseText);
  },
  
  processResponse: function(json) {
    var html = [];
    var collection = eval(json);
    var template = this.template(this.element) || new Template('<li class="'+ this.element.id +'" id="#{id}">#{'+ this.element.name +'}</li>');
    // console.log(template)
    html.push('<ul>');
    collection.each(function(obj) {
      html.push(template.evaluate(obj));
    })
    html.push('</ul>');
        
    this.updateChoices(html.join(''));
  }

});

var Templates = {};
Templates['image'] =  function(element) {
  return new Template('<li class="'+ element.id +'" id="#{id}">#{'+ element.name +'}  <img src="/images/#{file}" title="#{caption}" alt="#{caption}" /></li>');
}


document.observe('dom:loaded', function() {
  var clearNotification = function(){
    if ($('notification')) {
      $('notification').fade({delay:2});
      document.stopObserving('mousemove', clearNotification);
    }
  }
  document.observe('mousemove', clearNotification);
})

document.observe('dom:loaded', function(){
  
  $$('form').each(function(form) {
    
    (function(form){
      
      function install() {
        Form.Validator.install(form, {onElementStatusChangeDefault: function(isValid){
          if (isValid)
            this.addClassName('valid');
          else
            this.removeClassName('valid');
        }})
      }
      
      install();
      
      form.observe('DOMNodeInserted', install);
      
    })(form)
    
  })
  
})


/**
 * @author Ryan Johnson <ryan@livepipe.net>
 * @copyright 2007 LivePipe LLC
 * @package Control.Tabs
 * @license MIT
 * @url http://livepipe.net/projects/control_tabs/
 * @version 2.1.1
 */

if(typeof(Control) == 'undefined')
	var Control = {};
Control.Tabs = Class.create();
Object.extend(Control.Tabs,{
	instances: [],
	findByTabId: function(id){
		return Control.Tabs.instances.find(function(tab){
			return tab.links.find(function(link){
				return link.key == id;
			});
		});
	}
});
Object.extend(Control.Tabs.prototype,{
	initialize: function(tab_list_container,options){
		this.activeContainer = false;
		this.activeLink = false;
		this.containers = $H({});
		this.links = [];
		Control.Tabs.instances.push(this);
		this.options = {
			beforeChange: Prototype.emptyFunction,
			afterChange: Prototype.emptyFunction,
			hover: false,
			linkSelector: 'li a',
			setClassOnContainer: false,
			activeClassName: 'active',
			defaultTab: 'first',
			autoLinkExternal: true,
			targetRegExp: /#(.+)$/,
			showFunction: Element.show,
			hideFunction: Element.hide
		};
		Object.extend(this.options,options || {});
		(typeof(this.options.linkSelector == 'string')
			? $(tab_list_container).getElementsBySelector(this.options.linkSelector)
			: this.options.linkSelector($(tab_list_container))
		).findAll(function(link){
			return (/^#/).exec(link.href.replace(window.location.href.split('#')[0],''));
		}).each(function(link){
			this.addTab(link);
		}.bind(this));
		this.containers.values().each(this.options.hideFunction);
		if(this.options.defaultTab == 'first')
			this.setActiveTab(this.links.first());
		else if(this.options.defaultTab == 'last')
			this.setActiveTab(this.links.last());
		else
			this.setActiveTab(this.options.defaultTab);
		var targets = this.options.targetRegExp.exec(window.location);
		if(targets && targets[1]){
			targets[1].split(',').each(function(target){
				this.links.each(function(target,link){
					if(link.key == target){
						this.setActiveTab(link);
						throw $break;
					}
				}.bind(this,target));
			}.bind(this));
		}
		if(this.options.autoLinkExternal){
			$A(document.getElementsByTagName('a')).each(function(a){
				if(!this.links.include(a)){
					var clean_href = a.href.replace(window.location.href.split('#')[0],'');
					if(clean_href.substring(0,1) == '#'){
						if(this.containers.keys().include(clean_href.substring(1))){
							$(a).observe('click',function(event,clean_href){
								this.setActiveTab(clean_href.substring(1));
							}.bindAsEventListener(this,clean_href));
						}
					}
				}
			}.bind(this));
		}
	},
	addTab: function(link){
		this.links.push(link);
		link.key = link.getAttribute('href').replace(window.location.href.split('#')[0],'').split('/').last().replace(/#/,'');
		this.containers[link.key] = $(link.key);
		link[this.options.hover ? 'onmouseover' : 'onclick'] = function(link){
			if(window.event)
				Event.stop(window.event);
			this.setActiveTab(link);
			return false;
		}.bind(this,link);
	},
	setActiveTab: function(link){
		if(!link)
			return;
		if(typeof(link) == 'string'){
			this.links.each(function(_link){
				if(_link.key == link){
					this.setActiveTab(_link);
					throw $break;
				}
			}.bind(this));
		}else{
			this.notify('beforeChange',this.activeContainer);
			if(this.activeContainer)
				this.options.hideFunction(this.activeContainer);
			this.links.each(function(item){
				(this.options.setClassOnContainer ? $(item.parentNode) : item).removeClassName(this.options.activeClassName);
			}.bind(this));
			(this.options.setClassOnContainer ? $(link.parentNode) : link).addClassName(this.options.activeClassName);
			this.activeContainer = this.containers[link.key];
			this.activeLink = link;
			this.options.showFunction(this.containers[link.key]);
			this.notify('afterChange',this.containers[link.key]);
		}
	},
	next: function(){
		this.links.each(function(link,i){
			if(this.activeLink == link && this.links[i + 1]){
				this.setActiveTab(this.links[i + 1]);
				throw $break;
			}
		}.bind(this));
		return false;
	},
	previous: function(){
		this.links.each(function(link,i){
			if(this.activeLink == link && this.links[i - 1]){
				this.setActiveTab(this.links[i - 1]);
				throw $break;
			}
		}.bind(this));
		return false;
	},
	first: function(){
		this.setActiveTab(this.links.first());
		return false;
	},
	last: function(){
		this.setActiveTab(this.links.last());
		return false;
	},
	notify: function(event_name){
		try{
			if(this.options[event_name])
				return [this.options[event_name].apply(this.options[event_name],$A(arguments).slice(1))];
		}catch(e){
			if(e != $break)
				throw e;
			else
				return false;
		}
	}
});
if(typeof(Object.Event) != 'undefined')
	Object.Event.extend(Control.Tabs);
	
	

/**
 * @author Pau Santesmasses <pau@santesmasses.net>
 * @package Control.AjaxTabs
 * @license MIT
 * @url 
 * @version 0
 */
Control.AjaxTabs = Class.create({
  initialize: function(container,partial) {
    this.container = $(container);
    this.partial = partial;
    this.tabs = this.container.select('.tabs li a');
    this.panes = this.container.select('.pane');
    
    this.tabs.each(this.bindTab.bind(this))
    this.insertSpinner()
  },
  
  insertSpinner: function(){
    this.spinner = new Element('img', {
      src: "/images/ui/spinner_small.gif",
      alt: 'loading',
      style: 'position:absolute; top: 31px;left:9px'
    });
    this.spinner.hide();
    this.container.insert({top: this.spinner});
  },
  
  toggleSpinner: function() {
    this.spinner.toggle()
  },
  
  bindTab: function(tab, index) {
    var pane = this.panes[index];
    Event.observe(tab, 'click', this.selectTab.bind(this));
    // Event.observe(tab, 'click', this.selectPane.bind(this));
    
  },
  
  resetTabs: function() {
    this.tabs.each(function(tab){
      tab.removeClassName('active')
    })
    
    this.panes.each(function(pane){
      pane.hide()
    })
  },
  
  selectTab: function(e) {
    this.resetTabs();
    var tab = e.element();
    tab.addClassName('active');
    this.selectPane(e);
  },
  
  selectPane: function(e) {
    var tab = e.element();
    var index = this.tabs.indexOf(tab)
    var pane = this.panes[index];
    var pane_content = pane.down('.content');
    this.loadPane(pane_content,tab.href, {partial:this.partial});
    this.activePane = pane;
    pane.show();
    e.stop();
  },
  
  loadPane: function(pane_content, src, params) {
    if (pane_content.innerHTML.blank()) {
      new Ajax.Updater(pane_content, src, 
                      {method:'get',
                       parameters:params,
                       evalScripts:true,
                       onCreate:this.toggleSpinner.bind(this),
                       onComplete: this.toggleSpinner.bind(this) })
    } 
  }

});
