/*
    some "prototype" implementations
    

    Zicht Nieuwe Media Ontwerpers.
    Gerard van Helden
*/

zzArray = {};
zzArray.indexOf = function ( array, a ) {
    for ( var i in array ) {
        if ( array[i] == a ) {
            return i;
        }
    }
    return -1;
}

zzElement = {};

zzElement._getClassNames = function ( element ) {
    return element.className.split ( /\s+/ );
}

zzElement.addClassName = function ( element, className ) {
    if ( !zzElement.hasClassName ( element, className ) ) {
        element.className += ' ' + className;
    }
}

zzElement.hasClassName = function ( element, className ) {
    return zzArray.indexOf ( zzElement._getClassNames ( element ), className ) >= 0;
}

zzElement.removeClassName = function ( element, className ) {
    if ( zzElement.hasClassName ( element, className ) ) {
        var classNames = zzElement._getClassNames ( element );
        classNames.splice ( zzArray.indexOf ( classNames, className ), 1 );
        element.className = classNames.join ( ' ' );
    }
}

zzElement.match = function ( element, type ) {
    if ( element.nodeType != 1 ) {
        return false;
    }
    
    var parts = type.split ( '.' );
    
    if ( parts.length > 1 ) {
        var classNames = parts[1].split ( ' ' );
        for ( var i in classNames ) {
            if ( !zzElement.hasClassName ( element, classNames[i] ) ) {
                return false;
            }
        }
    }
    if ( parts[0].length && element.nodeName.toLowerCase () != parts[0].toLowerCase () ) {
        return false;
    }
    
    return true;
}

zzElement.filter = function ( nodelist, type ) {
    var ret = [];
    for ( var i = 0; i < nodelist.length; i ++ ) {
        var item = nodelist.item(i);
        if ( zzElement.match ( item, type ) ) {
            ret.push ( item );
        } 
    }
    return ret;
}

zzElement.hide = function ( element ) {
    element.style.display = 'none';
}

zzElement.show = function ( element ) {
    element.style.display = 'block';
}

zzElement.flipClassName = function ( element, className ) {
    zzElement[
        zzElement.hasClassName ( element, className )
        ? 'removeClassName'
        : 'addClassName'
    ] ( element, className );
}

zzAlertContinue = true; 
window._alert = window.alert;
window.alert = function ( s ) {
    zzAlertContinue = (zzAlertContinue && confirm ( s )); 
};

zzEvent = {};

zzEvent.observe = function ( event, element, method, capture ) {
    if ( !capture ) { capture = false; }
    
    if ( element.addEventListener ) {
        element.addEventListener ( event, obj, method, capture );  
    } else if ( element.attachEvent ) {
        element.attachEvent ( 'on' + event, method );
    }
}