/**
* From domready.js
*
* Cross browser mozilla's 'onDOMContentLoaded' implementation.
* Executes a function when the dom tree is loaded without waiting for images.
*
* Based on +Element.Events.domready+ from Mootools open source project,
* this tiny javascript library adds the emulated 'DOMContentLoaded' functionality.
*
* Features:
* - No dependency on external libraries
* - Compatible with Prototype.js
*
* Tested browsers (Windows):
* - IE 7 (XP standalone)
* - IE 6 SP2
* - Firefox 2.0.0.4
* - Opera 9.21
*
* Tested browsers (Mac OS X):
* - Safari 2.0.4
* - Firefox 2.0.0.4
* - Mac Opera 9.21
* - Mac IE 5.2.3
*
* Copyright (c) 2007 Takanori Ishikawa.
* License: MIT-style license.
*
* MooTools Copyright:
* copyright (c) 2007 Valerio Proietti, <http://mad4milk.net>
*
*
* See Also:
*
* mootools
* http://mootools.net/
*
* The window.onload Problem - Solved!
* http://dean.edwards.name/weblog/2005/09/busted/
*
* [PATCH] Faster onload for Event.onload
* http://dev.rubyonrails.org/ticket/5414
* Changeset 6596: Support for "DOMContentLoaded" event handling (prototype.js event branch)
* http://dev.rubyonrails.org/changeset/6596
*
*/

if (typeof BPEvent == 'undefined') 
{

	BPEvent = window.BPEvent = new Object();

	/*
	* Registers function +fn+ will be executed when the dom
	* tree is loaded without waiting for images.
	*
	* Example:
	*
	* BPEvent.domReady.add(function() {
	* ...
	* });
	*
	*/
	BPEvent.domReady = {
		add: function(fn) {

			//-----------------------------------------------------------
			// Already loaded?
			//-----------------------------------------------------------
			if (BPEvent.domReady.loaded) 
			{	
				return fn();
			}

			//-----------------------------------------------------------
			// Observers
			//-----------------------------------------------------------
			var observers = BPEvent.domReady.observers;
			if (!observers) 
			{
				observers = BPEvent.domReady.observers = [];
			}
			// Array#push is not supported by Mac IE 5
			observers[observers.length] = fn;

			//-----------------------------------------------------------
			// domReady function
			//-----------------------------------------------------------
			if (BPEvent.domReady.callback) 
			{
				return;
			}
			BPEvent.domReady.callback = function() {
				if (BPEvent.domReady.loaded) 
				{
					return;
				}

				BPEvent.domReady.loaded = true;
				if (BPEvent.domReady.timer) {
					clearInterval(BPEvent.domReady.timer);
					BPEvent.domReady.timer = null;
				}

				var observers = BPEvent.domReady.observers;
				for (var i = 0, length = observers.length; i < length; i++) {
					var fn = observers[i];
					observers[i] = null;
					fn(); // make 'this' as window
				}
				BPEvent.domReady.callback = BPEvent.domReady.observers = null;
			};

			//-----------------------------------------------------------
			// Emulates 'onDOMContentLoaded'
			//-----------------------------------------------------------
			var ie = !!(window.attachEvent && !window.opera);
			var webkit = navigator.userAgent.indexOf('AppleWebKit/') > -1;

			if (document.readyState && webkit) {

				// Apple WebKit (Safari, OmniWeb, ...)
				BPEvent.domReady.timer = setInterval(function() {
					var state = document.readyState;
					if (state == 'loaded' || state == 'complete') {
						BPEvent.domReady.callback();
					}
				}, 50);

			} else if (document.readyState && ie) {

				// Windows IE
				var src = (window.location.protocol == 'https:') ? '://0' : 'javascript:void(0)';
				document.write(
					'<script type="text/javascript" defer="defer" src="' + src + '" ' +
					'onreadystatechange="if (this.readyState == \'complete\') BPEvent.domReady.callback();"' +
					'><\/script>');

			} else {

				if (window.addEventListener) {
					// for Mozilla browsers, Opera 9
					document.addEventListener("DOMContentLoaded", BPEvent.domReady.callback, false);
					// Fail safe
					window.addEventListener("load", BPEvent.domReady.callback, false);
				} else if (window.attachEvent) {
					window.attachEvent('onload', BPEvent.domReady.callback);
				} else {
					// Legacy browsers (e.g. Mac IE 5)
					var fn = window.onload;
					window.onload = function() {
						BPEvent.domReady.callback();
						if (fn) 
						{
							try
							{
								fn();
							}
							catch( e ) { }
						}
					}
				}
			}
		}
	}
}

if(typeof BPLoad == "undefined" )
{
	BPLoad = window.BPLoad = new Object();
	
	BPLoad.loaded = [];

	BPLoad.isLoaded = function( filename )
	{
		var exists = false;
		for( var i = 0; i < BPLoad.loaded.length && !exists; ++i )
		{
			if( BPLoad.loaded[i].indexOf( filename ) != -1 )
			{
				exists = true;
			}
		}
		if( !exists )
		{
			var head = document.getElementsByTagName('head');
			if(head!=null){
				head = head.item(0);
				for (var i = 0; i < head.childNodes.length && !exists; i++){
					if(head.childNodes[i].src != null && head.childNodes[i].src.indexOf(filename)!=-1){
						exists = true;
					}
				}
			}
		}
		return exists;
	}
}

/**
 * Carga un script javascript sincronamente.
 */
function bpLoadScript( scriptName )
{
	var xhr;
	if (window.XMLHttpRequest)
	{
		xhr = new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{
		xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
	}

	xhr.open("GET", scriptName, false);

	xhr.send(null);

	// Com que sempre es sincron ... podem tractar-ho aqui.
	var scriptNode = document.createElement("script");
	scriptNode.setAttribute("type", "text/javascript");
	scriptNode.setAttribute("language", "JavaScript");

	try {
		scriptNode.setAttribute("name", scriptName);
	} catch (err) { }

	var headNode = document.getElementsByTagName("head")[0];
	headNode.appendChild(scriptNode);

	scriptNode.text = xhr.responseText;

}

/**
 * Carga un script javascript asincronamente, y con posibilidad de acceso a otros dominios.
 */
function bpLoadScriptXS( scriptName )
{
	var domscript = document.createElement('script');
	domscript.src = scriptName;
	document.getElementsByTagName('head')[0].appendChild(domscript);
}

/**
 * Carga el archivo indicado.
 * 
 * filetype es opcional y si no se informa, se usará el indicado por la extension de filename.
 */
function bpLoadFile(filename, filetype){
	if( (typeof filetype) == undefined || filetype == "" || filetype == null )
	{
		if( filename.substr( filename.length - 3 ) == ".js" )
		{
			filetype = "js";
		}
		else if( filename.substr( filename.length - 4 ) == ".css" )
		{
			filetype = "css";
		}
	}
	if (filetype=="js")
	{ 
		bpLoadScript( filename );
	}
	else if (filetype=="css")
	{ 
		var fileref=document.createElement("link");
		fileref.setAttribute("rel", "stylesheet");
		fileref.setAttribute("type", "text/css");
		fileref.setAttribute("href", filename);
		document.getElementsByTagName("head")[0].appendChild(fileref);
	}
}

/**
 * Carga el archivo indicado si no está ya cargado.
 */
function bpCheckLoadFile(filename, filetype)
{
	if(! BPLoad.isLoaded( filename ) )
	{
		BPLoad.loaded.push( filename );
		bpLoadFile(filename, filetype);
	}
}
