/*
	COMMON CONTROLS LIB
*/

/*CONTEXTMENU COSTANTS*/
var CM ={
	OPENMODE:{RIGHTCLICK:0,CLICK:1},
	STATUS:{OPEN:1,CLOSED:0},
	POSITION:{BOTTOM:0,LEFT:1,RIGHT:2,TOP:3}
};

var appendEvent = function (sender,eventName,f){
if ( typeof sender.addEventListener != "undefined" )
    sender.addEventListener( eventName, f, false );
else if ( typeof sender.attachEvent != "undefined" ) 
    sender.attachEvent( "on" + eventName, f );
else {
    if ( sender["on" + eventName] != null ) {
        var oldOnEvent = sender.onload;
        sender["on" + eventName] = function ( e ) {
            oldOnEvent( e );
            f();
        };
    }
    	sender["on" + eventName] =f;
	}
}



/*BrowserInfo Module*/
var BrowserInfo = new Object() ;
var sAgent = navigator.userAgent.toLowerCase() ;
BrowserInfo.IsIE		= sAgent.indexOf("msie") != -1 && document.all;
BrowserInfo.IsGecko		= !BrowserInfo.IsIE ;
BrowserInfo.IsNetscape	= sAgent.indexOf("netscape") != -1 ;
BrowserInfo.IsOther =(!BrowserInfo.IsIE && !BrowserInfo.IsGecko && !BrowserInfo.IsNetscape);
if ( BrowserInfo.IsIE )
{
	BrowserInfo.MajorVer = navigator.appVersion.match(/MSIE (.)/)[1] ;
	BrowserInfo.MinorVer = navigator.appVersion.match(/MSIE .\.(.)/)[1] ;
}
else
{
	// TODO: Other browsers
	BrowserInfo.MajorVer = 0 ;
	BrowserInfo.MinorVer = 0 ;
}

BrowserInfo.IsIE55OrMore = BrowserInfo.IsIE && ( BrowserInfo.MajorVer > 5 || BrowserInfo.MinorVer >= 5 ) ;
//* END BrowserInfo Module *************************************************

//Hashtable
function Hashtable(){
	this._keys=[];
	this._values=[];
	this.caseInsensitive=false;
}


Hashtable.prototype.contains=function(key){
	if(this.caseInsensitive) key=key.toString().toLowerCase();
	return this._keys.contains(key);
}

Hashtable.prototype.containsValue=function(value){
	return this._values.contains(value);
}

Hashtable.prototype.getItem=function(key){
	if(this.caseInsensitive) key=key.toString().toLowerCase();
	if(this._keys.contains(key)) return this._values[this._keys.indexOf(key)];
}

Hashtable.prototype.setItem=function(key,value){
if (this._keys.contains(key)) this._values[this._keys.indexOf(key)]=value;
else{
		if(this.caseInsensitive) key=key.toString().toLowerCase();
		this._keys.append(key);
		this._values.append(value);
	}
}

Hashtable.prototype.clear=function(){
		this._keys.clear();
		this._values.clear();
}

Hashtable.prototype.removeItem=function(key){
	if(this.caseInsensitive) key=key.toString().toLowerCase();
	i=this._keys.indexOf(key);
	if(i>-1){
		this._keys.removeIndex(i);
		this._values.removeIndex(i);
	}
}

Hashtable.prototype.getOption=function (key,defaultValue){
	//optionsHash=Hashtable ricerca con array di chiavi
	if(this.contains(key)) 
			return  this.getItem(key);								
	else return  defaultValue;
}



function CreateHashtableByString(s,pairSeparator,equalSeparator){
	if (arguments.length<2) pairSeparator=";";
	if (arguments.length<3) equalSeparator=":";
	var ht=new Hashtable;
	ht.caseInsensitive=true;
	if(!s) return ht;
	pairs=s.split(pairSeparator);
	for(i=0;i<pairs.length;i++){
		kv=pairs[i].split(equalSeparator);
		ht.setItem(kv[0],kv[1]);
	}
	return ht;
}

function CreateHashtableByArray(a){
	var ht=new Hashtable;
	currentKey=null;
	for(i=0;i<a.length;i++){
		if( (i % 2)==0)currentKey=a[i];//pari =KEY
		else{ //dispari = value
			ht.setItem(currentKey,a[i]);
		}		
	}
	return ht;
}
//END Hashtable\\\\\\\\


Array.prototype.print_r=function(){
	i=0;
	while(i<this.length){
		document.write('<div>' + i + '.' + this[i] + '</div>');
	i++
	}
}
Array.prototype.append=function(obj){
	this[this.length]=obj;
}
Array.prototype.indexOf=function(obj){
	for(i=0;i<this.length;i++){
		if(this[i]==obj) return i;
	}
	return -1;
}

Array.prototype.contains=function(obj){
	return (this.indexOf(obj)!=-1);
}

Array.prototype.clear=function(){
	while(this.length>0) { this.pop()};
}

Array.prototype.merge=function(arr){
	for(i=0;i<arr.length;i++){ this.append(arr[i])}
}

Array.prototype.remove=function(obj){
	narray=[];
	for(i=0;i<this.length;i++){
		if(this[i]!=obj) narray.append(this[i]);
	}
	this.clear();
	this.merge(narray);
}

Array.prototype.removeIndex=function(index){
	narray=[];
	for(i=0;i<this.length;i++){
		if(i!=index) narray.append(this[i]);
	}
	this.clear();
	this.merge(narray);
}
Array.prototype.isLen=function(n){
	return (this.length<=n)
}





var commonBehaviours=new Object();
commonBehaviours.registredAttributes=[];
commonBehaviours.Activate=function(){
	var bIndex=0;
	while(bIndex<commonBehaviours.registredAttributes.length){
		var b=commonBehaviours.registredAttributes[bIndex];
		var fname =b + "_set";
		if((commonBehaviours[fname]) && (typeof(commonBehaviours[fname])=="function")){
			var elements = document.getElementsByTagName("*");		
			var eIndex=0;
			while(eIndex<elements.length){
				var attValue=elements[eIndex].getAttribute(b)||null;
				if(attValue!=null)
					commonBehaviours[fname](elements[eIndex],attValue);
			eIndex ++
			}
		}
	bIndex ++
	}
}

//changer manager
commonBehaviours.registredAttributes.append("changer");
commonBehaviours.changer_getValue= function(node){
	value="";
	if (node.form) value=node.value;
	else {
		if(node.innerText) value= node.innerText;
		else{
			var r = node.ownerDocument.createRange();
			r.selectNodeContents(node);
			value= r.toString();
			}
	}
	return value;
}

commonBehaviours.changer_set= function(node,attValue){
	if(attValue==null || attValue=="" || node==null) return ;
	var h=CreateHashtableByString(attValue);
	node["options"]=h;	
	node.onmouseup=function(){
		target=this.options.getOption("target",null);	
		if(target==null) return;
		value=commonBehaviours.changer_getValue(this);
		var e=document.getElementById(target);
		if(!e) return ;
		if(e.form) e.value=value;
		else{
		if(document.all) e.innerText= value;
		else{
			if (e.childNodes.length>0){
				e.childNodes[0].nodeValue=value;
			}
			else e.appendChild(document.createTextNode(value));
			}
		}
	}
}

commonBehaviours.autoreg=function(){
if ( typeof window.addEventListener != "undefined" )
    window.addEventListener( "load", commonBehaviours.Activate, false );
else if ( typeof window.attachEvent != "undefined" ) 
    window.attachEvent( "onload", commonBehaviours.Activate);
else {
    if ( window.onload != null ) {
        var oldOnload = window.onload;
        window.onload = function ( e ) {
            oldOnload( e );
            commonBehaviours.Activate();
        };
    }
    	else window.onload = commonBehaviours.Activate;
	}
}

commonBehaviours.autoreg();

var commonControls=new Object();
commonControls.registredTags=[];

commonControls.isArray=function(obj){
	if(obj==null) return false;
	if(obj.constructor)
		return obj.constructor.toString().indexOf("Array")>-1;
}

commonControls.isRegistredFunction=function(name){
	return (window[name] && typeof(window[name])=="function");
}
var cfbn0=function(name){window[name]();}
var cfbn1=function(name,param){(commonControls.isArray(param))?window[name](param[0]):window[name](param);}
var cfbn2=function(name,params){window[name](params[0],params[1]);}
var cfbn3=function(name,params){window[name](params[0],params[1],params[2]);}
var cfbn4=function(name,params){window[name](params[0],params[1],params[2],params[3]);}
var cfbn5=function(name,params){window[name](params[0],params[1],params[2],params[3],params[4]);}
var cfbn6=function(name,params){window[name](params[0],params[1],params[2],params[3],params[4],params[6]);}

commonControls.callFunctionByName=function(name,parameters){
if(commonControls.isRegistredFunction(name)) {
	if(arguments.length<2) cfbn0(name);
	else{
		if(!commonControls.isArray(parameters) || parameters.length==1) cfbn1(name,parameters);
		else if (parameters.length==2) cfbn2(name,parameters);
		else if (parameters.length==3) cfbn3(name,parameters);
		else if (parameters.length==4) cfbn4(name,parameters);
		else if (parameters.length==5) cfbn5(name,parameters);
		else if (parameters.length==6) cfbn6(name,parameters);
		//per ora si accettano array di max 6 elementi ma si possono ampliare
		}
	}
}

commonControls.PreventDefaultContextMenu=function(el){
	if(arguments.length==0) el=window.document;
	el.oncontextmenu = function(e){
		if (e) e.preventDefault() 	// This is the Gecko way to do that.
		return false ;				// This is the IE way to do that.
	}
}

commonControls.GetElementPosition = function( el )
{
	// Initializes the Coordinates object that will be returned by the function.
	var c = { x:0, y:0 } ;	
	// Loop throw the offset chain.
	while ( el ){
		c.x += el.offsetLeft ;
		c.y += el.offsetTop ;		
		el = el.offsetParent ;
	}	
	// Return the Coordinates object
	return c ;
}

commonControls.Activate=function(){
	taggedElements=new Array;
	for(i=0;i<commonControls.registredTags.length;i++){
		a=document.getElementsByTagName(commonControls.registredTags[i]);
		index=0;
		while(index<a.length){
			taggedElements[taggedElements.length]=a[index];
			index ++
		}
	}
	for(n=0;n<taggedElements.length;n++){
			var ele=taggedElements[n];
			var name=ele.nodeName;
						
			var callFunctionName="commons_" + name.toLowerCase() + "Create";		
			commonControls.callFunctionByName(callFunctionName,ele);
		}
}
commonControls.centerScreen=function(callee){
	callee.style.display="block" //prima di calcolare le dimensioni l'elemento deve essere visibile
	var cw=callee.offsetWidth;
	var ch=callee.offsetHeight;
	var bw=(window.innerWidth)?window.innerWidth:document.body.clientWidth;
	var bh=(window.innerHeight)?window.innerHeight:document.body.clientHeight;
	var t=parseInt((bh-ch)/2);
	var l=parseInt((bw-cw)/2);
	with(callee.style){
			position="absolute";
			top=t + "px";
			left=l +"px";
		}		
}
commonControls.Align=function(caller,callee,position,marginX,marginY){
var a=new Aligner();
	a.caller=caller;
	a.callee=callee;
	a.position=position;
	a.marginX=marginX;
	a.marginY=marginY;
	a.align();	
}


commonControls.getFromSymbol = function (value,arraySimbol){
	/*
	arraySimbol č array cosė composto:
	[ [1,"copy"],[2,"paste"] ecc...] array di array di 2 elementi
	*/
	for(i=0;i<arraySimbol.length;i++){
		a=arraySimbol[i];
		if(value.toString().toLowerCase()==a[1]) return  parseInt(a[0]);
	}
		return value;
}

commonControls.getObject=function(ele){
	if(typeof(ele)=="string") return document.getElementById(ele);
	else return ele;
}

commonControls.autoreg=function(){
if ( typeof window.addEventListener != "undefined" )
    window.addEventListener( "load", commonControls.Activate, false );
else if ( typeof window.attachEvent != "undefined" ) 
    window.attachEvent( "onload", commonControls.Activate);
else {
    if ( window.onload != null ) {
        var oldOnload = window.onload;
        window.onload = function ( e ) {
            oldOnload( e );
            commonControls.Activate();
        };
    }
    	else window.onload = commonControls.Activate;
	}
}

commonControls.autoreg();


//Aligner
function Aligner(){}

Aligner.prototype={
	position:null,
	caller:null,
	callee:null,
	marginX:0,
	marginY:0,
	checkAltPosition:true, //se la posizione supera i bordi pagina usa l'allineamento opposto
	isOk:function(){return (this.caller!=null && this.callee!=null)},
	findPosition:function(ele){ 	//ele = node 
		var d={W:ele.offsetWidth,H:ele.offsetHeight};
		return d;
	},
	dcr:function(){ //dimensioni caller
		return this.findPosition(this.caller);
	},
	dce:function(){ //dimensioni callee
		return this.findPosition(this.callee);
	},
	cLoc:function(){
		return commonControls.GetElementPosition(this.caller);
	},
	applyStyle:function(t,l){
		with(this.callee.style){
			position="absolute";
			top=t + "px";
			left=l +"px";
		}			
	},
	align_top:function(){
		var _cLoc=this.cLoc();
		var t=_cLoc.y - this.dcr().H -  this.marginX;
		var l=_cLoc.x + this.marginY;
		if (t<0 && arguments.length==0 && this.checkAltPosition) {this.align_bottom("bytop");return;}
		this.applyStyle(t,l);
	},
	align_right:function(){
		var _cLoc=this.cLoc();
		var t=_cLoc.y + this.marginY;
		var l=_cLoc.x + this.dcr().W + this.marginX;
		if (l<0 && arguments.length==0 && this.checkAltPosition) {this.align_left("byright");return;}
		this.applyStyle(t,l);	
	},
	align_left:function(){
		var _cLoc=this.cLoc();
		var t=_cLoc.y + this.marginY;
		var l=_cLoc.x - this.dce().W - this.marginX;
		if (l<0 && arguments.length==0 && this.checkAltPosition) {this.align_right("byleft");return;}
		this.applyStyle(t,l);	
	},
	align_bottom:function(){
		_cLoc=this.cLoc();
		t=_cLoc.y + this.dcr().H +  this.marginY;
		l=_cLoc.x + this.marginX;
		if (t<0 && arguments.length==0 && this.checkAltPosition) {this.align_top("bybottom");return;	}
		this.applyStyle(t,l);	
	},
	align:function(){
		if(!this.isOk) return ;
		if(this.position==CM.POSITION.LEFT) this.align_left();
		else if(this.position==CM.POSITION.BOTTOM) this.align_bottom();
		else if(this.position==CM.POSITION.TOP) this.align_top();
		else if(this.position==CM.POSITION.RIGHT) this.align_right();
	}
}//end  Aligner

function DisplayToggler(){
	this.hide();
	}

var DisplayToggler_gettogglers=function(){
	if(!window['DisplayTogglers']) window['DisplayTogglers']=[];
	return window['DisplayTogglers'];
	}
	
DisplayToggler.prototype={
	element:null,
	displayType:'inline',
	togglers:DisplayToggler_gettogglers(),
	checkOther:true, //controlla che altri elementi siano aperti o chiusi
	visible:function(){
		if(this.element!=null && this.element.style)
			return (this.element.style.display!='none');
		return false;
	},
	onshow:function(){
		if(this.checkOther){
			for(i=0;i<this.togglers.length;i++){
				if(this.togglers[i].visible())this.togglers[i].hide();
			}
		}
	},
	show:function(){
		if(this.element!=null && this.element.style) {this.onshow(); this.element.style.display=this.displayType;}
	},
	hide:function(){
		if(this.element!=null && this.element.style)	this.element.style.display='none';
	},
	toggle:function(){ (this.visible())?this.hide():this.show();}
}

function DisplayTogglerControl(caller,callee,togglerGroup){ //inherits DisplayToggler
	this.element=callee;
	this.caller=caller;
	this.togglerGroup=togglerGroup||null;
	if(this.togglerGroup) this.togglers=togglerGroup; //se impostato limita le operazioni di alternanza al gruppo
	this.togglers.append(this);
	this.caller.onclick=function(){			
		for(i=0;i<DisplayTogglers.length;i++){			
			if(DisplayTogglers[i].caller==this)
				DisplayTogglers[i].toggle();
			}		
		}
}

DisplayTogglerControl.prototype=new DisplayToggler();


/*registrazione per commons controls*/

commonControls.registredTags.append("toggler");

function commons_togglerCreate(node){
	var strCaller=node.getAttribute("caller")||"";
	var strCallee=node.getAttribute("callee")||"";
	if(strCaller!='' && strCallee!=''){
		var cr=document.getElementById(strCaller);
		var ce=document.getElementById(strCallee);
		var displayToggler=new DisplayTogglerControl(cr,ce);
		displayToggler.toggle(); //inizializza ad hidden
	}
}

function TriStateButton(Element,StateOn,StateOff,StateDisabled,State){
	this.element=commonControls.getObject(Element)||null;
	this.states=["on","off","disabled"];	
	this.classOn=StateOn||"TriStateButtonOn";
	this.classOff=StateOn||"TriStateButtonOff";
	this.classDisabled=StateDisabled||"TriStateButtonDisabled";
	this.onValue="yes";
	this.offValue="no";
	this.disabledValue="";
	this.hasDisabled=true; // se gestisce anche disabled
	this.inputName=""; //nome dell'input da aggiornare
	if(!window["TriStateButtons"])window["TriStateButtons"]=[];
	window.TriStateButtons.append(this);
	this.state="on";
	this.onChange=null;
	this.element.onclick=function(){
		//ritrova il controllo
		for(i=0;i<window.TriStateButtons.length;i++){
			if(window.TriStateButtons[i].element==this){
				tsb=window.TriStateButtons[i];
				if (tsb.state=="on"){
					tsb.setState("off");
				}
				else if (tsb.state=="off"){
					if(tsb.hasDisabled) tsb.setState("disabled");
					else tsb.setState("on");
				}
				else if (tsb.state=="disabled"){
					tsb.setState("on");
				}
				break;
			}
		}
	}
}

TriStateButton.prototype.getInputElement=function(){
	if(this.inputName!=""){		
		var formsIndex=0
		while(formsIndex<document.forms.length){
			var elementIndex=0;
			var f=document.forms[formsIndex];
			for(i=0;i<f.elements.length;i++){
				if(f.elements[i].name==this.inputName){					
					return f.elements[i];
				}
			}
		formsIndex ++
		}
	}
	return null;
}
TriStateButton.prototype.setState=function(State){
	if(this.states.indexOf(State)>-1) 
		this.state=State;
	else
		this.state="on";
	if(!this.hasDisabled &&  this.state=="disabled") this.state="off";
	var value="";
	if(this.state=="on"){ this.element.className=this.classOn; value=this.onValue}
	else if(this.state=="off") {this.element.className=this.classOff; value=this.offValue}
	else if(this.state=="disabled") {this.element.className=this.classDisabled; value=this.disabledValue}
	
	input=this.getInputElement();
	if(input!=null) input.value=value;
	
	if (typeof(this.onChange)=="function"){
		this.onChange(State,this);
	}
}

function commons_tristatebuttonCreate(node){
	var element=node.getAttribute("element")||null;
	var classOn=node.getAttribute("classOn")||null;
	var classOff=node.getAttribute("classOff")||null;
	var classDisabled=node.getAttribute("classDisabled")||null;
	var onValue=node.getAttribute("onValue")||"yes";
	var offValue=node.getAttribute("offValue")||"no";
	var disabledValue=node.getAttribute("disabledValue")||"";
	var hasDisabled=node.getAttribute("hasDisabled")||"1";
	hasDisabled = (hasDisabled=="yes" || hasDisabled=="true" || hasDisabled=="1");
	var inputName= node.getAttribute("input")||"";
	var state =node.getAttribute("state")||"on";
	var tsb=new TriStateButton(element,classOn,classOff,classDisabled,state);
	var t_onChange=node.getAttribute("onchange")||"";
	if (window[t_onChange]){
		 if(typeof(window[t_onChange])=="function")
	 		tsb.onChange=window[t_onChange];		 		
		 else
		 	tsb.onChange=new Function ("state","button",t_onChange);
		 }
	tsb.onValue=onValue;
	tsb.offValue=offValue;
	tsb.disabledValue=disabledValue;
	tsb.hasDisabled=hasDisabled;
	tsb.inputName=inputName;
	tsb.state=state;
	tsb.setState(state);	
}

commonControls.registredTags.append("TriStateButton");

//-------------------------------------------------------------------------------------------------
//Pop-up manager
//-------------------------------------------------------------------------------------------------

var popupManager=new Object();
popupManager.Window=null;
popupManager.gecko=new Object();
popupManager.ie=new Object();

popupManager.gecko.Show = function( url, options, parentWindow )
{
	if ( !parentWindow )
		parentWindow = window ;
	
	var oWindow = parentWindow.open(url, "", options) ;
	oWindow.focus() ;
	popupManager.Window = oWindow ;
	window.top.captureEvents( Event.CLICK | Event.MOUSEDOWN | Event.MOUSEUP | Event.FOCUS ) ;
	window.top.parent.addEventListener( 'mousedown', this.CheckFocus, true ) ;
	window.top.parent.addEventListener( 'mouseup', this.CheckFocus, true ) ;
	window.top.parent.addEventListener( 'click', this.CheckFocus, true ) ;
	window.top.parent.addEventListener( 'focus', this.CheckFocus, true ) ;		
}
popupManager.gecko.CheckFocus = function()
{
	if ( popupManager.Window && !popupManager.Window.closed )
	{
		popupManager.Window.focus() ;
		return false ;
	}
	else
	{
		window.top.releaseEvents(Event.CLICK | Event.MOUSEDOWN | Event.MOUSEUP | Event.FOCUS) ;
		window.top.parent.removeEventListener( 'mousedown', this.CheckFocus, true ) ;
		window.top.parent.removeEventListener( 'mouseup', this.CheckFocus, true ) ;
		window.top.parent.removeEventListener( 'click', this.CheckFocus, true ) ;
		window.top.parent.removeEventListener( 'focus', this.CheckFocus, true ) ;
	}
}

popupManager.ie.Show = function( url, options, parentWindow)
{
	if ( !parentWindow )
		parentWindow = window ;
	var h=CreateHashtableByString(options,",","=");
	var sOptions="";
	if (h.contains("width")) sOptions += "dialogWidth:" + h.getOption("width","") + ";";
	if (h.contains("height")) sOptions += "dialogHeight:" + h.getOption("height","") + ";";
	if (h.contains("top")) sOptions += "dialogTop:" + h.getOption("top","") + ";";
	if (h.contains("left")) sOptions += "dialogLeft:" + h.getOption("left","") + ";";
	sOptions += "resizable:" + h.getOption("resizable","") + ";";
	if (h.contains("center")) sOptions += "center:" + h.getOption("center","") + ";";
	parentWindow.showModalDialog( url, null, sOptions) ;
}



function popup(url,options,modal){
	if(!document.all){
	popupManager.gecko.Show (url,options)
	}
	else{
	popupManager.ie.Show (url,options)
	}
}

