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

 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){
    // console.log('we gaan in ', 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.callBacks = 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.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);
        });
        $$('input.addtobasket').each(function(item){
            item.observe('change', 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){
    // if we get called from reload, there is no event
    if(eventObject){
        window.event? event.returnValue = false : eventObject.preventDefault(); /* IE : standards */
    };
    if(EpagesShop.miniBasket.semaphore){
        return false;
    };
    
    var url = false;
    var params = false;
    if(this.tagName == 'A'){
        url = $(this).readAttribute('href');
        var getQueryVars = url.match(/\?(.+)/);
        if(getQueryVars){
            params = getQueryVars[1];
            params = params.replace(/^\?/, '');
        };
    };
    
    var canSubmitToBasketFunction = this['canSubmitToBasketFunction'];
    if(canSubmitToBasketFunction) {
        var currentObj = $(this);
        var fn = canSubmitToBasketFunction.bind(currentObj);
        if(! fn(eventObject)){
            return false;
        };
    };
    
    if(this.tagName == 'FORM') {
        url = $(this).readAttribute('action');
        params = $(this).serialize();
    };
    if(this.tagName == 'INPUT'){
        var ancestors = $(this).ancestors();
        var formObj = ancestors.find(function(elem){
            if(elem.tagName == 'FORM'){
                return true;
            };
            return false;
        });
        if(formObj){
            formObj = $(formObj);
            url = formObj.readAttribute('action');
            params = formObj.serialize();
        }
    };
        
    var ajaxParams = Object.extend({}, EpagesShop.miniBasket.callBacks);
    if(params){
        // params is serialized if it exists
        params = params + '&__FromAjaxCall=1';
        ajaxParams.parameters = params;
    } else {
        ajaxParams.parameters = {'__FromAjaxCall' : 1};
    };
    // volgens w3c moet een actie als "addtobasket" altijd "post" zijn.
    ajaxParams['method'] = 'post';
    // console.log('going to ', url, ' with params ', ajaxParams.parameters);
    // return false;
    
    if(url){
        
        
        // ten behoeve van google analytics tracking
        // Iedere basketwijziging wordt hierdoor gelogged als event
        if(window['pageTracker']){
          var ReqAction, matches = {};
          if(matches = url.match(/RmProduct\/(.+)/))        ReqAction = {action: 'remove',     product: matches[1]};
          if(matches = url.match(/AddProduct\/(.+)/))       ReqAction = {action: 'add',        product: matches[1]};
          if(matches = url.match(/MultiAddProduct\/(.+)/))  ReqAction = {action: 'multiadd',   product: 'meerdere producten'};
          if(matches = url.match(/Update/))                 ReqAction = {action: 'update',     product: 'meerdere producten'};
          try {
              if((this.tagName == 'INPUT') && (matches = this.name.match(/utm_content/))){
                  ReqAction = {action: 'update', 'product': 'couponCode'};
              };
          } catch (err) {
              console.log("Error checking name of this : ", err, " this is ", this);
          }
          
          // console.log('basket',ReqAction.action,'Product',ReqAction.product);
          pageTracker._trackPageview('/basket/'+ReqAction.action+'?product='+ReqAction.product);
          pageTracker._trackEvent('basket',ReqAction.action,'Product : ' + ReqAction.product);
        }
        
        ECube.d.log(1, "Updating basket. URL: ", url, 'Params: ', ajaxParams);
        new Ajax.Request(url, ajaxParams);
        return true;
    };
    console.log('EpagesShop.miniBasket.addToBasket called without an url from ', this);
    return false;
    
}

EpagesShop.miniBasket.reload = function(){
    if(EpagesShop.miniBasket.basketElement){
        var formObj = $(EpagesShop.miniBasket.basketElement).descendants().find(function(elem){
            if(elem.tagName == 'FORM'){
                return true;
            };
            return false;
        });
        if(formObj){
            EpagesShop.miniBasket.addToBasket.bind(formObj)();
        };
    } else {
        console.log('Attempt to reload the basket but there is no basketElement!');
    };
};

// hang addToBasket aan links en formulieren met class addtobasket
ECube.registerOnLoadFunction(function(e){
    $$('a.addtobasket').each(function(item){
        item.observe('click', EpagesShop.miniBasket.addToBasket);
    });
    $$('form.addtobasket').each(function(item){
        item.observe('submit', EpagesShop.miniBasket.addToBasket);
    });
    $$('input.addtobasket').each(function(item){
        item.observe('change', 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)){
            // alert('U kunt maximaal ' + maxNumOfElem.value + ' exemplaren van dit product bestellen');
            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);
    })
})
