// ############################################################################
// ################################# DEFAULT ##################################
// ############################################################################


/*
 * $Id: ahws.js,v 1.5 2010/03/09 10:59:07 ronald Exp $
 * $HeadURL: http://svn.fab.local/repositories/albertheijn/website/tags/5-13.37/rev05/ui/default.js $
 */

// ###################################
// ############## PRINT ##############
// ###################################

/* PrintAction function to add Javascript window.print call */
/* Writes hyperlink in element n. Styling of print link in CSS!!
   Contents of listitem with class 'print_action' is recycled in the
   inserted link.
   So:
       <li class="print_action">Afdrukken</li>
   becomes:
       <li class="print_action">
         <a href="javascript:window.print();">Afdrukken</a>
       </li>

   Using this, you can flexibly implement this generic print action behaviour.
   */
function PrintAction(n) {
  var that = this;
  var oldContent = n.innerHTML;
  var link = document.createElement("a");
  link.href = "javascript:window.print();";
  new Insertion.Bottom(link, oldContent);
  n.replaceChild(link, n.firstChild);
}
PrintAction.setup = function(nl) {
  if (!nl.length) return;
  nl.each(function(n) {
    if (n) new PrintAction(n);
  });
};
/* PrintAction end */



// ###################################
// ############## FORMS ##############
// ###################################

/* form initialization functions */
function setDefaultInputValue(input, defaultValue) {
  if (!(input && defaultValue)) return;
  input.defValue = defaultValue;
}

/* Returns true if the given string matches the email address pattern. */
function validateEmail(s) {
  return (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,6})+$/.test(s))
}

// ###################################
// ############## CLOSE ##############
// ###################################

function setupCloseButtons() {
  $A($$("a.close_app")).each(function(a) {
    Event.observe(a, 'click', function() {
      window.close();
      return false;
    });
  });
}





if (!loader) {
	var loader = new Loader();
}
loader.schedule("foldout", setupFoldFromDefaultJS);
loader.schedule("default input values", function() {
  setDefaultInputValue($("search_field"), "Zoeken");
  setDefaultInputValue($("rq"), "Ingredi\u00EBnt of receptnaam");
});

loader.schedule("close buttons", setupCloseButtons);
loader.schedule("print", function() {
    PrintAction.setup($$(".print_action")); });
loader.schedule("shoplist notices", function () {
    // ShopListResponses isn't always available (example: mail-a-friend page)
    if (typeof ShopListResponses !== "undefined") {
      // delay the creation, because this script is loaded /before/ shoplist...
      ShopListResponses.serverMessagesHandler();
    }
  });
loader.schedule("error notices", setupErrorNotices);
loader.schedule("warning notices", setupWarningNotices);
loader.schedule("login confirm", setupLoginConfirm);
loader.schedule("cookbook", setupCookbook);
loader.schedule("disabled image ie6", disabledImgIE6);
loader.schedule("banners", setupBannerStrips);

loader.schedule("Setup stickers", setupStickers, Loader.priority.HIGH);

// Schedule loader for droppable of tertiary
loader.schedule("droppable tertiary", droppableTertiary);

loader.schedule("shoplist", function() {
    if ($("shoplist") && ShopList)
      shoplist = new ShopList($("shoplist"));
    // XXX the shoplist.js code depends on the global var shoplist!
  });




var shoplist = null;


startLoader();

/* initialization end */



// ###################################
// ############### UTILS #############
// ###################################

/**
 * trim and replace repeated spaces, newlines and tabs with a single space:
 */
String.prototype.normalizeSpace = function() {
  return this.replace(/^\s*|\s(?=\s)|\s*$/g, "");
}


// ###################################
// ############## DIALOG #############
// ###################################

var AHDialog = Class.create();

AHDialog.prototype = {

  title: "",
  text: false,
  dialogName: "ah_dialog",

  initialize: function() {
    this.buttons = document.createElement("form");
    this.buttons.id = "dialog_buttons";
  },

  // Add a button to the bottom button bar:
  addButton: function(button) {
    // Wrap the button in the generic rounded
    // corner solution for buttons:
    var wrapper = document.createElement('span');
    wrapper.className = 'button'; // script it
    CorneredBox(wrapper);
    wrapper.appendChild(button);
    this.buttons.appendChild(wrapper);
  },

  addTitle: function(title) {
    this.title = title;
  },

  /**
   * Set the message text of the dialog.
   *
   * @deprecated
   */
  addText: function(text) {
    this.text = document.createElement("p");
    this.text.appendChild(document.createTextNode(text))
  },

  /**
   * Set the message text of the dialog.
   *
   * @param text The given text can contain HTML tags. Applied with innerHTML or
   * a DOM element.
   */
  setText: function(text) {
		if(typeof(text) == 'object'){
			this.text = document.createElement('div').appendChild(text);
		}
		else{
			this.text = document.createElement('p');
      this.text.innerHTML = text;
		}
  },

  defineDialog: function(dialog) {
   this.dialogName = dialog;
  },

  /**
   * Handle the close_button events, removing the dialog.
   * Calls this.destroy in the end.
   */
  _onDestroyHandler: function (e) {
    if ($('ok_button')) { //XXX should be removing all buttons...
      Event.stopObserving($('ok_button', 'click'));
    }
    var cbutton = $('close_button');
    Event.stopObserving(cbutton,'click');
    this.destroy();
  },

  /**
   * Adds a `Cancel` button with the given text label.
   */
  addDestroyer: function(label) {
    var button = document.createElement("input");
    button.value = label;
    button.id = "close_button";
    button.className = 'buttonelm';
    button.type = 'button';
    Event.observe(button, 'click', this._onDestroyHandler.bind(this));
    this.addButton(button);
  },

  addAction: function(label, action) {
    var button = document.createElement("input");
    button.value = label;
    button.id = "ok_button";
    button.className = 'buttonelm';
    button.type = 'button';
    Event.observe(button,'click',action);
    this.addButton(button);
  },

  destroy: function() {
    $(this.dialogName + "_bg").remove();
    $(this.dialogName).remove();

    if ($("to_user_logout")) {
      var toUserLogger = $("to_user_logout");
      if (toUserLogger && !toUserLogger.hasClassName("deselected")) {
        new Effect.Highlight(toUserLogger, {
            duration: 0.5,
            startcolor: "#def0f8",
            endcolor: "#ffffff",
            afterFinish: function() {
              toUserLogger.style.background = "";
              toUserLogger.addClassName("deselected");
            }
          });
      }
	}
    // Show pluginelements
    var pluginElements = (ua.ie6) ? $$("embed", "object", "div.kaart", "select")
                                  : $$("embed", "object", "div.kaart");
    pluginElements.each(function (pluginElement) {
      pluginElement.setStyle({ "visibility": "visible" });
    });
  },

  /**
   * Position the given element vertically in center 'after' insertion into
   * the DOM
   */
  centerposition: function(elm) {
    // Get the viewport dimension height:
    var height;
    // Do some feature checks:
    if (window.innerHeight) {
      // All except Explorer
      height = window.innerHeight;
    } else if (document.documentElement
        && document.documentElement.clientHeight) {
      // Explorer 6 Strict Mode
      height = document.documentElement.clientHeight;
    } else if (document.body) {
      // Other Explorers
      height = document.body.clientHeight;
    }
    var pos = ((height - $(elm).getDimensions().height) / 2);
    // Add scroll offset:
    if (window.scrollY) {
      pos += window.scrollY;
    } else if (window.pageYOffset) {
      pos += window.pageYOffset;
    } else if (document.documentElement.scrollTop) { // IE7
      pos += document.documentElement.scrollTop;
    } else if (document.body.scrollTop) { // IE6
      pos += document.body.scrollTop;
    }
    elm.style.top = pos + 'px';
  },

  build: function() {
    var body = $$("body")[0];
    var dialogBg = document.createElement("div");
    dialogBg.id = this.dialogName + "_bg";
    dialogBg.style.height = body.getDimensions().height + "px";
    this.dialog = document.createElement("div");
    this.dialog.id = this.dialogName;
    if (this.title != "") {
      this.dialog.appendChild(document.createElement("h3")).appendChild(document.createTextNode(this.title));
    }
    if (this.text) {
      this.dialog.appendChild(this.text);
    }
    this.dialog.appendChild(this.buttons);

    body.style.position = "relative";
    $(body).appendChild(dialogBg);
    $("ah_dialog_bg").setStyle({ opacity: 0.5 });

    // Hide pluginelements
    var pluginElements = (ua.ie6) ? $$("embed", "object", "div.kaart", "select")
                                  : $$("embed", "object", "div.kaart");
    pluginElements.each(function (pluginElement) {
      pluginElement.setStyle({ "visibility": "hidden" });
    });

    this.dialog.style.visibility = 'hidden';
    body.appendChild(this.dialog);
    this.dialog.style.top = 0;
    this.centerposition(this.dialog);
    this.dialog.style.visibility = 'visible';
  }
}


// ###################################
// ########## MORE BORDERS ###########
// ###################################

function setupBorders(nl) {
  if (!nl) return;
  nl.each(function(container) {
    var className = container.className + "_border ";
    container.className += " " + className + "border_1";
    var n2 = document.createElement("div");
    n2.className = className + "border_2";
    var n3 = document.createElement("div");
    n3.className = className + "border_3";
    var n4 = document.createElement("div");
    n4.className = className + "border_4";
    var n5 = document.createElement("div");
    n5.className = className + "border_5";
    // move content into border_5:
    for (var n = container.firstChild; n; n = container.firstChild)
      n5.appendChild(n);
    n4.appendChild(n5);
    container.appendChild(n2);
    container.appendChild(n3);
    container.appendChild(n4);
  });
}

// ###################################
// ############# NOTICES #############
// ###################################

var ErrorNoticesZIndex = 1;

function setupErrorNotices() {
  var nl = $$("div.error_notices");
  setupBorders(nl);
  if (nl) nl.reverse();
  nl.each(function(n) {
    n.parentNode.style.zIndex = ErrorNoticesZIndex++;
    var onFieldFocus = function(e) {
      var that = Event.element(e);
      for (var parent = that.parentNode; parent; parent = parent.parentNode) {
        if (parent.nodeType == 1 && $(parent).hasClassName("fields")) {
          $(parent).style.zIndex = ErrorNoticesZIndex++;;
          break;
        }
      }
    };
    var iterator = function(field) {
      Event.observe(field, "focus", onFieldFocus);
    }
    var inputs = $A(n.parentNode.getElementsByTagName("input"));
    inputs.each(iterator);
    var selects = $A(n.parentNode.getElementsByTagName("select"));
    selects.each(iterator);
    var textareas = $A(n.parentNode.getElementsByTagName("textarea"));
    textareas.each(iterator);
    Event.observe(n, 'click', function(e) {
      if (inputs.length > 0) inputs[0].focus();
      else if (selects.length > 0) selects[0].focus();
      else if (textareas.length > 0) textareas[0].focus();
    });
  });
}

var WarningNoticesZIndex = 1;
function setupWarningNotices() {
  var nl = $$("div.warning_notices");
  setupBorders(nl);
  if ( ! nl) return;
  if (nl) nl.reverse(); // makes the notices overlap in the right order
  nl.each(function(n) {
    n.parentNode.style.zIndex = WarningNoticesZIndex++;
    var onFieldFocus = function(e) {
      var that = Event.element(e);
      that.parentNode.style.zIndex = WarningNoticesZIndex++;;
      // get to the notice field (it's a div preceding the input
      // and label):
      var elm = that.previous();
      while (elm) {
        // BWI added to hide error div before showing warning
				if (elm.tagName == 'DIV' && elm.hasClassName('error_notices')){
					elm.setStyle({display: 'none'});
				}
				else if (elm.tagName == 'DIV'
            && Element.hasClassName(elm, 'warning_notices')) {
          // repos the warning for smaller input fields
          elm.style.left = (that.getWidth() + that.offsetLeft + 7) + 'px';
          elm.style.visibility = 'visible';
          break;
        }
        elm = elm.previous();
      }
    };
    var onFieldBlur = function(e) {
      var that = Event.element(e);
      var elm = that.previous();
      while (elm) {
        if (elm.tagName == 'DIV'
            && Element.hasClassName(elm, 'warning_notices')) {
          elm.style.visibility = 'hidden';
          break;
        }
        elm = elm.previous();
      }
    };
    var iterator = function(field) {
      Event.observe(field, "focus", onFieldFocus);
      Event.observe(field, "blur", onFieldBlur);
    }
    var inputs = $A(n.parentNode.getElementsByTagName("input"));
    inputs.each(iterator);
    var selects = $A(n.parentNode.getElementsByTagName("select"));
    selects.each(iterator);
    var textareas = $A(n.parentNode.getElementsByTagName("textarea"));
    textareas.each(iterator);
    Event.observe(n, 'click', function(e) {
      if (inputs.length > 0) inputs[0].focus();
      else if (selects.length > 0) selects[0].focus();
      else if (textareas.length > 0) textareas[0].focus();
    });
  });
}

/*
Login confirm
Displays an extra AHDialogbox in case a shoppinglist or a unsaved cookbook is about to be overwritten.
*/
function setupLoginConfirm() {
  var loginForms = $$("form#loginForm");
  loginForms.each(function(loginForm) {
    Event.observe(loginForm, 'submit', function(event) {
      checkUserStatus(Event.element(event));
      Event.stop(event);
    });
  });
}

// Checking the user's gathered items and whether (s)he has a status C/D or not
function checkUserStatus(submittedForm) {
  var cookbookcheck = new Ajax.Request("/rev05/requests/cookbook_check.jsp", {
    method: "get",
    onComplete: function(transport) {
      var responseXML = null;

      if (window.ActiveXObject){
        responseXML = new ActiveXObject("Microsoft.XMLDOM");
        responseXML.async = "false";
        responseXML.loadXML(transport.responseText);
      } else {
        var parser = new DOMParser();
        responseXML = parser.parseFromString(
            transport.responseText, "text/xml");
      }

      var status = responseXML.getElementsByTagName("status")[0];
      if (typeof responseXML.getElementsByTagName("status")[0] == "undefined"){
        // Something went wrong, don't show cookbook-alert, just login
        submittedForm.submit();
      }
      else if (status.firstChild.nodeValue !== "empty") {
        // There is something added to the shoplist or to the cookbook, show
        // cookbook-alert
        if (!$("user") || ($("user")
            && !$("user").hasClassName("registered"))) {
          var loginDialog = new AHDialog();
          loginDialog.addText("Hiermee gaan de zojuist ingevoerde gegevens in de Boodschappenlijst en Mijn Bewaarde recepten verloren. Wanneer u eerder ingelogd bent geweest en een Boodschappenlijst aangemaakt hebt, zal deze automatisch getoond worden. Wilt u doorgaan?");
          loginDialog.addTitle("Inloggen");
          loginDialog.addAction("Ja",function(){
            submittedForm.submit();
            loginDialog.destroy();
          });
          loginDialog.addDestroyer("Nee");
          loginDialog.build();
        }
        else {
          submittedForm.submit();
        }
      }
      else {
        // Nothing added to the shoplist or to the cookbook, show cookbook-alert
        submittedForm.submit();
      }
    }
  });
}

// ###################################
// ############ COOKBOOK #############
// ###################################

/*
Setup Cookbook (Mijn bewaarde recepten) drag & drop
The form has to be added to the DOM in order to make it work in all browsers
*/
function setupCookbook() {
  // Setup the Cookbook dropzone
  if ($("cookbook_sidebar") || $("temp_recipe_holder")) {
  var cb = $("cookbook_sidebar") ? $("cookbook_sidebar") : $("temp_recipe_holder");
  if (cb && (typeof Droppables !== "undefined")) {
    Droppables.add(cb, {
      accept: ["recipe", "result_recipe"],
      hoverclass:"cookbook_hover",
      onDrop: function(element) {
        var cookbooks = $$("#recept_to_shoplist .cookbook a", "#user_options .cookbook a");
        if (cookbooks.length > 0) {
          for (var i = 0; i < cookbooks.length; i++) {
            // IE drag misbehaviour fix to make ondrop actions work.
            var cookbookHref = cookbooks[i].href.toString().toQueryParams();

            if (getCookie("ah_collected_recipe") == 1) {
              saveToCookbook(cookbookHref.action, cookbookHref.source, cookbookHref.id, cookbookHref.recipeId);
            }
            else if (!$("user") || ($("user") && !$("user").hasClassName("registered"))) {
              setupSaveToCookbookDialog(cookbookHref.action, cookbookHref.source, cookbookHref.id, cookbookHref.recipeId);
            }
            else {
              saveToCookbook(cookbookHref.action, cookbookHref.source, cookbookHref.id, cookbookHref.recipeId);
            }
          }
          return false;
        }
        return false;
      }
    });
  }
  }

  // Setup cookbookrecipes mouseoverstyles for ie6
  var cb_items = $$("div#hide_my_cb_info ul li");
  for (var i = 0; i < cb_items.length; i++) {
    Event.observe(cb_items[i], 'mouseover', function (event) {
      Event.element(event).addClassName("hover");
    });
    Event.observe(cb_items[i], 'mouseout', function (event) {
      Event.element(event).removeClassName("hover");
    });
  }

  var saveToCookBookAnchor = $$("ul.options li.cookbook a")[0];
  if (saveToCookBookAnchor) {
    Event.observe(saveToCookBookAnchor, 'click', function(event) {
      var saveToCookBookHref = Event.element(event).href.toString().toQueryParams();
      if (getCookie("ah_collected_recipe") == 1) {
        saveToCookbook(saveToCookBookHref.action, saveToCookBookHref.source, saveToCookBookHref.id, saveToCookBookHref.recipeId);
      }
      else if (!$("user") || ($("user") && !$("user").hasClassName("registered"))) {
        setupSaveToCookbookDialog(saveToCookBookHref.action, saveToCookBookHref.source, saveToCookBookHref.id, saveToCookBookHref.recipeId);
      }
      else {
        saveToCookbook(saveToCookBookHref.action, saveToCookBookHref.source, saveToCookBookHref.id, saveToCookBookHref.recipeId);
      }
      Event.stop(event);
    });
  }
}

function setupSaveToCookbookDialog(cookbookAction, cookbookSource, cookbookId, cookbookRecipeId) {
  var saveToCookbookDialog = new AHDialog();
  var saveToCookbookDialogText = "";
  saveToCookbookDialogText += "Klik op OK om het recept aan de Bewaarde Recepten toe te voegen. ";
  saveToCookbookDialogText += "Als u een Kookschrift heeft, log dan eerst in. ";
  saveToCookbookDialogText += "Na het inloggen kunt u vervolgens het recept aan uw Kookschrift toevoegen.";
  saveToCookbookDialog.addText(saveToCookbookDialogText);
  saveToCookbookDialog.addTitle("Recept opslaan");
  saveToCookbookDialog.addAction("Ok",function(){
    saveToCookbook(cookbookAction, cookbookSource, cookbookId, cookbookRecipeId);
    saveToCookbookDialog.destroy();
  });
  saveToCookbookDialog.addDestroyer("Annuleren");
  saveToCookbookDialog.build();
  setCookie("ah_collected_recipe", 1, 7);

}

function saveToCookbook(cookbookAction, cookbookSource, cookbookId, cookbookRecipeId) {
  var body = $$("body")[0];
  var formSaveToCookbook = document.createElement("form");
  var actionSaveToCookbook = document.createElement("input");
  var sourceSaveToCookbook = document.createElement("input");
  var idSaveToCookbook = document.createElement("input");

  formSaveToCookbook.id = "form_save_to_cookbook";
  formSaveToCookbook.method = "get";
  formSaveToCookbook.action = "/servlet/flow";

  actionSaveToCookbook.type = "hidden";
  actionSaveToCookbook.name = "action";
  actionSaveToCookbook.value = cookbookAction;

  sourceSaveToCookbook.type = "hidden";
  sourceSaveToCookbook.name = "source";
  sourceSaveToCookbook.value = cookbookSource;

  idSaveToCookbook.type = "hidden";
  if (typeof cookbookId !== 'undefined') {
    idSaveToCookbook.name = "id";
    idSaveToCookbook.value = cookbookId;
  } else {
    idSaveToCookbook.name = "recipeId";
    idSaveToCookbook.value = cookbookRecipeId;
  }

  formSaveToCookbook.appendChild(actionSaveToCookbook);
  formSaveToCookbook.appendChild(sourceSaveToCookbook);
  formSaveToCookbook.appendChild(idSaveToCookbook);
  body.appendChild(formSaveToCookbook);

  formSaveToCookbook.submit();
}




// ###################################
// ######### MORE INIT ???? ##########
// ###################################

/* Convert anchors to popup buttons: */
loader.schedule("multiple non-related setup topics", function() {
  // logoff
  var l = $("to_user_logout");
  if (l) {
    l.addClassName("deselected");
    Event.observe(l, 'click', function(evt) {
       l.removeClassName("deselected");
       var logoutDialog = new AHDialog();
      logoutDialog.addText("U logt nu uit. Alle privacy gevoelige onderdelen zijn hierdoor afgeschermd. Na het uitloggen kunt u nog steeds gebruik maken van uw Boodschappenlijst.");
      logoutDialog.addTitle("Uitloggen");
      // only use this function if you want to create a unique dialog (default
      // dialog is called ah_dialog)
      logoutDialog.addAction("Uitloggen",function(){
        removeCookie("ah_collected_recipe");
        document.location.href = l.href;
      });
      logoutDialog.addDestroyer("Annuleren");
      logoutDialog.build();
      Event.stop(evt);
    });
  }

  

  // mail-a-friend links (may appear more than once on a page):
  var mailers = $$("a.mail-a-friend");
  mailers.each(function (mailer) {
    Event.observe(mailer, 'click', function(event) {
      window.open(mailer.getAttribute("href"),
        "_blank", "width=420,height=660,top=0,left=0,scrollbars=yes,location=no,modal");
      Event.stop(event);
    });
  });

  // Generic popup
  var popups = $$("a.popup");
  popups.each(function (popup) {
    Event.observe(popup, 'click', function(event) {
      window.open(popup.getAttribute("href"), "_blank", "width=480,height=575,scrollbars=yes");
      Event.stop(event);
    });
  });

});


/**
 * Setup stickers
 */
function setupStickers() {
  var i = 0;
  var stickerContainers = $$('.sticker');
  stickerContainers.each(function(stickerContainer) {
    if (deconcept.SWFObjectUtil.getPlayerVersion().major >= 8
        && (stickerContainer.nodeName == 'DIV' || stickerContainer.nodeName == 'LI') ) {
      var stickertypes = new Array();
      stickertypes['stickertype1'] = new Array();
      stickertypes['stickertype2'] = new Array();
      stickertypes['stickertype3'] = new Array();
      stickertypes['stickertype4'] = new Array();
      stickertypes['stickertype1']['alt'] = '/_ui/jokers/jokersticker.png';
      stickertypes['stickertype1']['animation'] = '/_swf/jokers/jokersplakken_m.swf';
      stickertypes['stickertype1']['width'] = '120';
      stickertypes['stickertype1']['height'] = '113';

      stickertypes['stickertype2']['alt'] = '/_ui/jokers/jokersticker.png';
      stickertypes['stickertype2']['animation'] = '/_swf/jokers/jokersplakken_l.swf';
      stickertypes['stickertype2']['width'] = '172';
      stickertypes['stickertype2']['height'] = '160';

      stickertypes['stickertype3']['alt'] = '/_ui/jokers/jokerstickerslimmekeus.png';
      stickertypes['stickertype3']['animation'] = '/_swf/jokers/jokersslimmekeuze_m.swf';
      stickertypes['stickertype3']['width'] = '120';
      stickertypes['stickertype3']['height'] = '113';

      stickertypes['stickertype4']['alt'] = '/_ui/jokers/jokersticker.png';
      stickertypes['stickertype4']['animation'] = '/_swf/jokers/jokersslimmekeuze_l.swf';
      stickertypes['stickertype4']['width'] = '172';
      stickertypes['stickertype4']['height'] = '160';

      var stickertype = stickertypes['stickertype1'];
      var elClassNames = stickerContainer.className.split(' ');
      for(var i = 0; i < elClassNames.length; i++) {
        if(typeof stickertypes[elClassNames[i]] !== 'undefined')
          stickertype = stickertypes[elClassNames[i]];
      }

      var sticker = document.createElement('div');
      var stickerId = 'sticker_' + i;
      sticker.setAttribute('id', stickerId);
      sticker.className = 'theme_sticker';
      var stickerSrc = stickertype['animation'];
      var stickerWidth = stickertype['width'];
      var stickerHeight = stickertype['height'];

      var stickerAlt = document.createElement('img');
      stickerAlt.src = stickertype['alt'];
      if(ua.ie6) {
        stickerAlt.style.visibility = 'hidden';
      }
      sticker.appendChild(stickerAlt);
      stickerContainer.appendChild(sticker);

      var fo = new SWFObject(stickerSrc, "sticker" + i, stickerWidth, stickerHeight, "8", "#FFFFFF");
      fo.addParam("quality", "high");
      fo.addParam("menu", "false");
      fo.addParam("flashvars", "");
      fo.addParam("wmode", "transparent");
      fo.addParam("allowScriptAccess", "always");
      showSWFObject(fo, stickerId);
      i++;
    }
  });
}




/* Banners animator ************/
var bannerReels = new Object();
var bannerFadeDuration = 2000;
var bannerFadeInterval = 6000;

function spinSingleBanner(bannerId) {
  var bannerReel = bannerReels[bannerId];

  if (bannerReel.timer) clearTimeout(bannerReel.timer);

  if (((bannerReel.currentBanner+1) >= bannerReel.banners.length)
        || (typeof bannerReel.currentBanner == "undefined")) {
    if (typeof bannerReel.banners[bannerReel.currentBanner] !== "undefined")
      new Effect.Fade(bannerReel.banners[bannerReel.currentBanner], bannerFadeDuration);
    bannerReel.currentBanner = 0;
    if (typeof bannerReel.banners[bannerReel.currentBanner] !== "undefined")
      new Effect.Appear(bannerReel.banners[bannerReel.currentBanner], bannerFadeDuration);
  }
  else {
    if (typeof bannerReel.banners[bannerReel.currentBanner] !== "undefined")
      new Effect.Fade(bannerReel.banners[bannerReel.currentBanner], bannerFadeDuration);
    bannerReel.currentBanner++;
    if (typeof bannerReel.banners[bannerReel.currentBanner] !== "undefined")
      new Effect.Appear(bannerReel.banners[bannerReel.currentBanner], bannerFadeDuration);
  }

  // Recursively call this function for the current banner.
  var timedCall = "spinSingleBanner('" + bannerId + "')";
  bannerReel.timer = setTimeout(timedCall, bannerFadeInterval);

  // Clean up!
  timedCall = bannerReel = null;
}

function setupBannerStrips() {
  // Fetch all bannerstrips.
  bannerReels = $$(".bannerstrip .banner_reel");

  var bannerFadeOffset = 2000;

  bannerReels.each(function(bannerReel, bannerId) {
    var winBannerReel = bannerReels[bannerId];

    winBannerReel.banners = bannerReel.getElementsByTagName("a");

    if (winBannerReel.banners.length > 1) {
      // Turn off all banners except the first within this reel.
      for(var j = 1; j < winBannerReel.banners.length ; j++) {
        winBannerReel.banners[j].style.display = "none";
      }
      // Set starting point for the animation.
      winBannerReel.currentBanner = 0;

      // Build timer function call.
      var timedCall = "spinSingleBanner('" + bannerId + "')";
      winBannerReel.timer = setTimeout(timedCall, bannerFadeOffset);
      if(bannerFadeOffset < 5000) {
        bannerFadeOffset = (bannerFadeOffset + 2000);
      }
    }
  });
}
/* Banners animator - End ************/

// ###################################
// ###########  FOLDOUT  #############
// ###################################

// Stepping stone for real foldout loader, to start foldout setup
// before shoplist.
function setupFoldFromDefaultJS() {
  if (typeof setupFold == 'function') {
    setupFold();
  }
}


// ###################################
// ######## DROPPABLE TERTIARY #######
// ###################################
//
// Make tertiary column droppable for recipes and products.
function droppableTertiary() {
  // Only build droppable tertiary if primary and shoplist exist.
  if (!$('primary') || !$('shoplist')) return;

  // For now, disable on household pages to prevent large whitespace
  // after folding of tips.
  if ($$('body')[0].className.indexOf('household') > -1) return;

  var primaryHeight = $('primary').getHeight();
  var shoplistHeight = ($('shoplist')) ? $('shoplist').getHeight() : 0;
  var cookbookHeight = ($('cookbook_sidebar_container')) ? $('cookbook_sidebar_container').getHeight() : 0;

  if ((primaryHeight > $('tertiary').getHeight()) && $('shoplist')) {
	var dropArea = new Insertion.Bottom($('tertiary'),
      "<div id=\"tertiary_droppable_outer\"><div id=\"tertiary_droppable_inner\">&nbsp;</div></div>");
    var dropAreaHeight = (primaryHeight - shoplistHeight - cookbookHeight - 50) + "px";
    $('tertiary_droppable_inner').setStyle({'height': dropAreaHeight, 'margin-top': "10px"});
  }
}


// ########################################
// # Recipe results enhanced view IE6 fix #
// ########################################

/*
(IE 6 Bugfix, absolute positioned images on hover)
*/
function disabledImgIE6() {
  if(!ua.ie6)
    return;
  var sli = $$("ul.enhanced li");
  sli.each(function(li) {
    Event.observe(li, 'mouseover', function(e) {
      if (!$(li).nextSibling) {
        Event.stop(e);
        return false;
      }

      var nextElem = $(li).nextSibling;
      while(typeof nextElem != "object")
        nextElem = nextElem.nextSibling;
      nextElem.getElementsByTagName("img")[0].style.visibility = "hidden";
    });

    Event.observe(li, 'mouseout', function(e) {
      if (!$(li).nextSibling) {
        Event.stop(e);
        return false;
      }
      var nextElem = $(li).nextSibling;
      while(typeof nextElem != "object") nextElem = nextElem.nextSibling;
        nextElem.getElementsByTagName("img")[0].style.visibility = "visible";
    });
  });
}

try {
  document.execCommand("BackgroundImageCache", false, true);
} catch(e) {}

/* function used to detect flash and hide container if not available */
function flashContentNoAlternative(id, flashVersion) {
	if ((typeof deconcept!="undefined") && deconcept.SWFObjectUtil.getPlayerVersion().major < flashVersion) {
		if (document.getElementById(id)) document.getElementById(id).style.display = 'none';
	}
}

// ###################################
// ######## process news block #######
// ###################################
//
// process news blocks in supertheme.

function NewsBlocks(n) {

	// get date
	var newsdate = $(n).getElementsBySelector('p.datum')[0];
	if (!newsdate) return;

	var newstitle = $(n).getElementsBySelector('h2')[0];
	if (!newstitle) return;
	$(newstitle).remove();


	n.id = 'news_' + newsdate.innerHTML;

	n.innerHTML = '<h2>'+newstitle.innerHTML+'</h2><div class="newsBody" id="body_'+n.id+'">'+n.innerHTML+'</div>';

	if (getCookie(n.id)=='hidden') {
		$(n).addClassName('hidden');
		$('body_'+n.id).hide();
	}

	// add controller
	var closeButton = document.createElement('a');
	closeButton.className = 'close';
	closeButton.innerHTML = 'sluiten';
	n.appendChild(closeButton);

	$$('#'+n.id+' a, #'+n.id+' h2').each(function(a){
		Event.observe(a, 'click', function() {
			if (!$(n).hasClassName('hidden')) {
				$(n).addClassName('hidden');
				new Effect.BlindUp($('body_'+n.id), {duration: 0.4});
				// set in cookie
				setCookie(n.id,'hidden',365);
			}
			else {
				$(n).removeClassName('hidden');
				new Effect.BlindDown($('body_'+n.id), {duration: 0.4});
			}

  		});
	});

}
NewsBlocks.setup = function(nl) {
  if (!nl.length) return;
  nl.each(function(n) {
    if (n) new NewsBlocks(n);
  });
};

loader.schedule("newsblokken verrijking", function(){
  NewsBlocks.setup($$('.themapagina .section.news'));
});

AHEnlargeImages = new Object();

AHEnlargeImages.processImageBlocks = function() {
	$$('#primary p.vergroter').each(function(imageBlock){
		var img1 = $(imageBlock).getElementsBySelector('img')[0];
		var img2 = $(imageBlock).getElementsBySelector('img')[1];

		if (!img1 || !img2) return;
		img1.enlarged = img2.getAttribute('src');
		img1.enlargedWidth = img2.getAttribute('width');
		img1.enlargedHeight = img2.getAttribute('height');

		var enlargeButton = document.createElement('a');
		enlargeButton.className = 'enlarge';
		enlargeButton.innerHTML = 'Vergroten';
		imageBlock.appendChild(enlargeButton);

		$(img2).remove();

		Event.observe(imageBlock, 'click', function(e) {

			var img = $(this).getElementsBySelector('img')[0];


			if ($('imageEnlarger')) {
				$('imageEnlarger').remove();
				$(AHEnlargeImages.openImage).removeClassName('imageEnlarged');
				if (AHEnlargeImages.openImage==this) {
					AHEnlargeImages.openImage = null;
					return;
				}

			}
			AHEnlargeImages.openImage = this;
			$(AHEnlargeImages.openImage).addClassName('imageEnlarged');
			var div = document.createElement('div');
			div.className = 'imageEnlarger';
			div.id = 'imageEnlarger';
			if (img.alt) div.innerHTML = '<h4>'+img.alt+'</h4>';
			div.innerHTML += '<a class="close">sluiten</a>';
			div.innerHTML += '<img src="' + img.enlarged + '" width="'+img.enlargedWidth+'"  height="'+img.enlargedHeight+'"/>';

			var offsets = document.viewport.getScrollOffsets();

    		var top = (document.viewport.getHeight() - img.enlargedHeight)/2 + offsets.top;
    		var left = (document.viewport.getWidth() - img.enlargedWidth)/2 + offsets.left;

    		if (top < (offsets.top+50)) top = (offsets.top+50);
    		if (left < (offsets.eft+20)) left = (offsets.left+20);

    		div.style.left = left + 'px';
    		div.style.top = top + 'px';


			Event.observe(div, 'click', function(e) {
				$(this).remove();
				$(AHEnlargeImages.openImage).removeClassName('imageEnlarged');
				AHEnlargeImages.openImage = null;
			});
			document.body.appendChild(div);
  		});

  		$(imageBlock).addClassName('enlargeProcessed');

	});
}

if (loader) {
	loader.schedule("plaatjes vergroter", AHEnlargeImages.processImageBlocks);
}

AHAnimation = new Object();

AHAnimation.Animation = function(elementId, startPoint, flightPlans) {
	this.elementId = elementId;
	this.startPoint = startPoint;
	this.flightPlans = flightPlans;

	var executeFlightPlans = function(from, index) {
		if (index >= flightPlans.length || (flightPlans[index] == null)) {
			return;
		}

		setTimeout(function() {
			new Effect.Curve(elementId,{
					duration: flightPlans[index].duration,
					curve: new BezierCurve(
						from.x, from.y,
						flightPlans[index].fromDir.x, flightPlans[index].fromDir.y,
						flightPlans[index].toDir.x, flightPlans[index].toDir.y,
						flightPlans[index].to.x, flightPlans[index].to.y
					),
					afterFinish: function() {
						executeFlightPlans(flightPlans[index].to, index + 1);
					}
			});
		}, flightPlans[index].timeBefore);
	}

	this.start = function() {
		$(elementId).setStyle({
			display:	'block',
			position:	'absolute',
			left:		startPoint.x + 'px',
			top:		startPoint.y + 'px',
			zIndex:	10000
		});
		executeFlightPlans(startPoint, 0);
	}

}

AHAnimation.Coordinates = function(x, y) {
	this.x = x;
	this.y = y;
}

AHAnimation.FlightPlan = function(fromDir, toDir, to, duration, timeBefore) {
	this.fromDir = fromDir;
	this.toDir = toDir;
	this.to = to;
	this.duration = duration;
	this.timeBefore = timeBefore;
}

AHAnimation.coordinatesForElement = function(element, offsetX, offsetY) {
	var x;
	var y;
	if (typeof element == 'undefined') {
		x = 0;
		y = 0;
	} else {
		x = element.viewportOffset().left;
		y = element.viewportOffset().top;
	}
	if (offsetX != null) {
		x += offsetX;
	}
	if (offsetY != null) {
		y += offsetY;
	}

	return new AHAnimation.Coordinates(x, y);
}


//function Coordinates (x, y) {
//	this.x = x;
//	this.y = y;
//}
//
//function FlightPlan(fromDir, toDir, to, duration, timeBefore) {
//	this.fromDir = fromDir;
//	this.toDir = toDir;
//	this.to = to;
//	this.duration = duration;
//	this.timeBefore = timeBefore;
//}
//
//function coordinatesForElement(element, offsetX, offsetY) {
//	var x;
//	var y;
//	if (typeof element == 'undefined') {
//		x = 0;
//		y = 0;
//	} else {
//		x = element.viewportOffset().left;
//		y = element.viewportOffset().top;
//	}
//	if (offsetX != null) {
//		x += offsetX;
//	}
//	if (offsetY != null) {
//		y += offsetY;
//	}
//
//	return new Coordinates(x, y);
//}

//function executeFlightAnimations(elementId, from, flightPlans, index) {
//
//	if (index >= flightPlans.length || (flightPlans[index] == null)) {
//		return;
//	}
//
//	setTimeout(function() {
//		new Effect.Curve(elementId,{duration: flightPlans[index].duration, curve: new BezierCurve(
//			from.x, from.y,
//			flightPlans[index].fromDir.x, flightPlans[index].fromDir.y,
//			flightPlans[index].toDir.x, flightPlans[index].toDir.y,
//			flightPlans[index].to.x, flightPlans[index].to.y
//		), afterFinish: function() {
//			executeFlightAnimations(elementId, flightPlans[index].to, flightPlans, index + 1);
//		}});
//	}, flightPlans[index].timeBefore);
//}

//function startFlightAnimation(elementId, from, flightPlans) {
//	$(elementId).setStyle({
//	  display:	'block',
//	  position:	'absolute',
//	  left:		from.x + 'px',
//	  top:		from.y + 'px',
//	  zIndex:	10000
//	});
//	executeFlightAnimations(elementId, from, flightPlans, 0);
//}


// vim: set ts=2 sw=2 expandtab
