/*begin version of Core, SitePoint*/
var Basis = {
    hasClass: function(target, classValue) {
        var pattern = new RegExp('(^| )' + classValue + '( |$)');
        if (pattern.test(target.className)) {
            return true;
        }
        return false;
    },
    
    addClass: function(target, classValue) {
        if(!Basis.hasClass(target, classValue)) {
            if (!target.className == '') {
                classValue = ' ' + classValue;
            }
            target.className = target.className + classValue;
        } 
    },

    removeClass: function(target, classValue) {
        if (Basis.hasClass(target, classValue)) {
            var pattern = new RegExp('(\\s|^)' + classValue + '(\\s|$)');
            target.className = target.className.replace(pattern, '');
        }
    },

    getElementsByClass: function(classValue) {
        var allElements = [];
        if(typeof document.all != 'undefined') {
            allElements = document.all;
        }
        else {
            allElements = document.getElementsByTagName('*');
        }

        var matchedElements = [];
        var pattern = new RegExp('(^| )' + classValue + '( |$)');

        for(var i=0, l = allElements.length; i < l; i++) {
            if(pattern.test(allElements[i].className)) {
                matchedElements[matchedElements.length] = allElements[i];
            }
        }
        return matchedElements;
    },

    insertAfter: function(newEl, refEl) {
        if (refEl.nextSibling) {
            refEl.parentNode.insertBefore(newEl, refEl.nextSibling);
        } 
        else {
            refEl.parentNode.appendChild(newEl);
        }
    },

    getNextSibling: function(target) {
        var sib = target.nextSibling;
        /*3 is text node or whitespace*/
        while(sib.nodeType == 3) {
            sib = sib.nextSibling;
        }
        return sib;
    }, 

    getPrevSibling: function(target) {
        var sib = target.previousSibling;
        while(sib.nodeType == 3) {
            sib = sib.previousSibling;
        }
        return sib;
    },

    checkBounds: function(obj, bounds) { 
        if (obj.value.length >= bounds) {
            obj.value = obj.value.substring(0, bounds);
        }
    },

    begin: function(fn) {
        Basis.addEventListener(window, 'load', fn);
    }
};

/*w3c*/
    if (document.addEventListener) {
        Basis.addEventListener = function(target, type, listener) {
            target.addEventListener(type, listener, false);
        };

        Basis.removeEventListener = function(target, type, listener) {
            target.removeEventListener(type, listener, false);
        };

        Basis.preventDefault = function(event) {
            event.preventDefault();
        };

        Basis.stopPropagation = function(event) {
            event.stopPropagation();
        };
    }

/*IE*/
    else if (document.attachEvent) {
        Basis.addEventListener = function(target, type, listener) {
            if (Basis._findListener(target, type, listener) != -1) {
                return;
            }
            var listener2 = function() {
                var event = window.event;

                if (Function.prototype.call) {
                    listener.call(target, event);
                }
                else {
                    target._currentListener = listener;
                    target._currentListener(event)
                    target._currentListener = null;
                }
            };

            target.attachEvent('on' + type, listener2);

            var listenerRecord = {
                target: target,
                type: type,
                listener: listener,
                listener2: listener2
            };

            var targetDocument = target.document || target;
            var targetWindow = targetDocument.parentWindow;
            
            var listenerId = 'l' + Basis._listenerCounter++;

            if (!targetWindow._allListeners) {
                targetWindow._allListeners = {};
            }
            targetWindow._allListeners[listenerId] = listenerRecord;

            if (!target._listeners) { 
                target._listeners = [];
            }
            target._listeners[target._listeners.length] = listenerId;

            if (!targetWindow._unloadListenerAdded) {
                targetWindow._unloadListenerAdded = true;
                targetWindow.attachEvent('onunload', Basis._removeAllListeners);
            }
        };

        Basis.removeEventListener = function(target, type, listener) {
            var listenerIndex = Basis._findListener(target, type, listener);
            if (listenerIndex == -1) {
                return;
            }

            var targetDocument = target.document || target;
            var targetWindow = targetDocument.parentWindow;

            var listenerId = target._listeners[listenerIndex];
            var listenerRecord = targetWindow._allListeners[listenerId];

            target.detachEvent('on' + type, listenerRecord.listener2);
            target._listeners.splice(listenerIndex, 1);

            delete targetWindow._allListeners[listenerId];
        };

        Basis.preventDefault = function(event) {
            event.returnValue = false;
        };

        Basis.stopPropagation = function(event) {
            event.cancelBubble = true;
        };

        Basis._findListener = function(target, type, listener) {
            var listeners = target._listeners;
            if (!listeners) { 
                return -1;
            }

            var targetDocument = target.document || target;
            var targetWindow = targetDocument.parentWindow;

            for (var i = listeners.length - 1; i >= 0; i--) {
                var listenerId = listeners[i];
                var listenerRecord = targetWindow._allListeners[listenerId];

                if (listenerRecord.type == type && listenerRecord.listener == listener) {
                    return i;
                }
            }
            return -1;
        };

        Basis._removeAllListeners = function() {
            var targetWindow = this;
            for (id in targetWindow._allListeners) {
                var listenerRecord = targetWindow._allListeners[id];
                listenerRecord.target.detachEvent('on' + listenerRecord.type, listenerRecord.listener2);
                delete targetWindow._allListeners[id];
            }
        };

        Basis._listenerCounter = 0;
    }
/*end IE*/
/*end Core*/

var Scooter = {
    init: function() {
        var form;
        var inputs = [];

//set list of inputs for autoTab
        if((form = document.forms.formBereken) ||
          (form = document.forms.formAfsluiten)) {
            var allInputs = form.elements;
            for (var i=0, l=allInputs.length; i<l; i++) {
            //find only real inputs, avoid fieldsets* and submits
                var typePattern = /^(text|select-one)$/i;
                if (typePattern.test(allInputs[i].type)) {
                    inputs.push(allInputs[i]);
                }
            }
        }
        for(var i=0, l=inputs.length; i<l; i++) { 
            inputs[i].autoTabIndex = i;
            if(inputs[i].id == 'Postcodenum') {
                inputs[i].onkeyup = (function(target) { 
                    return function() { 
                        Scooter.autoTab(target, inputs, l);
                    };
                })(inputs[i]);
            }
        }

//Setup hide/show toggle on certain fieldsets
        var hiddenFields = Basis.getElementsByClass('toggle');
        for (var j=0, h=hiddenFields.length; j<h; j++) {
            var field = hiddenFields[j];
            Scooter.checkValue(field);
        }

//Setup disable/enable on certain fields
        var disabledFields = Basis.getElementsByClass('disable');
        for (var m=0, d=disabledFields.length; m<d; m++) {
            var disField = disabledFields[m];
            Scooter.checkValue(disField);
        }

//Call a script to fill in adresgegevens when Postcode is entered
        var postletters = document.getElementById('Postcodelet'),
            straat = document.getElementById('Straat');
        if (straat) {
            Basis.addEventListener(postletters, 'change', Scooter.getAddress);
        }
        else return;

//Bring Huisnummer to users' attention on afsluiten form
        var huisnummer = document.getElementById('Huisnummer');
        if (huisnummer) {
            Scooter.highlight(huisnummer);//onload
            Basis.addEventListener(huisnummer, 'change', Scooter.checkIngevuld);//onchange
        }
        else return;
    },

    autoTab: function(target, inputs, l) {
        if(target.value.length === target.maxLength &&
        target.autoTabIndex < l) {
            inputs[target.autoTabIndex + 1].focus();   
        }
    },

    config: [
        {'fieldId': 'JongField', 'option': 'Jong'},
        {'fieldId': 'Cascodekking', 'option': 'Casco'},
        {'fieldId': 'Rijbewijs', 'option': 'RijbewijsSoort'}
    ],
            
    checkValue: function(field) {
        var choice;
        for(var k=0, l=Scooter.config.length; k<l; k++) {
            if(field.id === Scooter.config[k].fieldId) {
                var temp=Scooter.config[k].option;
                choice=document.getElementById(temp);
                if(Basis.hasClass(choice, 'setDisable')) {
                    Scooter.setDisabled(choice, field);
                    choice.onchange = (function(target) { 
                        return function() {
                            Scooter.setDisabled(target, field);
                        };
                    })(choice);
                }
                else {
                    Scooter.toggle(choice, field);
                    choice.onchange = (function(target) { 
                        return function() {
                            Scooter.toggle(target, field);
                        };
                    })(choice);
                }
            }
        }
    },

    toggle: function(target, field) {
        var val = target.value.toLowerCase();
        if(val === 'ja') {
            Basis.removeClass(field, 'hidden');
        }
        else {
            Basis.addClass(field, 'hidden');
        }
    },

    setDisabled: function(target, field) {
        var val = target.value.toLowerCase();
        if(val === 'geen') {
            field.disabled=true;
        }
        else {
            field.disabled=false;
        }
    },

    getAddress: function(event) {
        if (this.value == '') {
            return;
        }
        var postnummers = document.getElementById('Postcodenum'),
            straat = document.getElementById('Straat'),
            plaats = document.getElementById('Plaats'),
            postcode = postnummers.value + this.value;
           // url='http://192.2.43.60/gepio/postcode/postcode.php?postcode='+postcode;
            url='/postcode.php?postcode=' + postcode;

        var callback = function(response) {
            var response = response.replace(/["}{]*/g, '');
            var split1 = response.split(','); 
            var splitadres = split1[1].split(':');
            straat.value = splitadres[1];
            var splitwoon = split1[2].split(':');
            plaats.value = splitwoon[1];
        }
        Scooter.ajax(url,callback);
    },

    ajax: function(url, callback) {
        var xhr = XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
        if (xhr !==null) {
            xhr.open('GET', url, true);
            xhr.send(null);
            xhr.onreadystatechange = function() {
                if (this.readyState == 4) {
                    if(this.status == 200 || this.status == 304) {
                        if (this.responseText) {
                            callback(this.responseText);
                        } 
                        else {
                            //alert('No response');
                        }
                    } 
                    else {
                        alert('Error: ' + this.status);
                    }
                }
            };
        }
    },

    highlight: function(huisnummer) { 
        if(huisnummer.value === '') {
            Basis.addClass(huisnummer, 'highlight');
        }
        else {
            Basis.removeClass(huisnummer, 'highlight');
        }
    },
    checkIngevuld: function(event) {
        Scooter.highlight(this);
    }
};

Basis.begin(Scooter.init);

