/*##################################################
#
#   title:       JS Compat
#   description: Define wripers for some methods in order to be used
#                indipendantly form browser type.
#                All checks are made only once ( if possible ) so overhead is
#                expirienced only once not on every call
#
#   varsion:     0.1
*/

var JSCompat = {
    version     : '0.1',
    IE          : false,
    Moziila     : false,
    Konqueror   : false,
    Safari      : false,
    OmniWeb     : false,
    Opera       : false,
    WebTV       : false,
    iCab        : false,
    NetscapeNavigator: false,
    UnknownBrowser   : false,
    include_cache    : new Array()
}


JSCompat.checkBrowser = function (browser_string) {
    return navigator.userAgent.toLowerCase().indexOf(browser_string) + 1;
}


/*************************************
*
*          Browser check
*
*/
if (JSCompat.checkBrowser('konqueror')) JSCompat.Konqueror = true
else if (JSCompat.checkBrowser('safari')) JSCompat.Safari = true
else if (JSCompat.checkBrowser('omniweb')) JSCompat.OmniWeb = true
else if (JSCompat.checkBrowser('opera')) JSCompat.Opera = true
else if (JSCompat.checkBrowser('webtv')) JSCompat.WebTV = true
else if (JSCompat.checkBrowser('icab')) JSCompat.iCab = true
else if (JSCompat.checkBrowser('msie')) JSCompat.IE = true
else if (!JSCompat.checkBrowser('compatible')) JSCompat.NetscapeNavigator = true
else JSCompat.UnknownBrowser = true;




/*************************************
*
*      File manipulation
*
*/
// Include JS file in other JS file
include = function ( file, condition ){
    if ( JSCompat.include_cache[file] ) {
        return;
    }

    var request;

    // if condition is defined and it is false do not include the file
    if (typeof condition != 'undefined' && ! condition ){
        return;
    }

    try {
        request = new ActiveXObject("Msxml2.XMLHTTP")
    }
    catch(ex) {
        try {
            request = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (ex1) {
            request = null;
        }
    }

    if( ! request && typeof XMLHttpRequest != "undefined" ){
        request = new XMLHttpRequest()
    }

    request.open('GET', file , false );
    request.send(null);
    //alert(request.responseText)

    if ( request.status != null && ( request.status != 200 && ! ( request.status == 304 && JSCompat.Konqueror ) ) ){
        alert("Can not include file: " + file + "\nRemote status:" + request.status )
        return;
    }

    try {
        eval( request.responseText );
        JSCompat.include_cache[file] = true;
    }
    catch (ex){
        alert("Can not include file: " + file + "\n" + ex );
    }
}


//   Include CSS file in JS file
include_css = function ( file ){
    document.write ( '<l' + 'ink rel="stylesheet" href="' + file + '"></lin' + 'k>' );
}



/*************************************
*
*   atach/remove Event Wrapers
*
*/

if ( document.attachEvent ){
    var addEvent = function ( el, event, handler ) {
        el.attachEvent("on" + event, handler);
    }

    var removeEvent = function ( el, event, handler ) {
        el.detachEvent("on" + event, handler);
    }

    var stopEvent   = function ( ev ) {
        //window.event.cancelBubble = true;
        //window.event.returnValue  = false;
    }

    var eventSource = function ( ev ) {
        return window.event.srcElement;
    }

    var eventTarget = function ( ev ) {
        return window.event.srcElement;
    }

    var getEvent = function (  ) {
        return window.event;
    }

}else{
    var addEvent = function ( el, event, handler ) {
        el.addEventListener(event, handler, true);
    }

    var removeEvent = function ( el, event, handler ) {
        el.removeEventListener(event, handler, true);
    }

    var stopEvent   = function ( ev ) {
        if ( ! ev ){
            return;
        }

        ev.preventDefault();
        ev.stopPropagation();
    }

    var eventSource = function ( ev ) {
        return ev.currentTarget;
    }

    var eventTarget = function ( ev ) {
        return ev.target;
    }

    var getEvent = function ( ev ) {
        return ev;
    }

}


/*************************************
*
*               Array methods
*
*/

if ( ! Array.prototype.push ){
    Array.prototype.push = function ( el ){
        var len = this.length;
        for (var i = 0; i < arguments.length; i++) {
            this[len + i] = arguments[i];
        }

        return this.length;
    }
}

if ( ! Array.prototype.pop ){
    Array.prototype.pop = function ( el ){
        var len     = this.length;
        var el      = this[len - 1];
        this.length = len - 1;

        return el;
    }
}


if ( ! Array.prototype.unshift ){
    Array.prototype.unshift = function ( el ){
        var offset = arguments.length;

        // shift all elements with offset
        for (var i = this.length - 1; i >= 0; i--) {
            this[i + offset] = this[i];
        }

        // add new elements
        for (var i = 0; i < offset ; i++) {
            this[i] = arguments[i];
        }

        return this.length;
    }
}


