window.addEvent('domready', function() {
  
  new K.Placeholder({
    skip_check: true,
    hide_on_submit: true
  });

  new K.Slideshow({
    stack_offset: 30,
    onInitializeTeaser: function(teaser_item, i) {
      if(i == 0) return teaser_item.toggleClass('open', 'closed');

      return teaser_item.setStyle('left', parseInt(teaser_item.getStyle('left'), 10) - (this.options.stack_offset * (this.teaser_items_length - i)));
    }
  });
  
  new K.Slideshow({
    teaser_container: 'images',
    stack_duration_delay: 0,
    view: 'list',
    onInitializeTeaser: function(teaser_item, i) {
      if(i == 0) teaser_item.retrieve('catch').addClass('active');
    },
    onSlideComplete: function(teaser_item) {
      this.teaser_catches.each(function(element) {
        element.removeClass('active');
      });
      
      return teaser_item.retrieve('catch').addClass('active');
    },
    getTeaserCatch: function(teaser_item) {
      return $('slide_navigation').getElement('li[teaser={id}]'.substitute({
        id: teaser_item.get('teaser')
      }));
    }
  });
  
});

Website = new Class({
  
  initializeProjectList: function() {
    var list = $('teaser_projects').getElement('ul');
    list.getElements('li').each(function(li) {
      var hover_element = li.getElement('a div.hover');
      hover_element.fade('hide');
      hover_element.show();
      hover_element.set('tween', {duration: 250 });
      li.getElement('a.teaser').addEvent('mouseover', function(e){
        hover_element.tween('opacity', 1);
      });
      li.getElement('a.teaser').addEvent('mouseout', function(e){
        hover_element.tween('opacity', 0);
      });
    });
  },
  
  initializeDefaultForm: function(form_list) {   
    form_list.getElements('li.text, li.string').each(function(li) {
      var form_element = li.getElement('input') || li.getElement('textarea');
      var form_hint = li.getElement('.form_hint');
      var form_error = li.getElement('.form_error');
      
      form_element.addEvent('focus', function(e){
        if(form_error && form_error.isVisible()) {
          form_error.hide();
        };
        form_hint.show();
      });
      
      form_element.addEvent('blur', function(e){
        form_hint.hide();
      });
    });
    var success_overlay = form_list.getPrevious('.success_overlay');
    var form = form_list.getParent('form');
    if (success_overlay) {
      success_overlay.getElement('.close').addEvent('click', function(e) {
        e.stop();
        success_overlay.fade(0);
        form_list.getElements('li.text, li.string').each(function(li) {
          var form_element = li.getElement('input') || li.getElement('textarea');
          form_element.value = form_element.getAttribute('placeholder');
          form_element.addClass('placeholder');
        });
      });
    } else {
      console.log('no success overlay found');
    };
  },
  
  initializeContactForm: function(contact_path) {
    var form = $('contact_form');
    var submit = $('contact_form_submit');
    var spinner = form.getElement('.spinner');
    submit.set('disabled', false);
    var success_box = form.getElement('#contact_success');
    
    this.initializeDefaultForm(form.getElement('ul.form_list'));
    
    form.addEvent('submit', function(e) {
      e.stop();
      if (!submit.get('disabled')) {
        submit.set('disabled',true);
        var request = new Request({
          url: contact_path,
          method: 'post',
          data: form.toQueryString(),
          onRequest: function() {
            spinner.show();
          },
          onSuccess: function(response) {
            spinner.hide();

            submit.set('disabled', false);

            success_box.setStyle('opacity', 0);
            success_box.show();
            success_box.fade(.85);
            submit.set('disabled', false);
          },
          onFailure: function(response) {
            spinner.hide();
            
            var errors = JSON.decode(response.responseText);
            
            var email_container = $('contact_email_error');
            var text_container  = $('contact_text_error');
            
            errors.each(function(error){
              if(error[0] == 'email'){ error_container = email_container; email_container = null;};
              if(error[0] == 'text') { error_container = text_container;  text_container  = null;};

              error_container.set('html', error[1]);

              if (error_container.isHidden()) {
                error_container.show();
                error_container.fade(1);
              } else {
                error_container.flash('#D61E21', '#871113', 3);
              }; 
            });
            
            [email_container, text_container].clean().each(function(li){
              li.hide();
            });
                        
            submit.set('disabled', false);
          }
        }).send();
      };
    });
  },
  
  initializeNewsletterForm: function() {
    var form = $('newsletter_form');
    var submit = form.getElement('.buttons button');
    var spinner = form.getElement('.spinner');
    var success_box = $('newsletter_success');
    submit.set('disabled', false);
    
    this.initializeDefaultForm(form.getElement('ul.form_list'));
    
    form.addEvent('submit', function(e) {
      e.stop();
      
      if (!submit.get('disabled')) {
        submit.set('disabled', true);
        var request = new Request({
          url: form.get('action'),
          method: 'post',
          data: form.toQueryString(),
          onRequest: function() {
            spinner.show();
          },
          onSuccess: function(response) {
            spinner.hide();

            submit.set('disabled', false);
            
            success_box.setStyle('opacity', 0);
            success_box.show();
            success_box.fade(.85);
          },
          onFailure: function(response, text) {
            spinner.hide();
            
            var errors = JSON.decode(response.responseText);
            var first_name_li = $('newsletter_firstname_error');
            var last_name_li  = $('newsletter_lastname_error');
            var email_li      = $('newsletter_email_error');

            errors.each(function(error){
              if(error[0] == 'first_name'){ li = first_name_li; first_name_li = null;};
              if(error[0] == 'last_name') { li = last_name_li;  last_name_li  = null;};
              if(error[0] == 'email')     { li = email_li;      email_li      = null;};

              li.set('html', error[1]);

              if (li.isHidden()) {
                li.show();
                li.fade(1);
              } else {
                li.flash('#D61E21', '#871113', 3);
              }; 
            });

            [first_name_li, last_name_li, email_li].clean().each(function(li){
              li.hide();
            });
            submit.set('disabled', false);
          }
        }).send();
      };
    });
  }
  
});

Element.implement({
  isHidden: function(){
    var w = this.offsetWidth, h = this.offsetHeight,
    force = (this.tagName === 'TR');
    return (w===0 && h===0 && !force) ? true : (w!==0 && h!==0 && !force) ? false : this.getStyle('display') === 'none';
  },
  isVisible: function(){
    return !this.isHidden();
  }
});

Element.implement({
	flash: function(to,from,reps,prop,dur) {
		
		//defaults
		if(!reps) { reps = 1; }
		if(!prop) { prop = 'background-color'; }
		if(!dur) { dur = 250; }
		
		//create effect
		var effect = new Fx.Tween(this, {
				duration: dur,
				link: 'chain'
			});
		
		//do it!
		for(x = 1; x <= reps; x++)
		{
			effect.start(prop,from,to);
		}
	}
});

//when the dom is ready...
window.addEvent('domready', function() {
	//time to implement fancy show / hide
	Element.implement({
		//implement show
		fancyShow: function() {
			this.fade('in');
		},
		//implement hide
		fancyHide: function() {
			this.fade('out');
		}
	});
});