/*-------------------------------------------------------------------------
    /\__/\   gloPreloader v2.0 2007/01/19 h 01.02 24h GMT+1
   ( -.-  )  by g4toloc0 - www.sebastian.it
    {____}/>  
--------------------------------------------------------------------------
warning: gloPreloader is an horrible example of poor programming practices
         with lots of global vars dancing around and so much ugly code.
--------------------------------------------------------------------------

version history:

v2.0.3 2007/01/26
- gloPreloaderReloadJs bug fix

v2.0.2 2007/01/22
- small bug fixes

v2.0.1 2007/01/20
- added (null) to http.send() call
 
v2.0 2007/01/19
- some of my friends have problems while loading big files on slow connections
  so i've entirely rewritten the loader core script - now it uses async calls
  This is really good since before page loading was blocking the UI.
  Now i think that using synched calls like http.open("GET",urlString,true);
  is something to be completely avoided..  

v1.3 2007/01/19
- new function gloPreloaderReloadJs function added (directly from Primera!)

v1.2.1 2006/11/29
- trying to trap this error from firefox...
  Errore: uncaught exception:
  [Exception... "Access to XPConnect service denied"
  code: "1011" nsresult: "0x805303f3 (NS_ERROR_DOM_XPCONNECT_ACCESS_DENIED)" 
  location: "http://www.sebastian.it/main/js/glopreloader.js Line: 77"]

v1.2 2006/08/29
added css dynamic loading.

v1.1 2006/08/24
extended compatibility with ie - now glopreloader is able to preload images
even with ie.

v1.0 2006/08/24
extended basic compatibility with IE (js files preload only)

v0.1a - 2006/06/21 l.m.: 2006/06/21 [ARG-NED 0-0]
first working version - firefox only
--------------------------------------------------------------------------*/

/*
  usage
	=============================================================================
  s=document.getElementById("screen");
  var preloadArray=[
	                  '','','s.innerHTML="Primera loader v1.1 2006/08/23<br><br>Preloading preloader<br>"','',
	                  '/NE/js/gfz_sprites.js'                  ,'GFZSprites','s.innerHTML+="<br>Loading GFZ Sprites engine."'                                               ,'s.innerHTML+="<br><font color=red>Done.</font>"',
                    '/NE/images/interface/loaderGraphics.png',''          ,'s.innerHTML+="<br>Loading Loader graphics.";'                                                 ,'s.innerHTML+="<br><font color=red>Done.</font>"',
	                  ''                                       ,''          ,'s.innerHTML+="<br>Building Loader sprites.";gfzAddSprites("","/NE/js/gijeSprites_loader.js");','s.innerHTML+="<br><font color=red>Done.</font>"',
	                  '/NE/js/marlene.js'                      ,'JSMarlene' ,'s.innerHTML+="<br>Initializing Marlene."'                                                     ,'s.innerHTML+="<br><font color=red>Done.</font>"',
	                  ''                                       ,''          ,'setTimeout("buildLoader()",100)'                                                              ,''
							 ];
  gloPreloader(preloadArray);
*/

var GLOPRELOADERWAIT=10;
//fetch file interval
var GLOPRELOADERCACHEON=1; 
//if enabled glopreloader will preload content
//disable to load content on the fly - e.g. you can reload javascripts on the
//fly is GLOPRELOADERCACHEON is set to false

function gloPreloaderMakeNonCachableUrl(urlString) {
  if (urlString.indexOf('?')!=-1) {
    urlString=urlString.replace(/\?(.*)/,'?');
    urlString=urlString+encodeURIComponent(RegExp.$1);
    urlString=urlString.replace(/%3D/g,'=');
    urlString=urlString.replace(/%26/g,'&');
  } else {
   urlString=urlString+'?';
  }
  urlString += '&' + ((new Date()).getTime()); //force reload by appending date
  return urlString;
}

var gloPreloaderReadyCalling=0;
var gloPreloaderReadyTimx;
function gloPreloaderReadyStateChanged(http) {
  if (http.readyState == 3) {
    if (!gloPreloaderReadyCalling) {
      gloPreloaderReadyCalling=1;
      if (gloPreloaderLoadingFunc) {
        clearInterval(gloPreloaderReadyTimx);
        gloPreloaderReadyTimx=setTimeout("eval(gloPreloaderLoadingFunc);gloPreloaderReadyCalling=0;",50);
      } else {
        gloPreloaderReadyCalling=0;
      }
    }       
  }
  if (http.readyState == 4) {
    clearInterval(gloPreloaderReadyTimx);
    gloPreloaderReadyCalling=0;
    if (http.status!=200) {
      alert("Glopreloader Error\n"+http.status+"\n"+http.statusText);
      return; 
    }
    if (gloPreloaderLoadingFuncEnd)
      eval(gloPreloaderLoadingFuncEnd);
    var result=http.responseText;
    gloPreloaderIsLoading=0;
    var obj=document.getElementById(preloadList[gplZ+1]);
  	var fileType=gloPreloaderGetType(preloadList[gplZ]);

  	if (fileType=='image') {
        //alert(preloadList[gplZ]+' '+obj+' prel:'+preloadList[gplZ+1]);
        if (obj)
    	    obj.setAttribute('src',preloadList[gplZ]);
  	}
      
      if (fileType=='css') {
        if (obj) //since this object is already defined reload its content with cache disabled 
    	    obj.setAttribute('href',gloPreloaderMakeNonCachableUrl(preloadList[gplZ]));
        else { //if css does not exists - create it on the fly
    		  var head=document.getElementsByTagName('head')[0];
      	  var style=document.createElement('link');
           style.id=preloadList[gplZ+1];
           style.rel='stylesheet';
      	  style.type='text/css';
           style.href=preloadList[gplZ];
     		  head.appendChild(style);
        }
      }
       
  	if (fileType=='javascript') {
  		  var head=document.getElementsByTagName('head')[0];
        var old = document.getElementById(preloadList[gplZ+1]);
        if (old) {
          //non funziona :( !! o almeno non con i file .js.php

  			  head.removeChild(old);
      	  var script=document.createElement('script');
           script.id = preloadList[gplZ+1];
				  script.type = 'text/javascript';
           if (preloaderBrowser) {
      		   head.appendChild(script);
             try {
      		     script.innerHTML=result;
             } catch(er) {
               alert(er);
             }   
           } else {
					   script.defer=false;
      		   head.appendChild(script);
             script.src=preloadList[gplZ];
           }
        } else {
      	  var script=document.createElement('script');
           script.id = preloadList[gplZ+1];
           if (preloaderBrowser) {
      		   head.appendChild(script);
             try {
      		     script.innerHTML=result;
             } catch(er) {
               alert(er);
             }   
           } else {
					   script.defer=false;
      		   head.appendChild(script);
             script.src=preloadList[gplZ];
           }
       }   
  	}
    gloPreloaderEnd();
  }
}

var gloPreloaderIsLoading=0;
function gloPreloaderGetfile(urlString) {
//v2.2 25/08/06 - ie extended compatibility
//v2.0 06/06/06 - now there is a param
//to force reload of a file (e.g. javascript reload on the fly)
  var http=null;
  try {
    http = new XMLHttpRequest();
  } catch (error) {
    http=null;
  }
  if (!http) {
    try {
      http = new ActiveXObject("Microsoft.XMLHTTP");
     } catch (error) {}
  }
  if (http) {
    if (!GLOPRELOADERCACHEON) {         //cache is disabled
      urlString=gloPreloaderMakeNonCachableUrl(urlString); 
    }
    try {  //v1.2.1
      http.open("GET",urlString,true); //v2.0
      //http.open("GET",urlString,false);
      gloPreloaderIsLoading=1;
      http.onreadystatechange=function(){gloPreloaderReadyStateChanged(http)};
      http.send(null); //some browser versions need null as a param.. otherwise they rise an exception
    } catch (er) {
      //alert(er);
      setTimeout("gloPreloaderGetfile('"+urlString+"')",100); //this is for ie..
    }
  }
}

function gloPreloaderReloadJs(filename,Id) {
//v1.2 26/01/05
  var ggsdoc=document;
  var head   = ggsdoc.getElementsByTagName('head').item(0);
  var old = ggsdoc.getElementById(Id);
  if (old) head.removeChild(old);
  var script = ggsdoc.createElement('script');
  script.id = Id;
  script.type = 'text/javascript';
  head.appendChild(script);
  
  var http=null;
  try {http = new XMLHttpRequest();} catch (error) {http=null;}
  if (!http) {try {http = new ActiveXObject("Microsoft.XMLHTTP");}catch (error){}}
  if (http) {
    http.open("GET",filename+'?'+((new Date()).getTime()),false);
    http.send(null); //some browser versions need null as a param.. otherwise they rise an exception  
    var jsFileContent=http.responseText;
    script.innerHTML=jsFileContent;
  }        
}

function gloPreloaderGetType(fileName) {
	var reImage=/\.gif|\.png|\.jpg/i;
	var reJs=/\.js/i;
  var reCss=/\.css/i;
  var reJsPHP =/\.js\.php/i;
  var reCssPHP=/\.css\.php/i;
	
  //complex types must match first
  if (reJsPHP.test(fileName))
    return 'javascript';
  if (reCssPHP.test(fileName))
    return 'css';  
  //simple checks
	if (reImage.test(fileName))
	  return 'image';
	if (reJs.test(fileName))
	  return 'javascript';
  if (reCss.test(fileName))
    return 'css';  
}


function gloPreloaderEnd(sUrl) {
  try {
    eval(preloadList[gplZ+3]);
  } catch(er) {
    alert('GLOPRELOADER END ERROR:\n'+er);
  }    
  gloPreloaderWorking=0;
  if (!sUrl) {
    gplZ+=4;
    setTimeout("gloPreloader()",GLOPRELOADERWAIT);
  } else {
    GLOPRELOADERCACHEON=1; //re-enable cache
  }
}
  
var gloPreloaderLoadingFunc=null;
var gloPreloaderLoadingFuncEnd=null;
function gloPreloaderDo(sUrl,sId) {
/*
v2.1.1 22/01/07
  stop evaluating gloPreloaderLoadingFunc if not defined
v2.1 1/9/06
dinamically refresh already loaded js files!
v2.0 1/9/06
dinamically refresh already loaded css files!
now accepts a file as a parameter
glopreloader will dynamically load its content onto the specified sId object
e.g.
load a css like this
- <link rel="stylesheet" type="text/css" id="css_main" href="<?php echo $CONFIG_HTTP_CSS?>/main.css">
then run this js to reload
- <input value="reload" type="button" onclick="gloPreloaderDo('<?php echo $CONFIG_HTTP_CSS?>/main.css','css_main')">
that's all

v1.2 29/08/06
dinamically loads new css files
*/

  if (gloPreloaderIsLoading)
    return;

  if (sUrl) {
    GLOPRELOADERCACHEON=0; //force reload
    gplZ=0;
    preloadList[gplZ]=sUrl;
    preloadList[gplZ+1]=sId; 
    preloadList[gplZ+2]=''; //start func
    preloadList[gplZ+3]=''; //end func
  }

  gloPreloaderLoadingFunc=null;
  try {
    var initLoadFunc=preloadList[gplZ+2];
    if (initLoadFunc.indexOf('|')!=-1) {
      aILF=initLoadFunc.split('|');
      initLoadFunc=aILF[0];
      gloPreloaderLoadingFunc=aILF[1]; //this function will be evaluated during long downloads (by firefox)
      gloPreloaderLoadingFuncEnd=aILF[2]; //after long loading call this one
    } else {
      gloPreloaderLoadingFunc='';
      gloPreloaderLoadingFuncEnd='';
    }
    eval(initLoadFunc);
  } catch(er) {
    alert('GLOPRELOADER INIT ERROR:\n'+er+'\nCurrent function:\n'+initLoadFunc);
  }    
  if (preloadList[gplZ]!='') {
    //gloPreloaderGetfile(preloadList[gplZ],gplZ);   
    setTimeout("gloPreloaderGetfile(preloadList[gplZ],gplZ)",GLOPRELOADERWAIT);   
  } else {
    gloPreloaderEnd(sUrl);
  }
}

var gplZ=0;
var preloadList;
var gloPreloaderWorking=0;
var preloaderBrowser=null;

function gloPreloader(pl) {

  try {
  	if (preloaderBrowser==null) {
      var tt=navigator.appName;
  		preloaderBrowser=1; //not IE
      if (tt.indexOf('Microsoft') != -1)
  			preloaderBrowser=0;	//IE
    } 
  
    if (pl) {
      preloadList=pl;
      gplZ=0;
    }  
  	var zEnd=preloadList.length;
    if (gplZ<zEnd) {
      if (!gloPreloaderWorking) {
        gloPreloaderWorking=1;
        gloPreloaderDo();
      }
    }
  } catch(er) {
  }
}
