/*********************************************************
**
**   title:       Jesy
**   description: JS framework for creating JS based
**                applications
**
**   varsion:     0.1
**
*/


Jesy = {};
Jesy.VERSION    = '0.1';


/*************************************
*
*           Constants
*
**************************************/
Jesy._base_class_file       = 'Jesy.js';
Jesy._modules_class_file    = 'Jesy/Modules.js';
Jesy.BASE_MODULES           = ['Jesy.Event', 'Jesy.Object', 'Jesy.Compat'];



/*************************************
*
*           Browser Check
*
**************************************/
Jesy.isIE            = false;
Jesy.isMozilla       = false;
Jesy.isKonqueror     = false;
Jesy.isSafari        = false;
Jesy.isOpera         = false;
Jesy.isOmniWeb       = false;
Jesy.isWebTV         = false;
Jesy.isiCab          = false;
Jesy.isNS            = false;


Jesy._checkBrowserName = function ( string ) {
    return navigator.userAgent.toLowerCase().indexOf( string ) + 1;
}


// TODO: make it a little bit more correct
if ( Jesy._checkBrowserName('konqueror'))        Jesy.isKonqueror = true;
else if (Jesy._checkBrowserName('safari'))       Jesy.isSafari    = true;
else if (Jesy._checkBrowserName('omniweb'))      Jesy.isOmniWeb   = true;
else if (Jesy._checkBrowserName('opera'))        Jesy.isOpera     = true;
else if (Jesy._checkBrowserName('webtv'))        Jesy.isWebTV     = true;
else if (Jesy._checkBrowserName('icab'))         Jesy.isiCab      = true;
else if (Jesy._checkBrowserName('msie'))         Jesy.isIE        = true;
else if (!Jesy._checkBrowserName('compatible'))  Jesy.isNS        = true;




/*************************************
*
*        Files Manipulation
*
**************************************/
Jesy._include = function ( file ){
    var request;
    var res = { success: false };

    if ( file == null ){
        Jesy._error('Jesy._include: file not passed')
        return res;
    }

    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);

    if ( request.status != null && ( request.status != 200 && ! ( request.status == 304 && Jesy.isKonqueror ) ) ){
        return res;
    }

    res.success = true;
    res.code    = request.responseText;

    return res;
}



/*************************************
*
*           Jesy Modules
*
**************************************/
Jesy._path = null;

Jesy._getScriptDir = function ( path ) {
    // remove domain portion of the path
    path = path.replace(/^http(s)?:\/\/.*?\//, '/')

    // remove script file
    path = path.replace(/\w+\.js/, '')

    if ( path == '' )
        path = './'

    return path;
}


Jesy._includeModules = function () {
    // get path of all scripts
    var scripts = document.getElementsByTagName('SCRIPT');

    for ( var i=0; i < scripts.length; i++ ){
        if ( scripts[i].src.match(Jesy._base_class_file) ){
            Jesy._path = Jesy._getScriptDir( scripts[i].src );
        }
    }

    if ( Jesy._path == null ){
        Jesy._error( "Can't find base path" );
        return;
    }

    // first include Jesy::Modules
    var modules_file = Jesy._path + Jesy._modules_class_file;
    var res = Jesy._include( modules_file )

    if ( ! res.success ){
        Jesy._error("Can't include file: " + modules_file + "\nFile not found." );
        return;
    }

    // eval the code
    try {
        eval(res.code)
    }
    catch (ex){
        Jesy._error("Can't include file: " + modules_file + "\n" + ex );
    }

    for ( var i=0; i < Jesy.BASE_MODULES.length; i++ ){
        Jesy.use( Jesy.BASE_MODULES[i] )
    }
}



/*************************************
*
*           Error handling
*
**************************************/
Jesy._error = function ( msg ) {
    alert('Jesy Error: ' + msg)
}




// include all Jesy base modules
Jesy._includeModules();
