/**
 * UITG tools
 *
 * $Id$
 *
 * @author gERD Schaufelberger <gerd_AT_schaufelberger_DOT_de>
 * @license PHP License
 * @package uitg
 * @subpackage Xinha
 */

var UITG            =   new Object();
UITG.basepath       =   ".";
UITG.phpExtension   =   "php";
UITG.included       =   new Array();
UITG.browser        =   {
                            ie: false,
                            mozilla: false
                        };
if( document.all ) {
    UITG.browser.ie = true;
} else {
    UITG.browser.mozilla = true;
}

/**
 * collect fake request parameter
 */
var scripts = document.getElementsByTagName( "script" );
var search  = new Array();
var i;
for( i = 0; i < scripts.length; ++i ) {
    if( scripts[i].src && scripts[i].src.match(/UITG\.js(\?.*)?$/) ) {
        search =  scripts[i].src.split( "\.js?" );
    }
}

if( search[1] ) {
    search  =   search[1].split( "&" );
    if( search.length ) {
        var p;
        for( i = 0; i < search.length; ++i ) {
            p   =   search[i].split( '=' );
            switch( p[0] ) {
                case "basepath":
                    UITG.basepath       =   p[1];
                    break;
                case "phpExtension":
                    UITG.phpExtension   =   p[1];
                    break;
                default:
                    break;
            }
        }
    }
}

/**
 * Javascript include
 *
 * @param string|array file or list of files to include
 * @param bool once
 * @param bool once
 * return bool true on success
 */
UITG.include = function( file, once, raw )
{
    if( typeof once == "undefined" ) {
        once = true;
    }
    if( typeof raw == "undefined" ) {
        raw = false;
    }

    var includePath =   UITG.basepath + "/js." + UITG.phpExtension + "?src=";
    if( typeof file == "string" ) {
        file        =   [file];
    }

    var include =   new Array();
    var found   =   false;
    var i       =   0;
    if( once ) {
        for( i = 0; i < file.length; ++i ) {

            found = false;
            for( var j = 0; j < UITG.included.length; ++j ) {
                if( UITG.included[j] == file[i] ) {
                    found = true;
                    break;
                }
            }

            if( !found ) {
                include.push( file[i] );
            }
        }

        if( include.length < 1 ) {
            return true;
        }
    } else {
        include = file;
    }

    // load transport object
    var transport = null;
    try{
        transport = new XMLHttpRequest();
    } catch( e ) {
        try{
            transport = new ActiveXObject( "Msxml2.XMLHTTP" );
        } catch( e ) {
            try{
                transport = new ActiveXObject( "Microsoft.XMLHTTP" );
            } catch( e ) {
                alert( "could not find XMLHttpRequest object!" );
                return false;
            }
        }
    }

    // receive JS file from server
    try{
        transport.open( "get", includePath + file.join( "," ), false );
        transport.send( null );
        if( !transport.status || parseInt( transport.status, 10 ) == 200 ) {
            if( raw ) {
                return transport.responseText;
            }
            eval( transport.responseText );
        }
    }
    catch( e ) {
        alert( e + " failed to load " + file  );
        return false;
    }

    if( once ) {
        for( i = 0; i < file.length; ++i ) {
            UITG.included.push( file[i] );
        }
    }

    return true;
};

/**
 * Bind
 *
 * @return Function object
 */
Function.prototype.bind = function()
{
    var __method    = this;
    var args        = new Array();
    var object      = arguments[0];
    for( var i = 1; i < arguments.length; ++i ) {
        args.push( arguments[i] );
    }

    return function() {
        for( var i = 0; i < arguments.length; ++i ) {
            args.push( arguments[i] );
        }
        return __method.apply( object, args.concat() );
    };
};

/**
 * To query string
 *
 * @return String object
 */
Object.prototype.toQueryString = function()
{
    var q  =    new Array();
    for( i in this ) {
        if( typeof this[i] != "string" ) {
            continue;
        }
        q.push( i + "=" + encodeURIComponent( this[i] ) );
    }
    return q.join( "&" );
};

