﻿//
// HEMA Basket
// (c) 2010 Paul Steffens
// Macaw Rich Internet Solutions, Schiphol-Rijk
// http://www.macaw.nl

//
// create closure
//

(function($) {

    //
    // plugin definition
    //

    $.fn.basketshop = function(action, options) {

        // geen configuratie, wel een actie opgegeven
        if (typeof (action) == 'object') {
            options = action;
            action = 'init';
        }

        // geen configuratie en actie opgegeven, basket starten met defaults
        if (typeof (action) == 'undefined') {
            action = 'init';
        }



        return this.each(function() {

            var opts = $.extend({}, $.fn.basketshop.defaults, options);

            var $this = this;

            if (!$($this).data("basket.cfg")) {

                $($this).data("basket.cfg", opts);

            } else {
                opts = $($this).data("basket.cfg")
            }


            switch (action) {
                case "init":

                    // get max number to show from classname (overrules attribute)
                    // set if basket is permanently visible even when empty
                    tempStr = $($this).attr("class").split(" ");
                    for (i = 0; i < tempStr.length; i++) {
                        if (tempStr[i].match(/\bmaxvisible/)) {
                            opts.maxItemsVisible = tempStr[i].substring(10);
                        }
                        if (tempStr[i] == "fixed") {
                            opts.fixedBasket = true;
                        }
                    }

                    opts.list = $($this).find(".h-basketlist");
                    opts.allItems = opts.list.find("li");
                    opts.allItemsCount = opts.allItems.length;
                    opts.expButton = $($this).find(".h-basketMore");

                    // zet events op delete knoppen 
                    //opts.allItems.find(".h-basketDelete").click(function(event) {
                    //    opts.removeItem = $(this).parent().index();
                    //    $($this).basketshop("remove");
                    //    event.preventDefault();
                    //});

                    // zet events op uitklap knoppen
                    opts.expButton
            .find("a")
               .click(function(event) {
                   this.blur();
                   $($this).basketshop("slide");
                   event.preventDefault();
               })
               .end()
            .find(".full")
               .css("display", "block") // anders toggled de link met display: inline
               .hide();

                    // pas de lijst aan als deze langer is dan maxvisible     
                    if (opts.maxItemsVisible < opts.allItemsCount) {
                        opts.list.css("height", opts.maxItemsVisible * opts.itemHeight);
                        opts.allItems.removeClass("hidden");
                    }

                    $($this)
            .basketshop("checkExpButton") // moet "meer" knop getoond worden?
            .basketshop("checkOrderButton"); // moet bestelknop getoond worden?

                    opts.init = false;

                    // animeer toegevoegde items
                    opts.list.find(".added")
            .css("display", "none")
            .removeClass("added")
            .slideDown(500);

                    // animeer geupdate items  
                    opts.list.find(".updated")
            .css("display", "none")
            .css("width", "0%")
            .css("opacity", "0.3")
            .animate({
                width: '100%',
                opacity: 1
            }, 300, function() {
                // Animation complete.
                // en nog een keer...
                opts.list.find(".updated")
                     .css("width", "0%")
                     .css("opacity", "0.3")
                     .removeClass("updated")
                     .animate({
                         width: '100%',
                         opacity: 1
                     }, 300, function() {
                         // Animation complete.
                     });
            });


                    break;
                case "remove":

                    selectedItem = $(opts.allItems[opts.removeItem]);
                    selectedItemPostbackAction = selectedItem.find(".postbackhref");

                    // visueel verwijderen van item in html
                    selectedItem.slideUp(
                200, function() {

                    // Animation complete.

                    // cheating a bit, maar er komt toch een reload
                    opts.allItemsCount = opts.allItemsCount - 1;
                    opts.removeItem = null;

                    $($this)
                  .basketshop("checkExpButton") // moet expButton verwijdert worden?
                  .basketshop("checkOrderButton"); // moet bestelknop onzichtbaar worden?

                    //moet de basket helemaal weg?   
                    if (opts.allItemsCount < 1 && !opts.fixedBasket) {
                        $($this)
                     .delay(800)
                        // link naar besteloverzicht moet ook weg
                     .find(".h-basketheader a")
                        .remove()
                        .end()
                        // kill stuff for IE7 (blech!)
                     .find("p")
                        .css("position", "static")
                        .end()
                        // and back to the real job...
                     .animate({
                         opacity: 0.1
                     }, 400, function() {
                         // Animation complete.
                         $($this)
                         // kill stuff for IE7 (blech!)
                           .find(".h-basketlist-bottom")
                              .css("position", "static")
                              .css("display", "none")
                              .end()
                         // and back to the real job...
                           .animate({
                               opacity: 0,
                               height: 0
                           }, 400, function() {
                               // Animation complete.
                               // delete callback
                               selectedItemPostbackAction[0].click();
                           });
                     });
                    } else {
                        // delete callback
                        selectedItemPostbackAction[0].click();
                    }

                });


                    break;
                case "checkExpButton":

                    if (opts.allItemsCount > opts.maxItemsVisible) { // lijst is te lang

                        if (opts.expButton.css("display") == "none") {  // knop is niet zichtbaar

                            // 1e keer of niet?
                            if (!opts.init) {
                                // knop mag straks animeren
                                var slidespeed = 200;
                            } else {
                                // basket initialiseert dus knop moet direct verschijnen en lijst gelocked worden op max hoogte
                                var slidespeed = 0;
                                opts.list.css("height", (opts.maxItemsVisible * opts.itemHeight)); // blokkeer lengte van lijst
                            }

                            // nu evt. animeren (en aanpassen voor "ingeklapt" weergave)
                            opts.expButton
                     .find(".full")
                        .hide()
                        .end()
                     .find(".half")
                        .show()
                        .end()
                     .slideDown(slidespeed)
                     .removeClass("hidden");
                        } else {
                        }
                    } else { // lijst is niet te lang dus mag er geen knop zijn

                        if (opts.expButton.css("display") != "none") {
                            // de knop is zichtbaar

                            // 1e keer of niet?
                            if (!opts.init) {
                                // knop moet weg animeren
                                opts.expButton.slideUp(
                         200, function() {
                             // Animation complete.
                             opts.expButton // aanpassen voor "ingeklapt" weergave
                           .find(".full")
                              .hide()
                              .end()
                           .find(".half")
                              .show()
                              .end();
                         });
                                opts.list.css("height", "auto");
                            } else {
                                // knop mag straks animeren
                                // maar moet nu onzichtbaar blijven zonder hidden class
                                opts.expButton // aanpassen voor "ingeklapt" weergave
                        .hide()
                        .find(".full")
                           .hide()
                           .end()
                        .find(".half")
                           .show()
                           .end()
                        .removeClass("hidden");
                            }

                        } else {
                            // de knop is onzichtbaar
                            // juist configureren voor evt. later zichtbaar maken
                            // niet nodig ivm server postback
                            /*opts.expButton
                            .css("display","none")
                            .removeClass("hidden")
                            .find(".full")
                            .hide()
                            .end()
                            .find(".half")
                            .show()
                            .end();*/
                        }
                    }

                    break;
                case "checkOrderButton":

                    // 1e keer of niet?
                    if (!opts.init) { var slidespeed = 200 } else { var slidespeed = 0 }

                    if (!(opts.allItemsCount > 0)) {
                        // geen producten in mandje dus bestelknop verbergen
                        $($this)
                  .find("input")
                     .slideUp(slidespeed)
                     .end()
                  .find(".h-basketcontent > .kop")
                     .slideUp(slidespeed)
                     .end()
                  .find("ol") // fix voor IE7!
                     .css("height", "0");
                    } else {
                        // wel producten in mandje
                        if (opts.allItemsCount == 1 && opts.list.find(".added").length == 1) {
                            // als er slechts 1 is die net is toegevoegd gaan we de knop animeren
                            slidespeed = 400;
                            $($this)
                     .find("input")
                        .hide()
                        .removeClass("hidden")
                        .end()
                     .find(".h-basketcontent > .kop")
                        .hide()
                        .removeClass("hidden");
                        }

                        $($this)
                  .delay(slidespeed)
                  .find("input")
                     .slideDown(slidespeed)
                     .end()
                  .find(".h-basketcontent > .kop")
                     .slideDown(slidespeed)
                     .end()
                  .find("ol") // fix voor IE7!
                     .css("height", "auto");
                    }

                    break;
                case "slide":

                    if (opts.expButtonFull) {
                        opts.list.animate({ // inklappen
                            height: (opts.maxItemsVisible * opts.itemHeight)
                        }, 200 * (1 + ((opts.allItemsCount - opts.maxItemsVisible) / 4)), function() {
                            // Animation complete.
                            opts.expButton.find(".half")
                        .show();
                            opts.expButton.find(".full")
                        .hide();
                            opts.expButtonFull = false;
                        });
                    } else {
                        opts.list.animate({ // uitklappen
                            height: (opts.allItems.length * opts.itemHeight)
                        }, 200 * (1 + ((opts.allItemsCount - opts.maxItemsVisible) / 4)), function() {
                            // Animation complete.
                            opts.expButton.find(".half")
                        .hide();
                            opts.expButton.find(".full")
                        .show();
                            opts.list.css("height", "auto");
                            opts.expButtonFull = true;
                        });
                    }

                    break;
            };

        });
    };
    //
    // plugin defaults
    //
    $.fn.basketshop.defaults = {
        init: true,
        maxItemsVisible: 4,
        allItems: null,
        itemHeight: 30, // hoogte in px van 1 <li>
        removeItem: null,
        expButtonFull: false,
        fixedBasket: false
    };

    //
    // end of closure
    //
})(jQuery);
