// twobirds AJAX lib V 2.5.1 Author: 2002- Frank Thuerigen / phpbuero.de

// namespace for lib, DO NOT CHANGE
var tb = function() {
 return {};
 }();

tb.stop = function(){
 tb.timer.clear();
 tb.timer.stop();
 }
 
tb.start = function(){
 tb.timer.start();
 }
 
tb.restart = function(){
 tb.timer.stop();
 tb.timer.start(); 
 }
 
tb.timer=(function(){
 //private
 var myTimer=false;
 
 function d(pId){
  if ( !tb.timer.t[pId] ) return;
  clearTimeout( myTimer );
  tb.timer.t[pId].f=null;
  delete tb.timer.t[pId].f;
  tb.timer.t[pId]=null;
  delete tb.timer.t[pId];
  for ( var x in tb.timer.t) {
   myTimer = window.setTimeout( to, calcNext() );
   break;
   }
  }

 function a(pCb, pMs) {
  clearTimeout( myTimer );
  var myId=tb.misc.getid(),
      myT=pMs+(new Date()).getTime()
  tb.timer.t[myId]={ f: pCb, t: myT };
  myTimer = window.setTimeout( to, calcNext() );
  return myId;
  }

 function calcNext() {
  var myT = (new Date()).getTime();
  var myNext = 10000000 + myT;
  for ( var i in tb.timer.t ) {
   var myI = tb.timer.t[i];
   if ( myI.t && myNext > myI.t ) {
    myNext = myI.t;
    }
   }
  myNext = myNext - myT;
  return ( myNext<10 ? 10 : myNext );
  }

 function to(){
  for(var i in tb.timer.t){
   var myT=(new Date()).getTime();
   if(tb.timer.t[i].t<=myT){
    var myE=tb.timer.t[i].f;
    if ( !tb.timer.stopped ) {
     tb.misc.exec( myE );
     d(i);
     }
    }
   }
  for ( var x in tb.timer.t) {
   myTimer = window.setTimeout( to, calcNext() );
   break;
   }
  }

 return { // public 
  t: {},
  stopped: false,
  stop: function() {
   clearTimeout(myTimer);
   tb.timer.stopped = true;
   },
  start: function() {
   tb.timer.stopped = false;
   myTimer = window.setTimeout(timeout,0);
   },
  add: function(pCb, pMs){
   pCb = pCb || tb.misc.nop;
   pMs = pMs || 50;
   return a(pCb, pMs);
   },
  abort:function(pId){
   pId = pId ? d(pId) : null;
   }
  };
 })();

tb.interval=(function(){
 //private
 var myTimer = false;
 var myIndicator = 0;
 
 function d(pId){
  if ( !tb.interval.i[pId] ) return;
  tb.timer.abort( myTimer );
  if ( tb.interval.i[pId][4] === true ) {
   myIndicator--;
   if ( myIndicator < 1 ) {
    if ( document.getElementById( '_processing') ) { 
     document.getElementById( '_processing' ).style.visibility = 'hidden';
     }
    }
   }
  tb.interval.i[pId].cb = null;
  delete tb.interval.i[pId].cb;
  tb.interval.i[pId] = null;
  delete tb.interval.i[pId];
  
  for ( var x in tb.interval.i) {
   myTimer = tb.timer.add( 
    ito, 
    calcNext() 
    );
   break;
   }
  }

 function a(pCb, pMs, pTimeoutMs, pIn ) {
  tb.timer.abort( myTimer );
  var myId=tb.misc.getid(),
      myTime=(new Date()).getTime(),
      myT=myTime+pMs,
      myTo=( !isNaN( pTimeoutMs ) ? parseInt( pTimeoutMs / pMs ) : -1 );
  tb.interval.i[myId] = { cb: pCb, i: pMs, t: myT, to: myTo, b: pIn };
  if ( pIn === true ) { 
   myIndicator++;
   document.getElementById( '_processing' ).style.visibility = 'visible';  
   }
  myTimer = tb.timer.add( 
   ito, 
   calcNext()
   );
  return myId;
  }

 function calcNext() {
  var myT = (new Date()).getTime(),
      myNext = 10000000 + myT;
  for ( var i in tb.interval.i ) {
   if ( myNext > tb.interval.i[i].t ) {
    myNext = tb.interval.i[i].t;
    }
   }
  myNext = myNext - myT;
  return ( myNext<10 ? 10 : myNext );
  }
   
 function ito() {
  for ( var i in tb.interval.i ) {
   var myI = tb.interval.i[i],
       myT=(new Date()).getTime();
   if ( myI.to === 0 ) {
    d(i);
    }
   else if ( myI.to < myT ) {
    tb.interval.i[i].to = myT + myI.i;
    if ( myI.to !== -1 ) {
     tb.interval.i[i].to--;
     }
    if ( tb.interval.stopped !== true ) {
     tb.misc.exec( myI.cb );
     }
    }
   }
  for ( var x in tb.interval.i) {
   myTimer = tb.timer.add( 
    ito, 
    calcNext()
    );
   break;
   }
  }

 return { //public
  i: {},
  stopped: false,
  stop: function() {
   document.getElementById( '_processing' ).style.visibility = 'hidden';
   tb.interval.stopped = true;
   },
  start: function() {
   tb.interval.stopped = false;
   if ( myIndicator > 0 ) {
    if ( document.getElementById( '_processing') ) { 
     document.getElementById( '_processing' ).style.visibility = 'visible';
     }
    }
   for ( var x in tb.interval.i) {
    myTimer = tb.timer.add( 
     (function(){ return function(){ ito(); }})(), 
     10 
     );
    break;
    }
   },
  add: function(pCb, pMs, pTimeoutMs, pIn){
   pCb = pCb || tb.misc.nop;
   pMs = pMs || 10;
   pIn = ( pIn && pIn === true ? true : false );
   return a(pCb, pMs, pTimeoutMs, pIn);
   },
  abort: function(pId){
   pId = pId ? d(pId) : null;
   }
  };
 })();
 
tb.wait = (function(){

 function d(pId){
  if ( !tb.wait.w[pId] ) return;
  tb.wait.w[pId].cd = null;
  delete tb.wait.w[pId].cd;
  tb.wait.w[pId].cb = null;
  delete tb.wait.w[pId].cb;
  tb.wait.w[pId] = null;
  delete tb.wait.w[pId];
  }

 function a( pCd, pCb, pMs, pTimeoutMs, pIn ) {
  var myId = tb.misc.getid();
  
  tb.wait.w[myId] = { cd: pCd, cb: pCb, p: '', b: pIn };
  tb.wait.w[myId].p = tb.interval.add(
   function(){ wto(myId); },
   pMs,
   pTimeoutMs,
   pIn
   );
   
  return myId; 
  }
  
 function wto( pId ) {
  if ( !tb.wait.w[pId] ) return;
  var myW = tb.wait.w[pId],
      myI = myW.p,
      myT = (new Date()).getTime();
  //tb.log.add( 'wait cd... ');
  if ( tb.misc.test( myW.cd ) === true ) {
   //tb.log.add( 'wait cb... ');
   tb.interval.abort( myI );
   if ( tb.wait.stopped !== true ) {
    try {
     tb.misc.exec( myW.cb );
     d(pId);
     }
    catch (e) {
     }
    }
   }
  }

 return {
  // public
  w: {},
  stopped: false,
  stop: function() {
   tb.wait.stopped = true;
   },
  start: function() {
   tb.wait.stopped = false;
   },
  add: function( pCd, pCb, pMs, pTimeoutMs, pIn ) {
   pCd = pCd || 'true';
   pCb = pCb || tb.misc.nop;
   pMs = pMs || 10;
   pIn = ( pIn && pIn === true ? true : false );
   var r = a( pCd, pCb, pMs, pTimeoutMs, pIn );
   return r;
   },
  abort: function( pId ) {
   pId = pId ? d(pId) : null;
   }
  };
 })();

tb.observer = (function(){

 function d(pO){
  var myO=window,
      myA = (pO.i).split('~~~');
  myA.pop();
  myA = myA[0].split('~~');
  if ( myA[0].charAt(0) != '~' ) {
   while ( myA.length > 0 ){
    myO=myO[ myA.shift() ];
    }
   }
  else {
   try {
    myO = document.getElementById( myA[0].slice(1) );
    }
   catch (e) {
    return;
    }
   }
  if ( typeof pO.p != 'undefined' ) { // cancel a certain watched callback
   //tb.log.add( 'delete cb function: ( '+pO.p+' ) ');
   tb.observer.o[ pO.i ].c[pO.o][pO.p] = null;
   delete tb.observer.o[ pO.i ].c[pO.o][pO.p];
   if ( tb.misc.equals( {}, tb.observer.o[ pO.i ].c['once'] ) &&
        tb.misc.equals( {}, tb.observer.o[ pO.i ].c['cont'] ) ) {
    pO.p = null;
    delete pO.p;
    }
   }
  if ( typeof pO.p == 'undefined' ) { // unwatch object completely
   //tb.log.add( 'unwatch completely: ( '+pO.i+' ) ');
   if ( !tb.observer.o[pO.i] ) return;
   if ( typeof Object.prototype.watch == 'function' ) { // mozilla
    myO.unwatch( tb.observer.o[pO.i].e );
    }
   else {
    tb.wait.abort( tb.observer.o[pO.i].p );
    }
   tb.observer.o[pO.i] = null;
   delete tb.observer.o[pO.i];
   }
  }

 function a( pO, pE, pCb, pMs, pTimeoutMs, pOnce ){
  var myId = (( pO+'~~~'+pE ).replace( /\./g, '~~')).replace( /#/g, '~'),
      myOnce = ( ( typeof pOnce != 'undefined' && pOnce===false ) ? 'cont' : 'once' ),
      myO = window,
      myA = pO.split('.');
  if ( myA[0].charAt(0) !== '#' ) {
   while ( myA.length > 0 ){
    myO=myO[ myA.shift() ];
    }
   }
  else {
   try {
    myO = document.getElementById( myA[0].slice(1) );
    }
   catch (e) {
    return;
    }
   }
  var myOldVal = myO[pE];
  //tb.log.add( 'myO[pE] = '+myOldVal );
  if ( !tb.observer.o[ myId ] ) { // not yet observed
   tb.observer.o[ myId ] = {
    o: pO,
    e: pE,
    v: myOldVal,
    c: { once: {}, // once callbacks
      cont: {} // continued watch callbacks
      },
    p: 0 // will be wait ptr for non-mozilla browsers
    }; 
   /* mozilla special handling is disabled!
   if ( typeof Object.prototype.watch == 'function' && ( typeof pMs == 'undefined' || pMs === null ) ) { // mozilla
    //tb.log.add( 'mozilla watch() observer: ( '+(typeof(myO))+' ) '+pO+'.'+pE+' = '+myO[pE] );
    myO.watch( 
     pE, 
     function( pId, pOld, pNew ){ myO[pId]=pNew; tb.observer.notify( myId ); return pNew; } 
     );
    }
   else { // other browsers
   */
    //tb.log.add( 'tb.wait observer: ' + pMs );
    tb.observer.o[ myId ].p = tb.wait.add(
     function(){ return ( tb.misc.equals( tb.observer.o[ myId ].v, myO[tb.observer.o[ myId ].e] ) === false ? true : false ); },
     function(){ tb.timer.add( function(){ tb.observer.notify( myId ); } ); },
     pMs,
     pTimeoutMs
     );
   /* mozilla special handling is disabled!
    }
   */
   }
  var myCbId = tb.misc.getid();
  tb.observer.o[ myId ].c[myOnce][ myCbId ] = pCb; 
  var r = { "i": myId, "o": myOnce, "p": myCbId };
  if ( typeof Object.prototype.watch == 'function' && pTimeoutMs && !isNaN( pTimeoutMs ) ) { // mozilla
   //tb.log.add( 'tb.wait observer: timeout = ' + pTimeoutMs );
   var f=(function(){ var myR=r; return function(){ tb.observer.unobserve( myR ); } })();
   tb.timer.add( f, pTimeoutMs );
   }
  //tb.log.add( 'tb.wait observer: return = ' + (tb.misc.enumerate( r )).join(';') );
  return r;
  }
  
 return {
  o: {},
  stopped: false,
  stop: function() {
   tb.observer.stopped = true;
   },
  start: function() {
   tb.observer.stopped = false;
   },
  observe: function( pO, pE, pCb, pMs, pTimeoutMs, pOnce ) {
   if ( !pO || !pE || !pCb ) return false;
   if ( typeof pOnce == 'undefined' || pOnce !== false ) {
    pOnce=true;
    }
   return a( pO, pE, pCb, pMs, pTimeoutMs, pOnce );
   },
  unobserve: function( pO ) {
   d(pO);
   },
  notify: function( pId ) {
   //tb.log.add( ' notify starts: '+pId );
   if ( !tb.observer.o[ pId ] ) return;
   for (var i in tb.observer.o[ pId ].c['once']) {
    //tb.log.add( ' notify once cb-s ('+(typeof tb.observer.o[ pId ].c['once'][i])+') '+i+' execute.' );
    tb.observer.o[ pId ].c['once'][i]();
    tb.observer.o[ pId ].c['once'][i] = null;
    delete tb.observer.o[ pId ].c['once'][i];
    //tb.log.add( ' deleted '+i );
    }
   for (var i in tb.observer.o[ pId ].c['cont']) {
    //tb.log.add( ' notify cont cb-s '+i );
    tb.observer.o[ pId ].c['cont'][i]();
    }
   if ( tb.misc.equals( {}, tb.observer.o[ pId ].c['cont'] )===true ) {
    d( { "i": pId } );
    } 
   }
  }
 })();
 
tb.cache = (function(){
 //private
 function d( pId ) {
  tb.cache.c[pId] = null;
  delete tb.cache.c[pId];
  }

 function a( pWhat ) {
  var myId=tb.misc.getid();
  tb.cache.c[myId] = [ pWhat ];
  return myId;
  }

 // public
 return {
  c: {}, 
  set: function ( pId, pContent ) {
   if ( pId ) {
    tb.cache.c[pId] = pContent;
    }
   else {
    return a( pContent );
    }
   },
  get: function ( pId ) {
   return tb.cache.c[pId] || false ;
   },
  extract: function ( pId ) {
   var r = tb.cache.c[pId];
   pId = pId ? d(pId) : null;
   return r || false;
   }
  };
 })();

tb.misc = (function(){
 //private
 function cl( pObj ) {
  var myObj = {};
  for ( var i in pObj ) {
   myObj[i] = pObj[i];
   }
  return myObj;
  }

 return { // public

  nop: function() {
   },

  wait: function ( pCondition, pCallback, pFrequency ) { // compatibility function
   if ( isNaN( pFrequency ) === true ) {
    pFrequency = 100;
    }
   var myResult = ( pCondition 
    ? ( typeof pCondition == 'string' 
        ? eval( pCondition )
        : ( typeof pCondition == 'function'
            ? pCondition()
            : true
          )
      )
    : true
    )
   if ( myResult === false ) {
    var myToFunction = function() { tb.misc.wait( pCondition, pCallback, pFrequency ); };
    tb.timer.add( myToFunction, pFrequency );
    }
   else {
    ( pCallback 
    ? ( typeof pCallback == 'string' 
        ? eval( pCallback )
        : ( typeof pCallback == 'function'
            ? pCallback()
            : true
          )
      )
    : true
    )
    }
   },
  
  purge: function(d) { // thx doug crockford
   //tb.log.add( 'purge' )
   var a = d.attributes, i, l, n;
   if (a) {
    //tb.log.add( 'purge a' )
    l = a.length;
    for (i = 0; i < l; i += 1) {
     n = a[i].name;
     if (typeof d[n] === 'function') {
      d[n] = null; // donīt DELETE it - IE master fup.
      }
     }
    //tb.log.add( 'purge a ( '+i+' elements )' )
    }
   a = d.childNodes;
   if (a) {
    //tb.log.add( 'purge a_children' )
    l = a.length;
    for (i = 0; i < l; i += 1) {
     tb.misc.purge(d.childNodes[i]);
     }
    }
   },

  enumerate: function( pObj ) {
   if ( pObj && typeof pObj == 'object') {
    var myArray = [];
    for ( var i in pObj ) {
     if ( pObj.hasOwnProperty(i) ) {
      myArray.push( [ i, pObj[i] ] );
      }
     }
    return myArray;
    }
   },
 
  propcount: function( pObj ) {
   if ( pObj && typeof pObj == 'object') {
    var j = 0;
    for ( var i in pObj ) {
     if ( pObj.hasOwnProperty(i) ) {
      j++;
      }
     }
    return j;
    }
   },
 
  equals: function(pA, pB){
   var ret=true, 
       i, 
       j=0;
   if ( typeof pA != 'undefined' && typeof pB != 'undefined' ) {
    if ( typeof pA != typeof pB ) return false;
    switch ( typeof pA ) {
     case 'object':
      if ( tb.misc.propcount( pA ) === tb.misc.propcount( pB ) ) {
       for ( j in pA ) {
        if ( !pB[j] ) {
         return false;
         }
        else {
         ret=( ret===false ? false : tb.misc.equals( pA[j], pB[j] ) );
         if ( ret===false ) return false;
         }
        }
       }
      else {
       return false;
       }
      break;
     case 'array':
      i = pA.length;
      while ( ret===true && j < i ) {
       ret=tb.misc.equals( pA[j], pB[j] );
       if ( ret===false ) return false;
       j++;
       }
      break;
     default:
      if ( typeof pA != typeof pB ) return false;
      ret=( ( pA || 'undefined' ) !== ( pB || 'undefined' ) ? false : true );
      break;
     }
    }
   return ret;
   },

  clone: function( pObj ) {
   cl( pObj );
   },
  
  cloneObj: function( pObj ) { // compatibility function
   cl( pObj );
   },
  
  getid: function() {
   var myDate = new Date();
   return '_'+myDate.getTime()+'_'+Math.random().toString().replace( /\./, '');
   },

  instance: function( pParent, pChild ) {
   var c = new Function();
   c.prototype = pChild;
   var p = new c();
   p.prototype = pParent;
   return p;
   },

  test: function( pCd ) {
   if ( typeof pCd != 'undefined' ) {
    if ( typeof pCd == 'function' ) {
     try { 
      var r = pCd();
      pCd = null;
      delete pCd;
      }
     catch(e){
      }
     return r;
     }
    else if ( typeof pCd == 'string' && pCd.length > 0 ) {
     try{
      var r = eval( '( '+pCd+' )' );
      }
     catch (e) {
      }
     return r;
     }
    }
   },

  exec: function( pCb ) {
   if ( typeof pCb != 'undefined' ) {
    if ( typeof pCb == 'function' ) {
     try { 
      pCb(); 
      pCb = null;
      delete pCb;
      }
     catch(e){
      }
     }
    else if ( typeof pCb == 'string' && pCb.length > 0 ) {
     try{
      var r = eval( '(function(){ '+pCb+'; })()' );
      }
     catch (e) {
      }
     }
    }
   }
  }
 })();

tb.request = (function(){
 // private
 var count=0,
     interval=30,
     msoft=[ 'MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP' ];
 
 function addhandler( pId, pCb ) {
  tb.cache.set( pId, pCb );
  }
  
 function getConnection( pId ) {
  var myObj = {};
  var myHttp;
  try {
   myHttp = new XMLHttpRequest();
   myObj = { connection:myHttp, identifier:pId };
   }
  catch(e) {
   for(var i=0; i<msoft.length; ++i){
    try {
     myHttp = new ActiveXObject( msoft[i] );
     myObj = { connection:myHttp, identifier:pId };
     }
    catch(e){
     }
    }
   }
  finally {
   return myObj;
   }
  }
 
 function handlereadystate( pReq, pCallback, pStateChange, pFailure ) {
  var myConnection = this;
  var myReq = pReq;
  var myPoll = tb.interval.add(
   (function(){
    var myreadystate=0;
    return function(){
     if ( myReq.connection.readyState !== myreadystate ) {
      myreadystate = myReq.connection.readyState;
      pStateChange();
      }
     if( myReq.connection.readyState==4 ){
      handleTransactionResponse( pReq, pCallback, pFailure );
      tb.interval.abort( myPoll );
      }
     };
    })(),
   tb.request.interval 
   );
  }

 function handleTransactionResponse( pReq, pCallback, pFailure ) {
  try{
   var httpStatus = pReq.connection.status;
   }
  catch(e){
   var httpStatus = 13030;
   }
  if( httpStatus >= 200 && httpStatus < 300 ){
   var responseObject = createResponseObject( pReq, pCallback.argument);
   try {
    pCallback.apply(pCallback, [responseObject.responseXml, responseObject.responseText, responseObject]);
    }
   catch (e) {
    }
   }
  else {
   pFailure(); 
   }
  release(pReq);
  }

 function createResponseObject(pObj, pCallbackArg) {
  var myObj = {};
  myObj.tId = pObj.identifier;
  myObj.status = pObj.connection.status;
  myObj.statusText = pObj.connection.statusText;
  myObj.allResponseHeaders = pObj.connection.getAllResponseHeaders();
  myObj.responseText = pObj.connection.responseText;
  myObj.responseXML = pObj.connection.responseXML;
  if(pCallbackArg){
   myObj.argument = pCallbackArg;
   }
  return myObj;
  }

 function release( pReq ) {
  tb.request.dec();
  pReq.connection = null;
  delete pReq.connection;
  pReq = null;
  delete pReq;
  }  

 return { // public
  cachable: false,
  
  inc: function(){
   count += 1;
   if ( document.getElementById( '_loading') ) { 
    document.getElementById( '_loading' ).style.visibility = 'visible';
    }
   },

  dec: function(){
   count -= 1;
   if ( count < 1) {
    if ( document.getElementById( '_loading' ) ) {
     document.getElementById( '_loading' ).style.visibility = 'hidden';
     }
    }
   },
 
  add: function ( pOptions ) {
   var myIndex = tb.misc.getid(),
       myUid = 'tb'+myIndex,
       myXmlreq = false,
       myMethod = ( pOptions.method ? pOptions.method.toUpperCase() : false ) || 'POST',
       myUrl = pOptions.url,
       myParms = '';
       
   for ( var i in pOptions.parms ) { // concat parameter string
    myParms += ( ( myParms.length > 0 ? '&' : '' ) + i + '=' + pOptions.parms[i] );
    }
      
   var myResponseXmlHandler = pOptions.success || tb.misc.nop,
       myFailureHandler = pOptions.failure || tb.misc.nop,
       myStateHandler = pOptions.statechange || tb.misc.nop,
       myIsCachable = pOptions.cachable  || false,
       myIsAsync = pOptions.async || true;
   
   tb.request.inc();

   if ( myIsCachable === false ) { // proxy disable
    if ( myUrl.indexOf( '/?/' ) > -1 ) { // its a CakePHP service, POST only.
     myMethod = 'POST';
     if ( myParms === null || myParms === '') {
      myParms = 'tbUid='+myUid;
      }
     else { // parms given
      myParms = myParms+'&tbUid='+myUid;
      }
     }
    else {
     myUrl += ( myUrl.indexOf('?') < 0 ? '?' : '&' ) +'tbUid='+myUid;
     }
    }
   
   myXmlreq = getConnection( myUid );
   if ( myXmlreq ) {
    if ( myMethod == 'GET' && myParms !== '' ) {
     myUrl = myUrl + '&' + myParms;
     }
    if ( myMethod == 'POST' ) {
     myXmlreq.connection.open('POST', myUrl, myIsAsync);
     }
    else {
     myXmlreq.connection.open('GET', myUrl, myIsAsync);
     } 
    if ( myIsAsync === true ) {
     handlereadystate( myXmlreq, myResponseXmlHandler, myStateHandler, myFailureHandler, myUrl);
     }
    if ( myMethod == 'POST' ) {
     if ( myParms !== '' ) {
      myXmlreq.connection.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
      myXmlreq.connection.send(myParms);
      }
     else {
      myXmlreq.connection.send(null);
      }
     }
    else {
     myXmlreq.connection.send(null);
     }
    if ( myIsAsync === false ) {
     tb.request.dec();
     if ( myXmlreq.connection.status >= 200 && myXmlreq.connection.status < 300 ) {
      myResponseXmlHandler( myXmlreq.connection.responseXML, myXmlreq.connection.responseText);
      }
     else {
      myFailureHandler();
      }
     }
    if ( myMethod == 'POST' ) {
     return myXmlreq;
     }
    else {
     return null;
     }
    }
   else {
    return false;
    }
   },
   
  abort: function( pReq ) {
   release( pReq );
   }
  };   
 })();
 
 tb.loader = {
 path:'service/',
 cachable: {
  js: false,
  css: false,
  tpl: false,
  file: false
  },
 
 // public
 fileload: function( pMod, pEle, pIsAsync, pCachable ){
  var myId = (myMod+'_'+myEle+'_file').replace( /[\.|\\|\/]/g, '_'); // concat id

  var myOptions = {
   method: 'GET',
   url: tb.loader.path + 'service.php',
   parms: { 
    url: 'twobirds/modules/' + pMod + '/' + pEle 
    },
   success: tb.loader.fileload_cb(myId), 
   async: ( pIsAsync && pIsAsync !== null ? pIsAsync : true ),
   cachable: pCachable || tb.loader.cachable.file 
   }

  tb.require.r[myId]=1;
  tb.request.add( myOptions );
  },
 
 fileload_cb: function( pId ) {
  var myId = pId;
  return  function( pXml, pText, pObj ) {
   tb.cache.set( myId, pText );
   tb.require.r[myId]=2;
   }
  },

 jsload: function( pMod, pEle, pIsAsync ) {
  var myId = (pMod+'_'+pEle+'_js').replace( /[\.|\\|\/]/g, '_');
  tb.require.r[myId]=1;
  var myUrl = ( tb.loader.cachable.js === false 
   ? this.path + 'service.php?url=twobirds/modules/' + pMod + '/js/' + pEle + '.js'
   : 'twobirds/modules/' + pMod + '/js/' + pEle + '.js'
   );
  //tb.log.add( myUrl );
  
  var myScript = document.createElement('script');
  myScript.setAttribute('language','javascript');
  myScript.setAttribute('type','text/javascript');
  myScript.setAttribute('src', myUrl);
  document.getElementsByTagName('head')[0].appendChild(myScript);
  },
 
 cssload: function( pMod, pEle, pIsAsync ) {
  var myId = (pMod+'_'+pEle+'_css').replace( /[\.|\\|\/]/g, '_');
  tb.require.r[myId]=1;
  var myUrl = ( tb.loader.cachable.css === false 
   ? this.path + 'service.php?url=twobirds/modules/' + pMod + '/css/' + pEle + '.css'
   : 'twobirds/modules/' + pMod + '/css/' + pEle + '.css'
   );

  var myScript = document.createElement('link');
  myScript.setAttribute('rel','stylesheet');
  myScript.setAttribute('type','text/css');
  myScript.setAttribute('href', myUrl);
  document.getElementsByTagName('head')[0].appendChild(myScript);
  },

 tplload: function( pMod, pEle, pIsAsync ) {
  var myId = (pMod+'_'+pEle+'_tpl').replace( /[\.|\\|\/]/g, '_'),
      myOptions = {
       method: 'GET',
       url: ( tb.loader.cachable.tpl === false 
        ? this.path + 'service.php?url=twobirds/modules/' + pMod + '/tpl/' + pEle + '.html.tpl'
        : 'twobirds/modules/' + pMod + '/tpl/' + pEle + '.html.tpl'
        ),
       success: tb.loader.tplload_cb(myId), 
       async: ( pIsAsync && pIsAsync !== null ? pIsAsync : true ),
       cachable: tb.loader.cachable.tpl 
       }; // concat id
  tb.require.r[myId]=1;
  tb.request.add( myOptions );
  },

 tplload_cb: function(pId) {
  var myId = pId;
  return function ( pXml, pText, pObj ) {
   tb.cache.set( myId, pText );
   tb.require.r[myId]=2;
   };
  },

 tplget: function( pMod, pEle) {
  var myId = (pMod+'_'+pEle+'_tpl').replace( /[\.|\\|\/]/g, '_'); // concat id
  return tb.cache.get( myId );
  }
  
 };

tb.require = ( function(){
 //private
 function iscss( pMod, pEle ) {
  var myId = (pMod+'_'+pEle+'_css').replace( /[\.|\\|\/]/g, '_'),
      myIdent = pMod+'/css/'+pEle+'.css',
      myHref = '';
  if ( document.styleSheets.length > 0 ) {
   for ( var i=0; i<document.styleSheets.length; i++ ) {
    try {
     if ( /MSIE/.test(navigator.userAgent ) === true ) {
      myHref = document.styleSheets(i).href;
      }
     else {
      myHref = document.styleSheets.item(i).href;
      }
     }
    catch (e) {
     alert( e.toString() + i );
     return false;
     }
    if ( myHref && myHref.length && myHref.length > 0 && myHref.indexOf( myIdent ) > -1 ) {
     tb.require.r[myId] = 2;
     return true;
     }
    else {
     }
    }
   }
  return false;
  }

 function checkstat( pMod, pEle, pTyp, pChk, pCb ) {
  if ( !pMod || !pEle || !pTyp ) {
   tb.log.show();
   tb.require.debug();
   }
  var myId = (pMod+'_'+pEle+'_'+pTyp).replace( /[\.|\\|\/]/g, '_');
  
  var myLog='<b>method</b> tb.require.checkstat: ' + pMod + '.' + pEle + '.'+pTyp;
  switch ( pTyp ) {
   case 'js':
    if ( tb.require.r[myId] == 2 ) {
     return 2;
     }
    if ( ( window[pMod] && window[pMod][pEle] ) || tb.misc.test( pChk ) === true ) {
     tb.require.r[myId] = 2;
     if ( typeof pCb == 'function' ) {
      tb.misc.exec(pCb);
      }
     return 2;
     }
    else {
     return 1;
     }
    break;
   case 'css':
    if ( tb.require.r[myId] == 2 ) {
     return 2;
     }
    return ( iscss( pMod, pEle ) === true ? 2 : 1 );
    break;
   default: // something from cache...
    if ( tb.require.r[myId] == 2 ) {
     return 2;
     } 
    else {
     return 1;
     }
    break;
   }
  }
  
 function getStat( pMod, pEle, pTyp, pChk, pCb ) {
  if ( !pMod || !pEle || !pTyp ) {
   tb.log.show();
   tb.require.debug();
   }
  var myId = (pMod+'_'+pEle+'_'+pTyp).replace( /[\.|\\|\/]/g, '_');
  if ( typeof tb.require.r[myId] == 'undefined' ) {
   return( 0 );
   }
  else {
   var ret =  checkstat( pMod, pEle, pTyp, pChk, pCb );
   //alert( ret );
   return ret;
   }
  }
 
 function addreq( pMod, pEle, pTyp, pChk, pCb ){
  if ( !pMod || !pEle || !pTyp ) {
   tb.log.show();
   tb.require.debug();
   }
  var myId = (pMod+'_'+pEle+'_'+pTyp).replace( /[\.|\\|\/]/g, '_');
  tb.require.r[myId] = 1;
  switch ( pTyp ) {
   case 'js':
    tb.loader.jsload( pMod, pEle, true );
    break;
   case 'css':
    tb.loader.cssload( pMod, pEle, true );
    break;
   case 'tpl':
    tb.loader.tplload( pMod, pEle, true );
    break;
   case 'file':
    tb.loader.fileload( pMod, pEle, true );
    break;
   }
  }
  
 //public
 return {
  r: {}, //requirements array
  
  debug: function() {
   var s='<p><u>debug require:</u><br />';
   for ( var x in tb.require.r ) {
    s += '[' + x + ']<br />has status '+tb.require.r[x]+'<br />';
    };
   s+='</p>';
   document.getElementsByTagName('body')[0].innerHTML = document.getElementsByTagName('body')[0].innerHTML + '<br />'+s;
   tb.interval.t={};
   },

  checkall: function( pReq ){
   var myTyp,
       myMod,
       myEle,
       myChk,
       myCb,
       myId;
   if ( !pReq  ) {
    tb.log.show();
    tb.require.debug();
    }
   var myReq = ( typeof pReq == 'string' ? eval ( '('+pReq+')' ) : pReq ),
       myDone = true;
   
   var l = myReq.length;
   for ( var i = 0; i < l; i++ ) {
    myTyp = myReq[i][0];
    myMod = myReq[i][1];
    myEle = myReq[i][2];
    myChk = (myReq[i][0] == 'js' && myReq[i][3] && typeof myReq[i][3] == 'function') ? 
            myReq[i][3] :
            function(){ return true; },
    myCb  = (myReq[i][0] == 'js' && myReq[i][4] && typeof myReq[i][4] == 'function') ? 
            myReq[i][4] :
            function(){};
        
    var myStat = checkstat( myMod, myEle, myTyp, myChk, myCb );
    if ( myStat == 2 ) { // already loaded
     continue;
     }
    else { // loading or undefined
     myDone = false;
     }
    }
   return myDone;
   },  

  addrequirement: function( pMod, pEle, pTyp, pChk, pCb ) {
   //tb.log.add('<b>method</b> tb.require.addrequirement');
   addreq( pMod, pEle, pTyp, pChk, pCb );
   },
   
  add: function( pReq, pCb, pIsAsync ){
   //tb.log.add('tb.require.add');
   var myCb = pCb || tb.misc.nop,
       myIsAsync = pIsAsync || true;
   if ( !pReq ) {
    //tb.log.add( '<u>tb.require.add:</u> (pReq, pCb, pIsAsync ) = ( '+pReq+',<br /> typeof = '+typeof pCb+','+pIsAsync+')');
    tb.log.show();
    tb.require.debug();
    }
   var myReq = ( typeof pReq == 'string' ? eval ( '('+pReq+')' ) : pReq ) ,
       myDone = true;
   
   var l = myReq.length;
   for ( var i = 0; i < l; i++ ) {
    var myTyp = myReq[i][0],
        myMod = myReq[i][1],
        myEle = myReq[i][2],
        myChk = (myReq[i][0] == 'js' && myReq[i][3] && typeof myReq[i][3] == 'function') ? 
                myReq[i][3] :
                function(){ return true; },
        myEcb = (myReq[i][0] == 'js' && myReq[i][4] && typeof myReq[i][4] == 'function') ? 
                myReq[i][4] :
                function(){},
        myId = (myMod+'_'+myEle+'_'+myTyp).replace( /[\.|\\|\/]/g, '_'); // concat id
        
    var myStat = getStat( myMod, myEle, myTyp, myChk, myEcb );
    if ( myStat == 2 ) { // already loaded
     continue;
     }
    else { // loading or undefined
     myDone = false;
     if ( myStat === 0 ) {
      addreq( myMod, myEle, myTyp );
      }  
     }
    }

   //tb.log.add( 'waiting for requirements ...' ); 
   tb.wait.add( 
    ( function(){ return function(){ return tb.require.checkall( myReq ); } })(), 
    ( function(){ return function(){ if ( typeof myCb != 'undefined' ) { if (typeof myCb == 'string') { eval( '( '+myCb+' )' ); } else { myCb.apply(myCb); } } }; })(), 
    30 
    );

   }  
    
  };
 })();

tb.element = ( function(){
 // private

 // public 
 return {
  show: function ( pDivId, pModule, pElement, pObject ) {
   var myM = pModule,
       myE = pElement,
       myD = pDivId,
       myO = pObject, 
       myMs = 20,
       myId = (myM+'_'+myE+'_js').replace( /[\.|\\|\/]/g, '_'),
       myCb = ( function( myM, myE, myId, myD ){ 
        var m = myM,
            e = myE,
            i = myId,
            d = myD,
            o = myO;
        return function(){     
         tb.require.r[i]=2; 
         tb.timer.add( function(){ if ( typeof window[m][e].init == 'function' ) { window[m][e].init.apply( window[m][e], [ d, o ] ); } }, 10);
         };
        })( myM, myE, myId, myD );
   window[myM] = window[myM] || {}; // namespace
   if ( typeof window[myM][myE] == 'object' ) {
    tb.misc.exec(myCb);
    return;
    }
   if ( typeof window[myM][myE] == 'undefined' ) {
    window[myM][myE] = 'loading: '+pModule+'.'+pElement;
    if ( typeof tb.require.r[myId] == 'undefined' || tb.require.r[myId] === 0 ) { // if not loading load
     tb.require.addrequirement( myM, myE, 'js' );
     }
    }
   tb.observer.observe( myM, myE, function(){ tb.misc.exec(myCb); } ); // when exists call cb
   },
 
  require: tb.require.add  // compatibility 
  }  
 })();
 
 tb.log = (function(){
 var isLog = true;
 
 return {
  l: [ 'log:' ],
  
  add: function ( pText ) {
   if( isLog === true ) {
    if ( typeof console == 'undefined' ) {
     tb.log.l[tb.log.l.length] = pText;
     while ( tb.log.l.length > 1000) {
      tb.log.l.shift();
      }
     }
    else { //mozilla
     console.log( pText );
     }
    }
   },
 
  show: function() {
   isLog = false;
   document.getElementsByTagName('body')[0].style.overflow = 'auto';
   document.getElementsByTagName('body')[0].innerHTML = '<p>'+tb.log.l.join('<br />')+'</p>';
   document.getElementsByTagName('body')[0].scrollTop = document.getElementsByTagName('body')[0].scrollHeight;
   },
  
  clear: function() {
   tb.log.l=[];
   document.getElementsByTagName('body')[0].innerHTML = '';
   }
  };
 })();
 
tb.error = {
 add: function (pMsg, pFile, pLine) {
  var myDebugHtml  = "<p><font color='red'><b>Error: </b></font>" + pMsg + "<br /><b>File: </b>" + pFile + "<br /><b>Line: </b>" + pLine;
  var myDebugMsg  = "Error: " + pMsg + "\nFile: " + pFile + "\nLine" + pLine;
  tb.log.add( myDebugHtml );
  //alert(myDebugMsg);
  return true;
  }
 };


window.onerror=tb.error.add;


function checkForm(form)
{   

    if( !form.vname.value || !form.nname.value || !form.strasse.value || !form.hausnr.value || !form.plz.value || !form.ort.value || !form.telefon.value || !form.fUsername.value || !form.pass.value || !form.pass2.value || !form.sicherheitscode.value)
    {
        alert("Bitte ALLE mit * gekennzeichneten Felder ausfuellen");
        return false;
    }
	   if( form.email.value.search(/^[\w\d][\w\d\,\.\-]*\@([\w\d\-]+\.)+([a-zA-Z]+)$/) == -1 )
    {
        alert("Bitte geben Sie eine korrekte Email Adresse an");
        return false;
    }
	if(form.agb.checked == 0)
    {
    alert("Sie muessen unseren AGB zustimmen.");
    return false;
    } 

}
