/********************************************************************************************

 Dit bestand bevat een object met zaken die in elke shop gebruikt worden, maar niet
 generiek genoeg zijn voor ECube.js (dat ook in andere situaties gebruikt moet kunnen
 worden). Laadt het na Ecube.js maar voor Global.js
 
********************************************************************************************/
var EpagesShop = new Object();

/********************************************************************************************

    Voor alle AJAX-events zijn dit de functies die in een bepaald element een loadertje
    tonen. Je zult ze willen overrulen.
    
********************************************************************************************/
EpagesShop.ajax = new Object();
EpagesShop.ajax.showLoaderIn = function(elementObj){
    elementObj.innerHTML = 'een ogenblik geduld aub ...'
};
EpagesShop.ajax.removeLoaderFrom = function(elementObj) {
    return true;
}

/********************************************************************************************

    Ajax mandjes : de functie addToBasket wordt aan alle links en formulieren gehangen die 
    als class "addtobasket" hebben.

********************************************************************************************/

EpagesShop.miniBasket = new Object();
EpagesShop.miniBasket.basketElement = false;
ECube.registerOnLoadFunction(function(e){
    if(! EpagesShop.miniBasket.basketElement){
        var defaultBasketElement = $('minibasket');
        if(defaultBasketElement){
            EpagesShop.miniBasket.basketElement = defaultBasketElement;
        };
    };
});
EpagesShop.miniBasket.callBacks = new Object();
EpagesShop.miniBasket.semaphore = false;
// dit zijn de standaard callbacks. je kunt ze overrulen in Global.js, als je wilt.
// het gehele callBacks object wordt aan de Ajax.Requester doorgegeven
EpagesShop.miniBasket.callBacks.onCreate = function() {
    EpagesShop.miniBasket.semaphore = true; 
    if(EpagesShop.miniBasket.basketElement){
        EpagesShop.ajax.showLoaderIn(EpagesShop.miniBasket.basketElement);
    };
    return true;
};
EpagesShop.miniBasket.callBacks.onException = function(ajaxRequest, exceptionObject) { return exceptionObject };
EpagesShop.miniBasket.callBacks.onFailure = function() { return true };
EpagesShop.miniBasket.callBacks.onSuccess = function() { return true };
// standaard wordt de uitvoer getoond in een div met id minibasket
EpagesShop.miniBasket.callBacks.onComplete = function(transport) {
    EpagesShop.miniBasket.semaphore = false; 
    if(EpagesShop.miniBasket.basketElement){
        EpagesShop.ajax.removeLoaderFrom(EpagesShop.miniBasket.basketElement);
        EpagesShop.miniBasket.basketElement.innerHTML = transport.responseText;
        EpagesShop.updateBasketQuantityFields.basketFormNames.each(function(formName){
            EpagesShop.updateBasketQuantityFields.assignListeners(formName);
        });
        $$('a.addtobasket').each(function(item){
            item.observe('click', EpagesShop.miniBasket.addToBasket);
        });
        $$('form.addtobasket').each(function(item){
            item.observe('submit', EpagesShop.miniBasket.addToBasket);
        });
    } else {
        console.log('geen mini basket');
    };
    return true;
};

// werkt zowel voor form submits als voor links. is overrulable per "this",
// dwz dat als je een attribuut canSubmitToBasketFunction meegeeft met
// daarin een functie die true of false teruggeeft op basis van een inputparameter eventObject
// dan wordt het submitten naar de basket afgebroken als de return value false is
EpagesShop.miniBasket.addToBasket = function(eventObject){
    window.event? event.returnValue = false : eventObject.preventDefault(); /* IE : standards */
    if(EpagesShop.miniBasket.semaphore){
        return false;
    };
    var url = false;
    var params = false;
    
    // moved to above where the url is determined on 20090902 as this makes it possible
    // to change what the url would be
    var canSubmitToBasketFunction = this['canSubmitToBasketFunction'];
    if(canSubmitToBasketFunction) {
        var currentObj = $(this);
        var fn = canSubmitToBasketFunction.bind(currentObj);
        if(! fn(eventObject)){
            return false;
        };
    };
    
    if(this.tagName == 'A'){
        url = $(this).readAttribute('href');
    };
    if(this.tagName == 'FORM') {
        url = $(this).readAttribute('action');
        params = $(this).serialize();
    };
    
    // ten behoeve van google analytics tracking
    // Iedere basketwijziging wordt hierdoor gelogged als event
    // op verzoek van netsociety verwijderd
    //if(window['pageTracker']){
      //var link = (this.tagName == 'FORM') ? this.readAttribute('action') : this.readAttribute('href');
      //var ReqAction, matches = {};
      //if(matches = link.match(/RmProduct\/(.+)/))        ReqAction = {action: 'remove',     product: matches[1]};
      //if(matches = link.match(/AddProduct\/(.+)/))       ReqAction = {action: 'add',        product: matches[1]};
      //if(matches = link.match(/MultiAddProduct/))        ReqAction = {action: 'multiadd',   product: 'meerdere producten'};
      //if(matches = link.match(/Update/))                 ReqAction = {action: 'update',     product: 'meerdere producten'};
      //console.log('basket',ReqAction.action,'Product',ReqAction.product);
      //pageTracker._trackPageview('/basket/'+ReqAction.action+'?product='+ReqAction.product);
      //pageTracker._trackEvent('basket',ReqAction.action,'Product : ' + ReqAction.product);
    //}
    

    

    
    var ajaxParams = Object.extend({}, EpagesShop.miniBasket.callBacks);
    //ajaxParams.encoding = 'iso-8859-1';
    if(params){
        ajaxParams.parameters = params;
    } else {
        ajaxParams.parameters = {   '__FromAjaxCall' : 1,
                                    'random':Math.floor(Math.random()*100) //needed for IE, otherwise it will cache this call SP,18-10-2011.
        };
    };
    // volgens w3c moet een actie als "addtobasket" altijd "post" zijn.
    ajaxParams['method'] = 'get';
    new Ajax.Request(url, ajaxParams);
}

EpagesShop.miniBasket.reload = function(){
  //Dit is het origineel: SP 10-08-2011, daaronder is de uitbreiding zodat de encoding kan worden meegestuurd.
  new Ajax.Request(document.location.protocol + '//' + document.location.hostname + '/shop/Offer', EpagesShop.miniBasket.callBacks);
  //new Ajax.Request(document.location.protocol + '//' + document.location.hostname + '/shop/Offer', Object.extend({encoding:'iso-8859-1'}, EpagesShop.miniBasket.callBacks));
};

// hang addToBasket aan links en formulieren met class addtobasket
ECube.registerOnLoadFunction(function(e){
    
    // cancel voor IE6
    var version = parseFloat(navigator.appVersion.split('MSIE')[1]);
    if ((version >= 5.5) && (version < 7)) { return; }

    $$('a.addtobasket').each(function(item){
        item.observe('click', EpagesShop.miniBasket.addToBasket);
    });
    $$('form.addtobasket').each(function(item){
        item.observe('submit', EpagesShop.miniBasket.addToBasket);
    });
    
})




/**********************************************************************************

    Basket quantity fields autosubmit

**********************************************************************************/

EpagesShop.updateBasketQuantityFields = new Object();
// supply names of basket forms here
EpagesShop.updateBasketQuantityFields.basketFormNames = $w('basketform');
EpagesShop.updateBasketQuantityFields.checkQuantityInField = function(formObj, fieldElem){
    fieldElem.value = fieldElem.value.replace(/[^\d]/g, '');
    if(! fieldElem.value.match(/\d/)){
        fieldElem.value = 0;
        fieldElem.focus();
        return false;
    };
    var maxNumOfFieldName = fieldElem.name.replace(/^NumOf_/, 'MaxNumOf_');
    var maxNumOfElem = formObj.getElements().find(function(checkElem){
        if(checkElem.name == maxNumOfFieldName) {
            return true;
        };    
        return false;
    });
    // conceivable, MaxNumOf is an attribute of fieldElem
    if(! maxNumOfElem){
        if(fieldElem.readAttribute(maxNumOfFieldName)){
            maxNumOfElem = { 'value' : fieldElem.readAttribute(maxNumOfFieldName)};
        };
        // attributes are lowercase
        if(! maxNumOfElem){
            if(fieldElem.readAttribute(maxNumOfFieldName.toLowerCase())){
                maxNumOfElem = { 'value' : fieldElem.readAttribute(maxNumOfFieldName.toLowerCase())};
            };
        };
    }
    if(maxNumOfElem) {
        if((fieldElem.value * 1) > (maxNumOfElem.value * 1)){
            if(fieldElem['alertOnTooMuch']){
                try{
                    alert(VIA_JAVASCRIPT_SHOWN_MESSAGES.LANG_jsAlert_message_maxItemsOf1 + ' ' + maxNumOfElem.value + ' ' + VIA_JAVASCRIPT_SHOWN_MESSAGES.LANG_jsAlert_message_maxItemsOf2);
                }
                catch(err){
                    console.error(err);
                }
                
                fieldElem.value = maxNumOfElem.value;
                return false;
            } else {
                if(fieldElem['onTooMuch']){
                    var func = fieldElem['onTooMuch'].bind(fieldElem);
                    var returnVal = func(maxNumOfElem);
                } else {
                    fieldElem.value = maxNumOfElem.value;
                    return false;
                }
            };
        };
    };
    return true;
};
EpagesShop.updateBasketQuantityFields.checkQuantityFieldsInForm = function(formObj){
    formObj.getElements().each(function(elem){
        if(elem.name){
            if(elem.name.match(/^NumOf_/)){
                if(! EpagesShop.updateBasketQuantityFields.checkQuantityInField(formObj, elem)){
                    return false;
                }
            }
        }
    })
    return true;
};
// this calls form.submit() (or the function in submitFunction) if the form is not the 
// minibasket and does mini basket submit magic if it is
EpagesShop.updateBasketQuantityFields.submitForm = function(formObj, eventObject){
    if(formObj.className.match(/addtobasket/)){
        var formSubmit = EpagesShop.miniBasket.addToBasket.bind(formObj);
        formSubmit(eventObject);
    } else {
        if(formObj.submitFunction){
            var formSubmit = formObj.submitFunction.bind(formObj);
            formSubmit(eventObject);
        } else {
            formObj.submit();
        }
    };
}
EpagesShop.updateBasketQuantityFields.submitFormIfOK = function(formObj, eventObject){
    if(EpagesShop.updateBasketQuantityFields.checkQuantityFieldsInForm(formObj)){
        EpagesShop.updateBasketQuantityFields.submitForm(formObj, eventObject);
        return true;
    };
    return false;
};

EpagesShop.updateBasketQuantityFields.assignListeners = function(formName){
    var formObj = document.forms[formName];
    if(! formObj) {
        return true;
    };
    formObj = $(formObj);
    formObj.getElements().each(function(elem){    
        if(elem.name) {
            if(elem.name.match(/^NumOf_/i)) {
                // not clumsy. Firefox does not allow setting formObj.submit as a listener directly
                elem.observe('change', function(eventObject){
                    if(EpagesShop.updateBasketQuantityFields.checkQuantityInField(formObj, this)){
                        EpagesShop.updateBasketQuantityFields.submitForm(formObj, eventObject);
                    }
                });
            };
        };
    });
};
ECube.registerOnLoadFunction(function(e){
    EpagesShop.updateBasketQuantityFields.basketFormNames.each(function(formName){
        EpagesShop.updateBasketQuantityFields.assignListeners(formName);
    })
})

