Effect.Bounce = Class.create();
Object.extend(Object.extend(Effect.Bounce.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    var options = Object.extend({
        x:0, y:200,
        acceleration: 9.81,
        transition: Effect.Transitions.linear,
        mode: 'relative'
    }, arguments[1] || {});
    this.start(options);
  },
  setup: function() {
    Element.makePositioned(this.element);
    this.originalLeft = parseFloat(Element.getStyle(this.element,'left') || '0');
    this.originalTop  = parseFloat(Element.getStyle(this.element,'top')  || '0');
    if(this.options.mode == 'absolute') {
      this.options.x = this.options.x - this.originalLeft;
    }
  },
  mytransition: function(pos){
    var temp = (pos < 0.5 ? 0.5-pos : 0.5+(1-pos)); 
    return (pos < 0.5 ? this.options.acceleration/2*temp*temp : this.options.acceleration/2*(1-temp)*(1-temp) ) *8 /this.options.acceleration - 1;
  },
  update: function(position) {
    Element.setStyle(this.element, {
        left: this.options.x  * position + this.originalLeft + 'px',
    top:  this.originalTop + this.options.y * this.mytransition(position)   + 'px'
    });
  }
});


Login = Class.create();
Object.extend(Login, {
	
	setLoginStyleInCookie: function (loginStyle) {
		var expiry = new Date()
		expiry.setDate(expiry.getDate() + 42)
		document.cookie = 'login_style=' + escape(loginStyle) + ";expires=" + expiry.toGMTString()
	},
	
	getLoginStyleFromCookie: function () {
		if (document.cookie.length > 0) {
		  c_start = document.cookie.indexOf("login_style=");
		  if (c_start!=-1) { 
		    c_start = c_start + 12
		    c_end = document.cookie.indexOf(";",c_start);
		    if (c_end==-1) c_end=document.cookie.length;
		    return unescape(document.cookie.substring(c_start,c_end));
	    } 
	  }
		return "";
	},

	switchTo: function (loginStyle) {
		if (loginStyle == '') { loginStyle = 'username' }
		
		// Locate all the login fields
		$$('div.login').each(function (e) {
			// Display the one for the desiredStyle, hide the rest
			if (e.id == loginStyle) {
				e.show()
				Login.setLoginStyleInCookie(loginStyle)
				
			} else {
				e.hide()
			}
		})
	}
})


InPlaceEditor = Class.create()
Object.extend(InPlaceEditor, {
	
	showForm: function (element) {
		$(element).parentNode.getElementsBySelector('.value').each(function(e) { 
			e.hide() 
		})
		$(element).parentNode.getElementsBySelector('.form').each(function(e) { 
			e.show() 
			e.focusFirstElement()
		})
	},
	
	hideForm: function (element) {
		$(element).parentNode.getElementsBySelector('.value').each(function(e) { 
			e.show() 
		})
		$(element).parentNode.getElementsBySelector('.form').each(function(e) { 
			e.hide() 
		})
	},
	
	makeEditable: function (element) {
		element = $(element)
		Event.observe(element, 'click', function() { InPlaceEditor.showForm(element) }, false )
		Event.observe(element, 'mouseover', function() { element.addClassName('hover') }, false)
		Event.observe(element, 'mouseout', function() { element.removeClassName('hover') }, false)
	}
	
})
	

DomHelper = Class.create()
Object.extend(DomHelper, {

	// Returns the database id of the task contained in element
  taskIdFromDom: function (element) {
    return element.id.gsub('task_', '')
  },

	// Returns the database id of the project contained in element
  projectIdFromDom: function (element) {
		id = element.id.gsub('project_', '')
		if (!id) {
			// Couldn't grok a project id from the DOM id of the element. Is there a class instead?
			element.classNames().each(function(name) {
				if (id = name.split('_')[1]) {
					return id
				}
			})
		}
    return id
  }
  
})

TaskList = Class.create()
Object.extend(TaskList, {
	
	// Make the tasks draggable
	makeTasksDraggable: function () {
	  Draggables.drags.each(function (d) { d.destroy() })
	  $$('.contents .tasks li').each(function(e) {new Draggable(e, {revert:true, scroll:window})})	
	},

  // Make the projects accept tasks being dropped
	makeProjectsAcceptTaskDrops: function () {
		// Start with a blank slate
	  Droppables.remove()

	  $$('.project .drop_target').each(function (e) { 
	    Droppables.add(e, {
	      accepts: 'task',
	      hoverclass: 'hover',
	      onDrop:function (draggedElement, droppedOn, event) {
	        // Get the project id...
	        projectId = DomHelper.projectIdFromDom($(droppedOn).up('div.project'))

	        // Don't revert...
	        draggable = Draggables.activeDraggable
	        draggable.options.revert = false
	        // ...simply fade
	        new Effect.Fade(draggable.element, {duration: 1})

	        // Move the task to the project
	        taskId = DomHelper.taskIdFromDom(draggedElement)
	        new Ajax.Request('/tasks/' + taskId, {
	          parameters:'task[project_id]=' + projectId,
	          method:'put',
	          onSuccess:function () { 
	            Effect.Pulsate(droppedOn, {duration:1, pulses:2})
	            // Update the tasks list
	            new Ajax.Updater('main', document.location, {method: 'get', evalScripts: true})
	          }
	        })
	      }
	    })
	  })
  }
	
})
