/**
 *  author:		Timothy Groves - http://www.brandspankingnew.net
 *	version:	1.2 - 2006-11-17
 *              1.3 - 2006-12-04
 *              2.0 - 2007-02-07
 *
 *  modificato da :Carlo bruno
 *  version:	2.2	- 2011-02-06		
 *
 */

// -----------------------------------------------------------------------
var useBSNns;
var scriptServerPath="/dynnew/inc/autoSuggest.php";
var lineHeight = 11; // 16px;  INFOSTRADA
//var lineHeight = 16; // 16px;    INTERNET
var asArray=new Object();
function createAutoSuggestFor (inputField,options) {
		asArray[inputField] = new AutoSuggest(inputField, options);
}
//------------------------------------------------------------------------

if (useBSNns)
{
	if (typeof(bsn) == "undefined")
		bsn = {}
	_bsn = bsn;
}
else
{
	_bsn = this;
}


if (typeof(_bsn.Autosuggest) == "undefined")
	_bsn.Autosuggest = {}

_bsn.AutoSuggest = function (fldID, param) {
	// no DOM - give up!
	//
	if (!document.getElementById)
		return false;
	
	
	
	
	// get field via DOM
	//
	this.fld = _bsn.DOM.getElement(fldID);

	if (!this.fld)
		return false;
	
	this.inputDaSvuotareOnChange = new Array();
	this.ajaxRequest = null;
	this.initValue = $(this.fld).value;
	
	//alert($(this.fld).onkeyup);
	
	this.initVar();
	
	// parameters object
	//
	this.oP = (param) ? param : {};
	
	// defaults	
	//
	if (!this.oP.minchars)								this.oP.minchars = 1;
	if (!this.oP.maxresults)							this.oP.maxresults = 10;
	if (!this.oP.method)									this.oP.method = "POST";
	if (!this.oP.varname)									this.oP.varname = "input";
	if (!this.oP.runtimeVar)							this.oP.runtimeVar = Array();
	if (!this.oP.className)								this.oP.className = "autosuggest";
	if (!this.oP.timeout)									this.oP.timeout = 2500;
	if (!this.oP.delay)										this.oP.delay = 500;
	if (!this.oP.offsety)									this.oP.offsety = -5;
	if (!this.oP.shownoresults)						this.oP.shownoresults = false;
	if (!this.oP.noresults)									              this.oP.noresults = "No results!";
	if (!this.oP.maxheight && this.oP.maxheight !== 0)		this.oP.maxheight = 250;
	if (!this.oP.cache && this.oP.cache != false)			    this.oP.cache = true;
	if (!this.oP.mode)			              this.oP.mode = 'LOCAL_FS';
	if (!this.oP.activateFieldFunction)		this.oP.activateFieldFunction = function(){return true;};

	
	


	
	
	
	// set keyup handler for field
	// and prevent autocomplete from client
	//
	var pointer = this;
		
	// NOTE: not using addEventListener because UpArrow fired twice in Safari
	//_bsn.DOM.addEvent( this.fld, 'keyup', function(ev){ return pointer.onKeyPress(ev); } );
	
	//this.fld.onkeypress 	= function(ev){ return pointer.onKeyPress(ev); }
	this.fld.onkeydown 		= function(ev){ return pointer.onkeydown(ev); }
	this.fld.onkeyup 		  = function(ev){ return pointer.onKeyUp(ev); }
  this.fld.onclick 		  = function(ev){ return pointer.onclick(ev); }
  this.fld.onchange 		= function(ev){ return pointer.onchange(ev); }
  this.fld.onblur 		  = function(ev){ return pointer.onblur(ev); }
	
	this.fld.setAttribute("autocomplete","off");

	this.oP.runtimeVar.each(function(item){ // item["postName"], item["inputName"]
 		if (asArray[ $(item["inputName"]).id ]) {
	  		//alert('IF change('+$(item["inputName"]).id+') THEN aggiorna(' + pointer.fld.id+')' );
	  		asArray[$(item["inputName"]).id].inputDaSvuotareOnChange.push(pointer.fld.id);
	  		//pointer.fld.style.background="#eeeeee";
	  }
  })
	
}

_bsn.AutoSuggest.prototype.initVar = function()  {

	
	this.sInput 		= "";
	this.nInputChars 	= 0;
	this.aSuggestions 	= [];
	this.iHighlighted 	= 0;
	if (this.initValue != '') {
		$(this.fld).value = this.initValue; 
	} else if ($(this.fld).value != this.initValue) {
		$(this.fld).value='';
		this.initValue = '';
	}

}

_bsn.AutoSuggest.prototype.onblur = function(ev)  {
  /*this.clearSuggestions();
  if (this.aSuggestions.length && !this.iHighlighted) {
		  	this.iHighlighted=1;
		  	this.setHighlightedValue();
		  	bubble = false;
	} else if (this.iHighlighted) {
	    this.setHighlightedValue();
	} 
	*/
}

_bsn.AutoSuggest.prototype.onkeydown = function(ev)  {
	
 	var key = (window.event) ? window.event.keyCode : ev.keyCode;
 	
	
	// set responses to keydown events in the field
	// this allows the user to use the arrow keys to scroll through the results
	// ESCAPE clears the list
	// TAB sets the current highlighted value
	//
	var RETURN = 13;
	var TAB = 9;
	var ESC = 27;
	
	
	
	var bubble = true;

	switch(key) {
		case RETURN:
			this.setHighlightedValue();
			bubble = false;
			break;
		case ESC:
			this.clearSuggestions();
			break;
		case TAB:
			
			if (this.aSuggestions.length && !this.iHighlighted) {
		  	
		  	this.iHighlighted=1;
		  	this.setHighlightedValue();
		  	//bubble = false;
		  } else if (this.iHighlighted) {
		     this.setHighlightedValue();
 
		  } 
		 
			break;
		
	}
	
	
  if (!this.activateInput()) bubble=false;
	return bubble;;
}
	
	




_bsn.AutoSuggest.prototype.onchange = function()  {

  this.inputDaSvuotareOnChange.each(function(item){ // item["postName"], item["inputName"]
  		asArray[item].initVar();  		
  })

}

_bsn.AutoSuggest.prototype.activateInput = function(pointer) {
	
	return this.oP.activateFieldFunction();
	/*
	var nomeField="";
	var allInputFieldCompiled = true;
	//var thisInputFieldPresent = false;
	
  for(var inputField in asArray) {
  	//alert('asArray['+inputField+']');
  	if (inputField != this.fld.id) {
	  	for(var item in asArray[inputField].oP.runtimeVar) {
	    	
	    	if (asArray[inputField].oP.runtimeVar[item]['inputName']) { 
		    	nomeField = asArray[inputField].oP.runtimeVar[item]['inputName'];   	
		    	if ($(nomeField).value == "" || $(nomeField).value == asArray[nomeField].initValue) {allInputFieldCompiled=false;}
		    	//alert('Trovato '+nomeField+ ' '+($(nomeField).value == ""));
	    	    //if (nomeField == this.fld.id) {thisInputFieldPresent = true;}
	    	  //alert(nomeField+' '+this.fld.id); 
	    	}
	    }
	    
	    //alert ('Sblocco '+inputField+' = '+allInputFieldCompiled+' '+thisInputFieldPresent);
			if (allInputFieldCompiled) {
				$(inputField).style.background="#FFFFFF";
				$(inputField).disabled=false;
			} else if ($(inputField).value == "" || $(inputField).value == asArray[inputField].initValue) {
				$(inputField).style.background="#EEEEEE";
				$(inputField).disabled=true;
			} 
			allInputFieldCompiled = true;
		  //thisInputFieldPresent = false;
		}
  }
*/
}




_bsn.AutoSuggest.prototype.onclick = function(ev) {
	if (!$('as_ul') && this.aSuggestions.length) {
  	this.getSuggestions(this.fld.value);
    this.createList(this.aSuggestions);
	}
}	

_bsn.AutoSuggest.prototype.onKeyUp = function(ev) {
	
	var key = (window.event) ? window.event.keyCode : ev.keyCode;

	// set responses to keydown events in the field
	// this allows the user to use the arrow keys to scroll through the results
	// ESCAPE clears the list
	// TAB sets the current highlighted value
	//

	var ARRUP = 38;
	var ARRDN = 40;
	var BCKSPC = 8;
	var TAB = 9;
	
	var CANC   = 46;
	
	var bubble = true;
	
		this.fld.value = this.fld.value.replace("à","a'");
	  this.fld.value = this.fld.value.replace("è","e'");
	  this.fld.value = this.fld.value.replace("é","e'");
	  this.fld.value = this.fld.value.replace("ì","i'");
	  this.fld.value = this.fld.value.replace("ò","o'");
	  this.fld.value = this.fld.value.replace("ù","u'");
	  
	
	

	switch(key) {
		case CANC:
		  //alert(this.fld.value.length);
			if(this.fld.value.length==0) {
				this.aSuggestions=Array() ;
			} else {
		    this.getSuggestions(this.fld.value);
		  }
			//bubble = false;
			if (!this.activateInput()) return false;
			break;
		
		case BCKSPC:
			
			if(this.nInputChars==1) {
				this.aSuggestions=Array() ;
			} else {
		  	this.getSuggestions(this.fld.value);
		  }
			//bubble = false;
			if (!this.activateInput()) return false;
			break;
		
		case ARRUP:
			this.changeHighlight(key);
			bubble = false;
			if (!this.activateInput()) return false;
			break;

		case ARRDN:
	    if (!$('as_ul')) {
	    	this.getSuggestions(this.fld.value+' ');
	      this.createList(this.aSuggestions);
	    }
			this.changeHighlight(key);
			bubble = false;
			if (!this.activateInput()) return false;
			break;
		case TAB:
		  break;
		
		default:
			if (!this.activateInput()) return false;
			this.getSuggestions(this.fld.value);
			
	}
  
  
	return bubble;
	

}

_bsn.AutoSuggest.prototype.getSuggestions = function (val)
{

	// if input stays the same, do nothing
	//
	if (val == this.sInput)
		return false;
	
	
	val=val.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); //trim
  
	// input length is less than the min required to trigger a request
	// reset input string
	// do nothing
	//
	if (val.length < this.oP.minchars) {
		this.sInput = "";
		return false;
	}

	
	

	
	// if caching enabled, and user is typing (ie. length of input is increasing)
	// filter results out of aSuggestions from last request
	//
	
	if (   (val.length>=this.nInputChars && this.aSuggestions.length && (this.oP.cache || this.oP.mode=='LOCAL_FS'))
			/*|| (this.oP.mode=='LOCAL_FS' && this.aSuggestions.length>1)*/ 			
		 ) {
		 
		var arr = [];
		for (var i=0;i<this.aSuggestions.length;i++){
				if (this.aSuggestions[i].value.substr(0,val.length).toLowerCase() == val.toLowerCase())
				arr.push( this.aSuggestions[i] );
		}
		
		this.sInput = val;
		this.nInputChars = val.length;
		this.aSuggestions = arr;
		
		this.createList(this.aSuggestions);
		
		
		
		return false;
	
	} else {
	// do new request
	//
	 
		this.sInput = val;
		this.nInputChars = val.length;


		var pointer = this;
		clearTimeout(this.ajID);
		this.ajID = setTimeout( function() { pointer.doAjaxRequest() }, this.oP.delay );
	}

	return false;
}

_bsn.AutoSuggest.prototype.doAjaxRequest = function () {
	
	var pointer = this;
	
	var runTimePostVariable ="";
	this.oP.runtimeVar.each(function(item){ // item["postName"], item["inputName"]
  		if (item["realValueIs"]!='') {
  			runTimePostVariable += '&'+item["postName"]+'='+$(item["realValueIs"]).value;
  		} else { 
  			runTimePostVariable += '&'+item["postName"]+'='+$(item["inputName"]).value;
  		}
  })
  
	// create ajax request
	var url = this.oP.script+'&'+this.oP.varname+"="+escape(this.fld.value)+runTimePostVariable;
	var meth = this.oP.method;
	
	var onSuccessFunc = function (req) { pointer.setSuggestions(req) };
	var onErrorFunc = function (status) {/* alert("AJAX error: "+status);*/ };
	
  if (this.ajaxRequest!=null) this.ajaxRequest.req.abort(); 
	
	this.ajaxRequest = new _bsn.Ajax();
	this.ajaxRequest.makeRequest( url, meth, onSuccessFunc, onErrorFunc );
}

_bsn.AutoSuggest.prototype.setSuggestions = function (req)
{
	this.aSuggestions = [];
	
	if (this.oP.json) {
		if (req.responseText!='["Nessun Risultato"]') { 
			//$('divDebug').innerHTML=req.responseText;
			var jsondata = eval('(' + req.responseText + ')');
			for (var i=0;i<jsondata.results.length;i++)	{
				this.aSuggestions.push(  { 'id':jsondata.results[i].id, 'value':jsondata.results[i].value, 'info':jsondata.results[i].info }  );
			}
		}
	}	else {

		var xml = req.responseXML;
	
		// traverse xml
		//
		var results = xml.getElementsByTagName('results')[0].childNodes;

		for (var i=0;i<results.length;i++)
		{
			if (results[i].hasChildNodes())
				this.aSuggestions.push(  { 'id':results[i].getAttribute('id'), 'value':results[i].childNodes[0].nodeValue, 'info':results[i].getAttribute('info') }  );
		}
	
	}
	
	this.idAs = "as_"+this.fld.id;
	
	this.createList(this.aSuggestions);

}
















_bsn.AutoSuggest.prototype.createList = function(arr) {
	var pointer = this;
	
	for(var inputField in asArray) {
		if ($(asArray[inputField].idAs) && asArray[inputField].idAs!=this.idAs) 
				asArray[inputField].clearSuggestions();
  }
	
	// get rid of old list
	// and clear the list removal timeout
	//
	_bsn.DOM.removeElement(this.idAs);
	this.killTimeout();
	
	
	// create holding div
	//
	var div = _bsn.DOM.createElement("div", {id:this.idAs, className:this.oP.className});	
	
	/*
	var hcorner = _bsn.DOM.createElement("div", {className:"as_corner"});
	var hbar = _bsn.DOM.createElement("div", {className:"as_bar"});
	var header = _bsn.DOM.createElement("div", {className:"as_header"});
	header.appendChild(hcorner);
	header.appendChild(hbar);
	div.appendChild(header);
	*/
	
	// create and populate ul
	//
	var ul = _bsn.DOM.createElement("ul", {id:"as_ul"});
	
	
	if (arr.length<this.oP.maxresults) {
		ul.style.overflow = "hidden";
  } else {
  	ul.style.overflowY = "scroll";
  	ul.style.overflowX = "hidden";
    ul.style.height = (this.oP.maxresults*lineHeight)+"px";
  }
  
	// loop throught arr of suggestions
	// creating an LI element for each suggestion
	//
  for (var i=0;i<arr.length;i++) {
 
		// format output with the input enclosed in a EM element
		// (as HTML, not DOM)
		//
		
		var val = arr[i].value;
		 
		//var st = val.toLowerCase().indexOf( this.sInput.toLowerCase() );
		//var output = val.substring(0,st) + "<em>" + val.substring(st, st+this.sInput.length) + "</em>" + val.substring(st+this.sInput.length);
		
		var arrayParole = this.sInput.split(' ');
		var output = val;
		var nullString="|||||||||||||||||||||||||";
		var newOutput = output;
		
		
		for(var x=0;x<arrayParole.length;x++) {
			//alert('Cerco >'+arrayParole[x]+'< in '+newOutput);
			var st = newOutput.toLowerCase().indexOf( arrayParole[x].toLowerCase() );
			if (st>-1) {
				var output = output.substring(0,st) + "<em>" + output.substring(st, st+arrayParole[x].length) + "</em>" + output.substring(st+arrayParole[x].length);
			  var newOutput = newOutput.substring(0,st) + "||||" + nullString.substring(0, arrayParole[x].length) + "|||||" + newOutput.substring(st+arrayParole[x].length);
			  //alert('Trovato in pos '+st+' per  '+arrayParole[x].length+' car');
			}
			
		}
		
		
		var span 		= _bsn.DOM.createElement("span", {}, output, true);
		if (arr[i].info != "")
		{
			//var br			= _bsn.DOM.createElement("br", {});
			//span.appendChild(br);
			var small		= _bsn.DOM.createElement("small", {}, ', '+arr[i].info);
			span.appendChild(small);
		}
		
		var a 			= _bsn.DOM.createElement("a", { href:"#" });
		
		/*
		var tl 		= _bsn.DOM.createElement("span", {className:"tl"}, " ");
		var tr 		= _bsn.DOM.createElement("span", {className:"tr"}, " ");
		a.appendChild(tl);
		a.appendChild(tr);
		*/
		a.appendChild(span);
		
		a.name = i+1;
		a.onclick = function () { pointer.setHighlightedValue(); return false; }
		//a.onmouseover = function () { pointer.setHighlight(this.name); }
	  a.onmousemove = function () { pointer.setHighlight(this.name); }
		
		var li 			= _bsn.DOM.createElement(  "li", {}, a  );
		//li.style.height = lineHeight+"px";
		
		ul.appendChild( li );
	}
	
	
	

	
	// no results
	//
	if (arr.length == 0)	{
		var li 			= _bsn.DOM.createElement(  "li", {className:"as_warning"}, this.oP.noresults  );
		ul.appendChild( li );
	}
	
	
	if (arr.length == 0 && this.oP.shownoresults) 
		div.appendChild( ul );
	else if (arr.length > 0)
		div.appendChild( ul );


	/*
	var fcorner = _bsn.DOM.createElement("div", {className:"as_corner"});
	var fbar = _bsn.DOM.createElement("div", {className:"as_bar"});
	var footer = _bsn.DOM.createElement("div", {className:"as_footer"});
	footer.appendChild(fcorner);
	footer.appendChild(fbar);
	//div.appendChild(footer);
	*/
	
	
	// get position of target textfield
	// position holding div below it
	// set width of holding div to width of field
	//
	var pos = _bsn.DOM.getPos(this.fld);
	
	div.style.left 		= pos.x + "px";
	div.style.top 		= ( pos.y + this.fld.offsetHeight + this.oP.offsety ) + "px";
	div.style.width 	= this.fld.offsetWidth + "px";
	//div.style.width 	= "auto";
	
	
	// set mouseover functions for div
	// when mouse pointer leaves div, set a timeout to remove the list after an interval
	// when mouse enters div, kill the timeout so the list won't be removed
	//
	div.onmouseover 	= function(){ pointer.killTimeout() }
	div.onmouseout 		= function(){ pointer.resetTimeout() }

	
	// add DIV to document
	//
	document.getElementsByTagName("body")[0].appendChild(div);
	
	
	
	// currently no item is highlighted
	//
	this.iHighlighted = 0;
	
	
	
	
	
	
	// remove list after an interval
	//
	var pointer = this;
	this.toID = setTimeout(function () { pointer.clearSuggestions() }, this.oP.timeout);
}















_bsn.AutoSuggest.prototype.changeHighlight = function(key) {

	var list = _bsn.DOM.getElement("as_ul");
	if (!list)
		return false;
	
	var n;
	var firstElem;

	if (key == 40)
		n = this.iHighlighted + 1;
	else if (key == 38)
		n = this.iHighlighted - 1;
	
	//-----------------------------------------------------------
	// Scrolling Overflow 
	//-----------------------------------------------------------
	//alert(this.aSuggestions.length +' '+ this.oP.maxresults+' '+n);
	if (this.aSuggestions.length > this.oP.maxresults) { 
			if (n>this.oP.maxresults) {
				n=n-1;
				this.aSuggestions.push(this.aSuggestions.shift());
				this.createList(this.aSuggestions);
				this.ScrollDown('as_ul');
		  }
		
		  if (n<1) {
				n=n+1;
				this.aSuggestions.unshift(this.aSuggestions.pop());
				this.createList(this.aSuggestions);
				
		  }
	}
	//-------------------------------------------------------------
	
  if (n > list.childNodes.length)
		n = list.childNodes.length;
	if (n < 1)
		n = 1;

	this.setHighlight(n);
}

_bsn.AutoSuggest.prototype.ScrollDown = function(id) {
    
    var scrollArea = document.getElementById (id);
    if (scrollArea.doScroll) {  // Internet Explorer
        scrollArea.doScroll ("scrollbarUp");
    }
    else {
        scrollArea.scrollTop -= 10;
    }
}



_bsn.AutoSuggest.prototype.setHighlight = function(n) {
	var list = _bsn.DOM.getElement("as_ul");
	
	if (!list)
		return false;
	
	if (this.iHighlighted > 0)
		this.clearHighlight();
	
	this.iHighlighted = Number(n);
	
	list.childNodes[this.iHighlighted-1].className = "as_highlight";


	this.killTimeout();
	
}


_bsn.AutoSuggest.prototype.clearHighlight = function()
{
	var list = _bsn.DOM.getElement("as_ul");
	if (!list)
		return false;
	
	if (this.iHighlighted > 0)
	{
		list.childNodes[this.iHighlighted-1].className = "";
		this.iHighlighted = 0;
	}
}


_bsn.AutoSuggest.prototype.setHighlightedValue = function () {  
	
  
	
	if (this.iHighlighted) {
		this.sInput = this.fld.value = this.aSuggestions[ this.iHighlighted-1 ].value;
		this.nInputChars = this.sInput.length;
		 
		// move cursor to end of input (safari)
		//
		//this.fld.focus();
		if (this.fld.selectionStart)
			this.fld.setSelectionRange(this.sInput.length, this.sInput.length);
		

		this.clearSuggestions();
		
		// pass selected object to callback function, if exists
		//
		if (typeof(this.oP.callback) == "function")
			this.oP.callback( this.aSuggestions[this.iHighlighted-1] );
	}
	
	this.activateInput();
}













_bsn.AutoSuggest.prototype.killTimeout = function()
{
	clearTimeout(this.toID);
}

_bsn.AutoSuggest.prototype.resetTimeout = function()
{
	clearTimeout(this.toID);
	var pointer = this;
	this.toID = setTimeout(function () { pointer.clearSuggestions() }, this.oP.timeout);
}







_bsn.AutoSuggest.prototype.clearSuggestions = function ()
{
	
	this.killTimeout();
	
	var ele = _bsn.DOM.getElement(this.idAs);
	var pointer = this;
	if (ele)
	{
		var fade = new _bsn.Fader(ele,1,0,250,function () { _bsn.DOM.removeElement(pointer.idAs) });
	}
}










// AJAX PROTOTYPE _____________________________________________


if (typeof(_bsn.Ajax) == "undefined")
	_bsn.Ajax = {}



_bsn.Ajax = function ()
{
	this.req = {};
	this.isIE = false;
}





_bsn.Ajax.prototype.makeRequest = function (url, meth, onComp, onErr)
{
	
	if (meth != "POST") {
		meth = "GET";
	}
	
	this.onComplete = onComp;
	this.onError = onErr;
	
	var pointer = this;
	
	// branch for native XMLHttpRequest object
	if (window.XMLHttpRequest)
	{
		this.req = new XMLHttpRequest();
		this.req.onreadystatechange = function () { pointer.processReqChange() };
		this.req.open(meth, url, true); //
		this.req.send(null);
	// branch for IE/Windows ActiveX version
	}
	else if (window.ActiveXObject)
	{
		this.req = new ActiveXObject("Microsoft.XMLHTTP");
		if (this.req)
		{
			this.req.onreadystatechange = function () { pointer.processReqChange() };
			this.req.open(meth, url, true);
			this.req.send();
		}
	}
}


_bsn.Ajax.prototype.processReqChange = function()
{
	 
	// only if req shows "loaded"
	if (this.req.readyState == 4) {
		// only if "OK"
		if (this.req.status == 200) {
			this.onComplete( this.req );
		} else {
			this.onError( this.req.status );
		}
	}
}










// DOM PROTOTYPE _____________________________________________


if (typeof(_bsn.DOM) == "undefined")
	_bsn.DOM = {}




_bsn.DOM.createElement = function ( type, attr, cont, html )
{
	var ne = document.createElement( type );
	if (!ne)
		return false;
		
	for (var a in attr)
		ne[a] = attr[a];
		
	if (typeof(cont) == "string" && !html)
		ne.appendChild( document.createTextNode(cont) );
	else if (typeof(cont) == "string" && html)
		ne.innerHTML = cont;
	else if (typeof(cont) == "object")
		ne.appendChild( cont );

	return ne;
}





_bsn.DOM.clearElement = function ( id )
{
	var ele = this.getElement( id );
	
	if (!ele)
		return false;
	
	while (ele.childNodes.length)
		ele.removeChild( ele.childNodes[0] );
	
	return true;
}









_bsn.DOM.removeElement = function ( ele )
{
	var e = this.getElement(ele);
	
	if (!e)
		return false;
	else if (e.parentNode.removeChild(e))
		return true;
	else
		return false;
}





_bsn.DOM.replaceContent = function ( id, cont, html )
{
	var ele = this.getElement( id );
	
	if (!ele)
		return false;
	
	this.clearElement( ele );
	
	if (typeof(cont) == "string" && !html)
		ele.appendChild( document.createTextNode(cont) );
	else if (typeof(cont) == "string" && html)
		ele.innerHTML = cont;
	else if (typeof(cont) == "object")
		ele.appendChild( cont );
}









_bsn.DOM.getElement = function ( ele )
{
	if (typeof(ele) == "undefined")
	{
		return false;
	}
	else if (typeof(ele) == "string")
	{
		var re = document.getElementById( ele );
		if (!re)
			return false;
		else if (typeof(re.appendChild) != "undefined" ) {
			return re;
		} else {
			return false;
		}
	}
	else if (typeof(ele.appendChild) != "undefined")
		return ele;
	else
		return false;
}







_bsn.DOM.appendChildren = function ( id, arr )
{
	var ele = this.getElement( id );
	
	if (!ele)
		return false;
	
	
	if (typeof(arr) != "object")
		return false;
		
	for (var i=0;i<arr.length;i++)
	{
		var cont = arr[i];
		if (typeof(cont) == "string")
			ele.appendChild( document.createTextNode(cont) );
		else if (typeof(cont) == "object")
			ele.appendChild( cont );
	}
}









_bsn.DOM.getPos = function ( ele )
{
	var ele = this.getElement(ele);

	var obj = ele;

	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;


	var obj = ele;
	
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;

	return {x:curleft, y:curtop}
}










// FADER PROTOTYPE _____________________________________________



if (typeof(_bsn.Fader) == "undefined")
	_bsn.Fader = {}





_bsn.Fader = function (ele, from, to, fadetime, callback)
{	
	if (!ele)
		return false;
	
	this.ele = ele;
	
	this.from = from;
	this.to = to;
	
	this.callback = callback;
	
	this.nDur = fadetime;
		
	this.nInt = 50;
	this.nTime = 0;
	
	var p = this;
	this.nID = setInterval(function() { p._fade() }, this.nInt);
}




_bsn.Fader.prototype._fade = function()
{
	this.nTime += this.nInt;
	
	var ieop = Math.round( this._tween(this.nTime, this.from, this.to, this.nDur) * 100 );
	var op = ieop / 100;
	
	if (this.ele.filters) // internet explorer
	{
		try
		{
			this.ele.filters.item("DXImageTransform.Microsoft.Alpha").opacity = ieop;
		} catch (e) { 
			// If it is not set initially, the browser will throw an error.  This will set it if it is not set yet.
			this.ele.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity='+ieop+')';
		}
	}
	else // other browsers
	{
		this.ele.style.opacity = op;
	}
	
	
	if (this.nTime == this.nDur)
	{
		clearInterval( this.nID );
		if (this.callback != undefined)
			this.callback();
	}
}



_bsn.Fader.prototype._tween = function(t,b,c,d)
{
	return b + ( (c-b) * (t/d) );
}

