// ***** ait1.js ***********************************************

/*
    in index.html includes of ait1.js en application.js
    ait1.js loads Compiler1.js
    Compiler1.js loads as.js
    Async.js performs ait1.includeAll()
    ait1.includeAll() ends with as.perform( application.code )
*/

// javascript inheritance: subclass.prototype.prototype = super.prototype
function ih(the_sub, the_super){
    var dummy = function(){};
    dummy.prototype = the_super.prototype;
    the_sub.prototype = new dummy();
}

function clone(obj) {
    for (i in obj) {
        if (typeof obj[i] == 'object') {
            this[i] = new clone(obj[i]);
        }
        else
            this[i] = obj[i];  // copy by value
    }
}

Array.prototype.indexOf = function(elt){
    for (var i=0;i<this.length;i++)
        if (this[i] === elt) return i;
    return null;
}

function dce(_type){
    var el = null;
    if (document.createElementNS)
        el = document.createElementNS("http://www.w3.org/1999/xhtml", _type);
    else
        el = document.createElement(_type);
    return el;
}

function $(id){
    return document.getElementById(id);
}

function dcp(){
    var el = dce('div');
    document.body.appendChild(el);
    el.style.left = '-1000px';
    return el;
}

function dct(div, txt){
    var el = document.createTextNode(txt);
    div.appendChild(el);
    return el;
}

function empty(div){
    while(div.firstChild) div.removeChild(div.firstChild);    
}

function settxt(div, txt){
    empty(div);
    dct(div, txt);
}
        
function getTarget(e){
	var obj;
	if (!e) var e = window.event;
	if (e.target) obj = e.target;
	else if (e.srcElement) obj = e.srcElement;
	if (obj.nodeType == 3) // defeat Safari bug
		obj = obj.parentNode;
    return obj;
}

function addEvent(el, event, method, param){
		if(!el) debugger;
   if(el.addEventListener)  // as should be
      el.addEventListener(event, method, param);
   else if(el.attachEvent) //IE 8
      el.attachEvent('on' + event, method);
   else el['on' + event] = method;
}

function removeEvent(el, event, method, param){ // param is capture event i.e. bubble or not
   if(!el) return; // sometimes already removed
   if(el.removeEventListener)  // as should be
      el.removeEventListener(event, method, param);
   else if(el.detachEvent) //IE 8
      el.detachEvent('on' + event, method);
   else el['on' + event] = null;
}

var gp = function(args){
    var parts = [];
    if(args.sg){
        var cpy = "" + args.sg;
        if(!args.lm) args.lm = ':';
            var ll = args.lm.length;
            var marker = cpy.indexOf(args.lm);
            while(marker != -1){
                parts.push(cpy.substring(0, marker));
                cpy = cpy.substring(marker+ll);
                marker = cpy.indexOf(args.lm);
            }
        if(cpy!=''){
            parts.push(cpy);
        }
    }
    return parts;
};

var TRACE = function(){};
var TRACK = function(){};
var ait   = { top_aw:{ acc:{x:0,y:0,w:10,h:10,o:1,s:1}, sm:{Cl:'top_aw'} } , rsrcs:{} };
//var ait   = { top_aw:{ acc:{x:0,y:0,o:1,s:1}, div:document.body, sm:{Cl:'top_aw'} } , rsrcs:{} };
var DB    = {};

var ia = function(){ 
    document.body.style.cursor='wait';
    if($('jsOn')) $('jsOn').innerHTML = "Een ogenblik aub. De website wordt opgehaald."; 
    var sk = [];
    sk.push('cb = new cbSt()');
    sk.push('Site = new stSt()');
    sk.push("Site.ld({cls:'aw', name:'stage', pt:Site.aw})");
//    sk.push('rdb.sc()');
//    sk.push('code()');
//    sk.push("Site.dynamics.gfst()");
//    sk.push("Site.aw.redrawTree()");
//    sk.push("Site.aw.aal()");
//    sk.push("document.body.style.cursor='pointer'");
    sk.push("if($('jsOn')) document.body.removeChild($('jsOn'))");
    as.xc({sk:sk});
};

var inject = function(args){
    as.wait = true;
    as.include = true;
    inject.file = args.file;
    code = null;
    // the codelines of this code.function are already in the as metaStack
    // inject wil overwrite the code.function
    loadSript(args.file+'.js');
    inject2.tries = 50;
    inject2();
};

var inject2 = function(){
    if(code){
        inject.file = null;
        as.wait = false;
        as.pf({fc:code});
    }
    else{
        inject2.tries--;
        if(inject2.tries>-1){
            setTimeout('inject2()',300); // wait until new code is loaded
        }
        else{
            alert('could not _load '+ inject.File + ', there might be a javascript error inside it.');
            inject.file = null;
        }    
    }
};



// JS: creates AITc.Mobiel class
// DB: creates table "mobiel"
// new record in table "mobiel" by JS:  ait.m1 = new AITc.Mobiel({nr:"1234509876", merk:"samsung"});
// defineDataObject({_type:"Mobiel",fields:['nr','_type']})
var defineDataObject = function(args){
    var evalsg = 'var '+args._type+' = createClass( "'+args._type+'",{ SUPER:"DataObject", staticMembers : {fields: [';
    for(var i=0;i<this.fields.length;i++){
        evalsg += '"'+this.fields[i]+'"';
        if(i!=this.fields.length-1) evalsg += ',';
    }
    evalsg += ']}}); ';
    eval( evalsg );
    evalsg = args._type+'.prototype.createTable()';
    eval( evalsg );
};

// JS: creates AITc.asoc_person_has_partner_person class
// DB: creates table "asoc_person_has_partner_person"
// new record in table "asoc_person_has_partner_person" by JS:  ait.a1 = new Association({asoc:'has_partner', obj1:ait.p1, obj2:ait.p2, start:"31-05-1981", end:"heden", descr:"getrouwd"});
// defineAssociation({cls1:"Person", asoc:"has_partner", cls2:"Person"});
var defineAssociation = function(args){
    var tblname = args.cls1.toLowerCase() + '_' + args.asoc  + '_' + args.cls2.toLowerCase();
    defineDataObject({_type:tblname, fields:['fk1','fk2','b','e','descr']});
    if(args.bidrct) AITc[tblname].bidrct = true;
};

// new record in table "asoc_person_has_mobiel_mobiel"
// AssoConnect({asoc:'has_mobiel',obj1:ait.p2,obj2:ait.m1,start:"31-05-1981",end:"heden", descr:"huidige"}); //--> one record
var AssoConnect = function(args){
    var tblname = args.obj1.staticMembers.Class.toLowerCase() + '_' + args.asoc  + '_' + args.obj2.staticMembers.Class.toLowerCase();
    var newAsoc = new AITc[tblname]({fk1:args.obj1.id, fk2:args.obj2.id, b:args.start, e:args.end, descr:args.descr});
    newAsoc.obj1 = args.obj1;
    newAsoc.obj2 = args.obj2;
    if(!args.obj1.asoc) args.obj1.asoc = {};
    args.obj1.asoc[tblname] = newAsoc;
    if(!args.obj2.invAsoc) args.obj2.invAsoc = {};
    args.obj2.invAsoc[tblname] = newAsoc;
};        
