/**
 * CibloBoutique custom scripts
 *
 * Requires Prototype 1.6.
 *
 * @author Christophe Porteneuve <christophe@ciblo.net>
 * @author Guillaume Tournier <guillaume@ciblo.net>
 * @author Julien Vignolles <julien@ciblo.net>
 * @author Thomas Lecavelier <thomas@ciblo.net>
 * @legals © 2008-2009 Ciblo SA.
 */

var CART_NOTIFICATION_DURATION = 3;
var SEARCHBOX_PLACEHOLDER = 'Rechercher…';
var NEWSLETTERBOX_PLACEHOLDER = 'Mon e-mail…';
var gAuthenticityToken = null;
var gAjaxSearchCompletion = null;

function ajaxifyCartFormAdder(e) {
  if (e.stopped) return;
  e.stop();
  this.request({
    onFailure: function(res) { alert(res.responseText); }
  });
}

function ajaxifyCartLinkAdders(e) {
  var link = e.findElement('a.cartAdder');
  if (!link) return;
  e.stop();
  new Ajax.Request(link.href, {
    method: 'post', parameters: { authenticity_token: gAuthenticityToken },
    onFailure: function(res) { alert(res.responseText); }
  });
}

function bindDatePickers() {
  $$('input.date').invoke('addClassName', 'jsEnabled');
  document.observe('click', function(e) {
    var editor = e.findElement('input.date');
    if (!editor) return;
    if (editor.disabled) return;
    //editor.writeAttribute('readonly', true);
    new CalendarDateSelect(editor, { buttons: false, popup: 'force' });
  });
} // bindDatePickers

function bindIE6Submenus() {
  if (!Prototype.Browser.IE6) return;

  var activeMenu;

  function showSubMenu(e) {
    var menu = e.findElement('li').down('div.box');
    if (!menu) return;
    if (activeMenu) hideSubMenu();
    menu.setStyle('display: block;');
    activeMenu = menu;
  }

  function hideSubMenu() {
    activeMenu && activeMenu.setStyle('display: none;');
    activeMenu = null;
  }

  $('horizontalMenu').select('li.withSubMenu .container').
    invoke('observe', 'mouseenter', showSubMenu).
    invoke('observe', 'mouseleave', hideSubMenu);
}

function bindSizes() {
  var menu = $('fontSizes');
  menu && menu.observe('click', function(e) {
    var activator = e.findElement('a');
    if (!activator) return;
    e.stop();
    document.body.addClassName(activator.id);
    menu.select('a').each(function(link) {
      if (link == activator) {
        link.addClassName('selected');
      } else {
        link.removeClassName('selected');
        document.body.removeClassName(link.id);
      }
    });
  });
} // bindMenu

function getLinkTarget(link) {
  str = link.readAttribute('href');
  return $(str.substring(str.indexOf('#') + 1));
}

function bindSpecTogglers() {
  var links = $('tabsContent');
  if (!links || links.hasClassName('tabs')) return;

  function handleSpecEditorClick(e) {
    e.stop();
    var link = e.findElement('a');
    var activeLinks = links.select('li a.active');
    var activeLink = activeLinks ? activeLinks.first() : null;
    if (link == activeLink || !link) return;
    link.blur();
    if (activeLink) {
      activeLink.removeClassName('active');
      linkElement = getLinkTarget(activeLink);
      if (linkElement) linkElement.hide();
    }
    link.addClassName('active');
    linkElement = getLinkTarget(link);
    if (linkElement) linkElement.show();
  } // handleSpecEditorClick

  links.observe('click', handleSpecEditorClick);
} // bindSpecTogglers

function ensureIEVersionFlagIsDefined() {
  if (Prototype.Browser.IE && !('IE6' in Prototype.Browser)) {
    // Cargo-cult'd from prototype-ui.js (which will redefine it if loaded, but who cares?)
    Prototype.Browser.IEVersion = parseFloat(navigator.appVersion.split(';')[1].strip().split(' ')[1]);
    Prototype.Browser.IE6 =  Prototype.Browser.IEVersion == 6;
    Prototype.Browser.IE7 =  Prototype.Browser.IEVersion == 7;
  }
}

function hookCartAdders() {
  var notif = $('cartNotification');
  if (!notif) return;
  var form = $$('form#addToCart').first();
  form && form.observe('submit', ajaxifyCartFormAdder);
  var link = $(document.body).down('a.cartAdder');
  link && document.observe('click', ajaxifyCartLinkAdders);
  notif.down('.closer').observe('click', function(e) {
    e.stop();
    notif.hide();
  });
}

function initNewsletterPlaceHolder() {
  var box = $('newsletterBox');
  if (!box) return;
  
  function addPlaceholder() {
    if ($F(box).blank())
      box.setValue(NEWSLETTERBOX_PLACEHOLDER).addClassName('placeholder');
  }
  
  function removePlaceholder() {
    if ($F(box) == NEWSLETTERBOX_PLACEHOLDER)
      box.setValue('').removeClassName('placeholder');
  }

  addPlaceholder();
  box.observe('focus', removePlaceholder);
  box.observe('blur', addPlaceholder);
  box.up('form').observe('submit', removePlaceholder);
} 

function initSearchPlaceHolder() {
  var searchBox = $('searchBox');
  if (!searchBox) return;
  
  function addPlaceholder() {
    if ($F(searchBox).blank())
      searchBox.setValue(SEARCHBOX_PLACEHOLDER).addClassName('placeholder');
  }
  
  function removePlaceholder() {
    if ($F(searchBox) == SEARCHBOX_PLACEHOLDER)
      searchBox.setValue('').removeClassName('placeholder');
  }

  addPlaceholder();
  searchBox.observe('focus', removePlaceholder);
  searchBox.observe('blur', addPlaceholder);
  searchBox.up('form').observe('submit', removePlaceholder);
} 

function initSearchCompletions() {
  var searchBox = $('searchBox');
  if (!searchBox) return;
  
  var opts = {
    method:   'get',
    callback: function(element) { return $(element).up('form').serialize(); },
    select:   'productName',
    onShow:   function(element, update){ 
      if (!update.style.position || update.style.position == 'absolute') {
        update.style.position = 'absolute';
        Position.clone(element, update, { setHeight: false, setWidth: false, offsetTop: element.offsetHeight });
      }
      Effect.Appear(update, { duration: 0.15 });
    }
  };
  
  new Ajax.Autocompleter('searchBox', 'searchBoxCompletions', gAjaxSearchCompletion, opts);
  if ($('edtMatch'))
    new Ajax.Autocompleter('edtMatch', 'edtMatchCompletions', gAjaxSearchCompletion, opts);
} // initSearchCompletions

function initCartShim() {
  var notif = $('cartNotification');
  if (!notif || !Prototype.Browser.IE) return;
  notif.insert({ top:
    '<iframe id="cartNotificationShim" style="position:absolute;left:0;top:0;width:100%;height:100%;_filter:alpha(opacity=0)" ' +
    'frameborder="0" scrolling="no"></iframe>'
  });
}

function showCartNotification() {
  var notif = $('cartNotification');
  if (!notif) throw 'Missing cart notification pad';
  notif.show();
}

document.observe('dom:loaded', function() {
  ensureIEVersionFlagIsDefined();
  bindIE6Submenus();
  initCartShim();
  hookCartAdders();
  initNewsletterPlaceHolder();
  initSearchPlaceHolder();
  //initSearchCompletions();
  bindSizes();
  bindSpecTogglers();
  bindDatePickers();
});

