var D = YAHOO.util.Dom; //shortcut per il dom
var EV = YAHOO.util.Event; //shortcut per Event
var DM = YAHOO.widget.DateMath; //shortcut per DateMath;
var L = YAHOO.lang; //shortcut per YAHOO.lang
YAHOO.lang.objectFor= function (obj,callback) {
	for(p in obj) {
		if(this.hasOwnProperty(obj,p)){
			callback(obj[p],p);
		}
	}
}
var panelsApp = {
	element_opened:null,
	panel_link: function (el,config){
		//D.getElementsByClassName(className , tag , root , apply)
		var e = $(el);
		var caret_split_default = config.split_default||skin_images + 'caret_split_default.png';
		var caret_split_hover = config.split_hover||skin_images + 'caret_split_hover.png';
		var class_default = config.class_default||'caret_split_default';
		var class_open = config.class_open||'caret_split_open';
		var panel = e.panel= config.panel;
		var panel_status = 0;
		
		var onshow = config.onshow||null;
		var onhide = config.onhide||null;
		var p = e.parentNode;
		D.addClass(e,class_default);

		e.setClassOpen = function (){
			D.replaceClass(this,class_default,class_open);
		}
		e.setClassDefault = function (){
			D.replaceClass(this,class_open,class_default);
		}
		e.showPanel = function (){
			if(panelsApp.element_opened) {
				try {
					panelsApp.element_opened.setClassDefault();		     
				} catch(ex) {
					console.log(ex);
				}
			}
			if('show' in panel) panel.show();
			else $E.show(panel);
			this.setClassOpen();
			if(onshow) onshow(e,panel);
			panelsApp.element_opened=e;
			panel_status=1
		}
		e.hidePanel = function (){
			if('hide' in panel) panel.hide();
			else $E.hide(panel);
			this.setClassDefault();
			if(onhide)onhide(e,panel);
			panelsApp.element_opened=null;
			panel_status=0
		}
		e.swapPanel = function (){
			if(panel_status) this.hidePanel();
			else this.showPanel();
		}
		e.caret = $E.createImg();
		e.caret.src = caret_split_default;
		
		e.appendChild(e.caret);
		var hover = config.HOVER||false;
		if(hover && panel.element) {
			YAHOO.util.Event.addListener(document,'mouseover',function (ev){
				   if(!panel_status) return ;
				   if(!ev.target) ev.target = ev.srcElement;
				   if(D.isAncestor(e,ev.target)||ev.target==e) return ;
				   if(D.isAncestor(panel.element,ev.target)||ev.target==panel.element) return ;
					e.hidePanel();  
			});
		};
		YAHOO.util.Event.addListener(e,'mouseover',function (){
			e.caret.src = caret_split_hover;
			if(hover) e.showPanel();
			if(!panel_status) {
				e.setClassOpen();
			}
		});
		YAHOO.util.Event.addListener(e,'mouseout',function (){
			e.caret.src = caret_split_default;
			if(!panel_status) {
				e.setClassDefault();
			}
		});

		if(!hover && e.nodeName.toLowerCase()!='a') {
			YAHOO.util.Event.addListener(e,'click',function (){
				e.swapPanel();
			});
		}
		else {
			YAHOO.util.Event.addListener(e.caret,'click',function (){
				e.swapPanel();
			});
		}
		$E.unselectable(e);
		return e;
	},
	
	createPanel:function (id,config){
		var p= new YAHOO.widget.Overlay(id,config);
		p.setHeader(config.title||'');
		D.addClass(p.element,config.panelClass||'');
		var panel_body = $E.createDiv();
		panel_body.className = config.mapDivClass;
		p.panel_body = panel_body;
		p.setBody(p.panel_body);
		p.render(document.body);
		
		YAHOO.util.Event.addListener(document,'click',function (ev){
			if(!panelsApp.element_opened) return ;
			if(!ev.target) ev.target = ev.srcElement;
			if(
			   D.isAncestor(panelsApp.element_opened,ev.target)||
			   D.isAncestor(panelsApp.element_opened.panel.element,ev.target)||
			   ev.target==panelsApp.element_opened ||
			   ev.target==panelsApp.element_opened.panel.element) return ;
			
			panelsApp.element_opened.hidePanel();
		})
		return p;
	},
	
	menuPanel : function (el,config){
		var menu=$(config.MENU_ELEMENT);
		var tmp = menu.cloneNode(true);
		menu.parentNode.removeChild(menu);
		var menu=tmp;
		var effect= panelsApp.get_effect_fade();
		var panelConfigDefault = {'effect':effect};
		var panelConfig = config.PANEL_CONFIG||{visible:false,width:config.width||'200px',mapDivClass:config.mapDivClass||'vmenu','panelClass':config.panelClass||'vmenu_panel'};
		var panelConfig = YAHOO.lang.merge(panelConfigDefault,panelConfig);
		var p = this.createPanel(D.generateId(),panelConfig);
		p.panel_body.appendChild(menu);
		config.panel = p;
		config.onshow = function (e,panel){
			panel.cfg.setProperty('context',[e,'tr','br']);
			var Y = parseInt(panel.cfg.getProperty("y"));
			panel.cfg.setProperty("y",(Y-1));
		}
		var menu_default_config = {'HOVER':true};
		config =  YAHOO.lang.merge(menu_default_config,config);
		return panelsApp.panel_link(el, config);
		
	},
	get_effect_fade: function (){
		return [{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.5}];
	},
	_map_icon:function (ico_name){
		var icon = new GIcon();
	   icon.image = skin_images + "/mapicon-" + ico_name + ".png";
	   icon.shadow = skin_images + "/mapicon-" + ico_name + "-shadow.png";
	   icon.iconSize = new GSize(32, 32);
	   icon.shadowSize = new GSize(56, 32);
	   icon.iconAnchor = new GPoint(16, 32);
	   icon.infoWindowAnchor = new GPoint(16, 0);
	   return { 'icon':icon};
	},
	_panel_map : function (el,config){
		if(typeof mapPanel =='undefined') {
			var effect= panelsApp.get_effect_fade();
			mapPanel = panelsApp.createPanel(D.generateId(),{visible:false,close:true,width:config.width||'400px',mapDivClass:config.mapDivClass||'minimap','effect':effect,'panelClass':config.panelClass||''});
			mapPanel.map = new GMap2(mapPanel.panel_body);
			
			mapPanel.map.setCenter(new GLatLng(43.771967,11.254469), 13);
			mapPanel.map.addControl(new GSmallZoomControl ());

			//document.onunload = GUnload;
		}
		config.panel=mapPanel;
		config.onshow = function (e,panel){
			panel.cfg.setProperty('context',[e,'tl','bl']);
			var Y = parseInt(panel.cfg.getProperty("y"));
			panel.cfg.setProperty("y",(Y-1));
			var map = panel.map;
			if(typeof map=='undefined'){
				return ;
			}
			map.clearOverlays();
			var point = new GLatLng(config.lat,config.lng);
			map.setCenter(point,13);
			var mrk = new GMarker(point,panelsApp._map_icon('home'));
			var mrk_onClick  = function (){
				map.openInfoWindowHtml (point,config.address);
			}
			GEvent.addListener(mrk,"click",mrk_onClick);
			map.addOverlay(mrk);
			/*GEvent.addListener(mrk,'click',function (){
			mrk.openInfoWindowHtml(map.getCenter(),
                           config.address);
			})*/
			mrk_onClick();
		}
		var e = panelsApp.panel_link(el, config);	
	},
	panel_map: function (el,config){
		YAHOO.util.Event.onDOMReady(function (){
			panelsApp._panel_map(el,config);
		})
	}
}
var calendar_it_config = {
	MONTHS_LONG:['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno','Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],
	MONTHS_SHORT:['Gen','Feb','Mar','Apr','Mag','Giu','Lug','Ago','Set','Ott','Nov','Dic'],
	WEEKDAYS_LONG:['Lunedì','Martedì','Mercoledì','Giovedì','Venerdì','Sabato','Domenica'],
	WEEKDAYS_MEDIUM:['Lun','Mar','Mer','Gio','Ven','Sab','Dom'],
	WEEKDAYS_SHORT:['Lu','Ma','Me','Gi','Ve','Sa','Do'],
	strings: {
		previousMonth:'Mese prec.',
		nextMonth:'Mese succ.',
		close:'chiudi'
	}
}
function date_toYMD (d){
            return d.getFullYear()+'-' + (d.getMonth()+1) + '-' + d.getDate();
}
function date_parseYMD(s){
            var parts = s.split('-');
            return new Date(parseInt(parts[0],10),parseInt(parts[1],10)-1,parseInt(parts[2],10));
}
/**
 * @see http://www.softxml.com/jsdatefunctions/datediff.js
*/
function day_diff(date1,date2){
	var oneMinute=1000*60;
	var dayunit = 1000*60*60*24;
	date1.setHours(0);
	date1.setMinutes(0);
	date1.setSeconds(0);
	date2.setHours(0);
	date2.setMinutes(0);
	date2.setSeconds(0);
	var tm1 = date1.getTime();
	var tm2 = date2.getTime();
	if(date2>date1){
			DSTAdjust=(date2.getTimezoneOffset() - date1.getTimezoneOffset()) * oneMinute;
	}
	else{
		DSTAdjust=(date1.getTimezoneOffset() - date2.getTimezoneOffset()) * oneMinute;
	}
	var diff=Math.abs(tm2-tm1) - DSTAdjust;
	var timeDiff=Math.floor(diff/dayunit);
	return parseInt(timeDiff);
}

/*   applicazione    */
var DateChoice = {
    //funzioni di utilità
    Util:{
        //trasforma un range di numeri in un array
        numbersArray : function (min,max){
            var result = [];
            for(var i=min;i<=max;++i) result.push(i);
            return result;
        },
        //riempie con dei valori un nodo SELECT
        fillSelect:function (oSel,values,currentValue,getValueCallback){
            if(L.isString(oSel)) {
                oSel=$(oSel);//controlla se oSel è un id e lo trasforma nel riferimento al nodo
            }
            if(!L.isArray(values)) return ; //controlla che values sia un array
            for(var i=0,l=values.length;i<l;++i){
                var value = values[i];
                if(L.isFunction(getValueCallback)) {
                    //se è impostato un callback per interpretare il valore
                    value = getValueCallback(i,values);
                }
                
                //key è la chiave (ad es. l'id)
                //val è il testo visualizzato (ad es. la descrizione)
                var key=value,val=value;
                if(L.isObject(value)) {
                    //in questo caso value è un oggetto {key:k,value:v}
                    key = value.key;
                    val = value.value;
                }
                var current = currentValue;
                if(L.isFunction(currentValue)) {
                    current = currentValue(i,key,val);
                }
                //crea il nodo option
                var option = document.createElement("option");
                option.selected = (key==current); //determina se l'opzione è selezionata
                option.value = key;
                option.appendChild(document.createTextNode(val));
                oSel.appendChild(option);
            }
        },
        toYMD : function (d){
			return date_toYMD(d);
        },
        parseYMD : function (s){
			return date_parseYMD(s);
        }
    },
    /*Oggetto: box di scelta della data*/
    DateChoiceBox : function (el,config){
        //el = id del div dove costruire il controllo
        //config = oggetto che contiene i parametri di configurazione
        if(L.isString(el)) {
                el=$(el);//controlla se el è un id e lo trasforma nel riferimento al nodo
        }
        //variabile privata date
        var date = config.DATE||config.VALUE||new Date();
        if(L.isString(date)) date = DateChoice.Util.parseYMD(date);
        //eventi personalizzati per il controllo
		this.beforeChangeDateEvent = new YAHOO.util.CustomEvent('beforeChangeEvent',this,true,YAHOO.util.CustomEvent.FLAT);
        this.changeDateEvent = new YAHOO.util.CustomEvent('changeEvent',this,true,YAHOO.util.CustomEvent.FLAT);
		this.showCalendarEvent= new YAHOO.util.CustomEvent('showCalendar',this,true,YAHOO.util.CustomEvent.FLAT);
        //costruzione del controllo:
        var thisObject = this;//riferimento all'oggetto corrente per le funzioni interne
        /*
            costruzione di un campo nascosto dove conservare il valore
            questo campo può essere utilizzato per il POST del FORM
        */
        this.hiddenField = document.createElement("input");
        with(this.hiddenField) {
            name = config.NAME||el.id;
            value = DateChoice.Util.toYMD(date);
            type="hidden";
        }
        el.appendChild(this.hiddenField);
		 el.className = config.CALENDAR_CONTROL_CLASS||'calendar_control';
        this.title = config.TITLE||'Scegli intervallo';
        //titleDiv è il DIV che contiene il titolo
        this.titleDiv = el.appendChild(document.createElement("div"));
        this.titleDiv.appendChild(document.createTextNode(this.title));
        //bodyDiv è il DIV che contiene i controlli
        var bodyDiv = this.bodyDiv = el.appendChild(document.createElement("div"));
       
        //funzione che crea il select con i giorni
        var createDaySelect = function (){
            var oSel = document.createElement("select");
            oSel.name = config.DAY_SELECT_NAME||el.id + '_day';
            oSel.id = config.DAY_SELECT_ID||oSel.name;
            DateChoice.Util.fillSelect(oSel,DateChoice.Util.numbersArray(1,31),date.getDate());
            return oSel;
        }
        var createMonthSelect = function (){
            var oSel = document.createElement("select");
            oSel.name = config.MONTH_SELECT_NAME||el.id + '_month';
            oSel.id = config.MONTH_SELECT_NAME||oSel.name;
            var months = config.MONTHS;
            //funzione da usare nel callback di fillSelect:
            var getValueCallback=function (index,values){
                return {key:index,value:values[index]}
            }
            DateChoice.Util.fillSelect(oSel,months,date.getMonth(),getValueCallback);
            return oSel;
        }
        var createYearSelect = function (){
            var oSel = document.createElement("select");
            oSel.name = config.YEAR_SELECT_NAME||el.id + '_year';
            oSel.id = config.YEAR_SELECT_ID||oSel.name;
            var currentYear=date.getFullYear();
            var minYear = config.YEAR_MIN||currentYear;
            var maxYear = config.YEAR_MAX||minYear + 5;
            DateChoice.Util.fillSelect(oSel,DateChoice.Util.numbersArray(minYear,maxYear),currentYear);
            return oSel;
        }
        
        this.selects = []; //l'insieme dei nodi SELECT per la data
        this.daySelect = this.bodyDiv.appendChild(createDaySelect());
        this.monthSelect = this.bodyDiv.appendChild(createMonthSelect());
        this.yearSelect = this.bodyDiv.appendChild(createYearSelect());
        //aggiunta dei vari SELECT all'insieme dei nodi SELECT 
        this.selects.push(this.daySelect);
        this.selects.push(this.monthSelect);
        this.selects.push(this.yearSelect);
        
        //bottone calendario
        var calButtonDefaultClass = config.CALENDAR_BUTTON_CLASS||'calendar_button';
        var calButtonOverClass = config.CALENDAR_BUTTON_OVER_CLASS||'calendar_button_over';
        var calButtonOpenClass = config.CALENDAR_BUTTON_OPEN_CLASS||'calendar_button_open';
        var calPanelClass = config.CALENDAR_PANEL_CLASS||'calendar_panel';
        var calButton =document.createElement('input');
		calButton.type="button";
		this.calButton = this.bodyDiv.appendChild(calButton);
        calButton.className=calButtonDefaultClass;
        //pannello calendario
        var overlayConfig = {
            context:[calButton,'tl','tr'],            
            visible:false,
            iframe:false
        }
        var calPanel = this.calPanel = new YAHOO.widget.Overlay(D.generateId(),overlayConfig);
        //appende un DIV all'Overlay
        var calContainer = document.createElement('div');
        calContainer.className="yui-skin-sam";
        calPanel.setBody(calContainer);
        D.addClass(this.calPanel.element,calPanelClass);
        var calConfig = config.CALENDAR_CONFIG||{}
        var calendarConfig =L.merge(calConfig,{
            pagedate:date,
            iframe:false
            });
        var calendar = this.calendar = new YAHOO.widget.Calendar(calContainer,calendarConfig);
        calendar.rendered = false;
		function setCalDate(dt){
			calendar.cfg.setProperty("pagedate",dt);
			calendar.render();
		}
        calPanel.render(document.body);
       // calendar.render();
        calPanel.hide();
        calPanel.cfg.setProperty('effect',[{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.5}]);
       
        calButton.hide = function (){
            calPanel.hide();
            this.state=0;
            D.removeClass(this,calButtonOpenClass);
            D.removeClass(this,calButtonOverClass);
        }
		
        calButton.show = function (){
            if(!calendar.rendered) calendar.render();
			setCalDate(date)
            calPanel.show();
			thisObject.showCalendarEvent.fire();
            this.state=1;
            D.addClass(this,calButtonOpenClass);
        }
        calButton.swap = function (){
            if(calButton.state) {
                calButton.hide();
            }
            else {
                calButton.show();
            }
        }
        calButton.over = function (){
            if(!this.state) D.addClass(this,calButtonOverClass);
        }
        calButton.out = function (){
            if(!this.state) D.removeClass(this,calButtonOverClass);
        }
        calButton.hide();
        //eventi sul bottone
        EV.addListener(calButton,'mouseover',calButton.over);
        EV.addListener(calButton,'mouseout',calButton.out);
        EV.addListener(calButton,'click',calButton.swap);
        calendar.selectEvent.subscribe(function (){
            var dates = calendar.getSelectedDates();
            if(dates) thisObject.setDate(dates[0],true);
            calButton.hide();
        });
		
        this._getYMD_date = function (){
            var ymd = {
                d : this.daySelect.value,
                m : this.monthSelect.value,
                y : this.yearSelect.value
            };
            date = DM.getDate(ymd.y,ymd.m,ymd.d);
            return date;
        }
        this.monthSync= function (){
            var month = this.monthSelect.value;
            var year = this.yearSelect.value;
            var monthLastDate = DM.findMonthEnd(DM.getDate(year,month));
            var monthLastDay =  monthLastDate.getDate();
            var options=this.daySelect.options;
            if(parseInt(this.daySelect.value)>monthLastDay) {
                for(var i=27,l=options.length;i<l;++i){
                    if(parseInt(options[i].value)==monthLastDay){
                        options[i].selected=true;
                        break;
                    }
                }
            }
            for(var i=27,l=options.length;i<l;++i){
                if(parseInt(options[i].value)>monthLastDay) {
                   options[i].style.display='none';
                }
                else {
                    options[i].style.display='';
                }
            }
            
        }
        this.monthSync();
        EV.addListener(this.monthSelect,'change',this.monthSync,this,true);
		this.today = function (){
			var now=new Date;
			return new Date(now.getFullYear(),now.getMonth(),now.getDate());
		}
		this.beforeToday = function (dt){
			var today = this.today();
			return DM.before(dt,today);
		}
        //sincronizza il valore "date" con il campo nascosto
        this.syncValue = function (fireEv){
			var dt = this._getYMD_date();
			//if(this.beforeToday(dt)){
			//	this.setDate(this.today())	;
			//	return ;
			//}
            this.hiddenField.value = DateChoice.Util.toYMD(dt);
			if(fireEv)	this.changeDateEvent.fire(date);
        }
        //imposta la data sincronizzando le SELECT
        this.setDate = function (dt,fireEv){
			
			if(this.beforeToday(dt)) {
				//var td = this.today();
				//var m=td.getMonth();
				//var y = td.getFullYear();
				//if(m==11) {
				//	dt.setMonth(0);
				//	dt.setFullYear(y+1);
				//}
				//else {
				//	dt.setMonth(m);
				//}
				////dt=this.today();
			}
				if(!this.beforeChangeDateEvent.fire(date,dt)) return ;
                date = dt;
                this.daySelect.selectedIndex = date.getDate()-1;
                this.monthSelect.selectedIndex = date.getMonth();
                this.yearSelect.value=date.getFullYear();
                this.syncValue();
                if(fireEv) this.changeDateEvent.fire(date);
        }
		this.getDate = function (){
			return date;
		}
        for(var i=0,l=this.selects.length;i<l;++i){
            //aggiunge sincronizzazione ad ogni SELECT
            EV.addListener(this.selects[i],'change',this.syncValue,this,true);
			EV.addListener(this.selects[i],'change',function (){
				this.changeDateEvent.fire(this.getDate());
			},this,true);
        }
		EV.addListener(document,'click',function (ev){
			if(!ev.target) {
				//IE
				ev.target=ev.srcElement;
			}
			if(
			D.isAncestor(calButton,ev.target)||
			D.isAncestor(calPanel.element,ev.target)||
			ev.target==calButton ||
			ev.target==calPanel.element) return ;
			calButton.hide();
		})
    },
    IntervalChoiceBox : function (el,config){
        //el = id del div dove costruire il controllo
        //config = oggetto che contiene i parametri di configurazione
        if(L.isString(el)) {
                el=$(el);//controlla se el è un id e lo trasforma nel riferimento al nodo
        }
        this.changeDateEvent = new YAHOO.util.CustomEvent('changeDate',this,true,YAHOO.util.CustomEvent.FLAT);
		this.firstContainer = el.appendChild(document.createElement('div'));
        this.firstContainer.id=config.FIRST_CONTAINER_ID||el.id + '_firstdate';
        
        this.secondContainer = el.appendChild(document.createElement('div'));
        this.secondContainer.id=config.SECOND_CONTAINER_ID||el.id + '_seconddate';
        
        this.firstContainer.className =
        this.secondContainer.className = config.INTERVAL_CONTAINER_CLASS||"";
        var firstContainerTitle = config.FIRST_CONTAINER_TITLE||"dalla data:";
        var secondContainerTitle = config.SECOND_CONTAINER_TITLE||"alla data:";
        var firstContainerName = config.FIRST_CONTAINER_NAME||"";
        var secondContainerName = config.SECOND_CONTAINER_NAME||"";
        var intervalDiff = config.INTERVAL||1;
        var intervalType = config.INTERVAL_TYPE||DM.MONTH;
        var firstControlConfig = config.FIRST_CONFIG||{};
        var secondControlConfig = config.SECOND_CONFIG||{};
        var firstconfig = L.merge(config,{
            DATE:config.FIRST_DATE||(new Date),
            NAME:firstContainerName,
            TITLE:firstContainerTitle
            },firstControlConfig);
        var secondconfig = L.merge(config,{
            DATE:config.SECOND_DATE||DM.add(firstconfig.DATE,intervalType,intervalDiff),
            NAME:secondContainerName,
            TITLE:secondContainerTitle
            },secondControlConfig);
        var firstControl = new DateChoice.DateChoiceBox(this.firstContainer,firstconfig);
        var secondControl = new DateChoice.DateChoiceBox(this.secondContainer,secondconfig);
		
        firstControl.changeDateEvent.subscribe(function (newdate){
			if(newdate>secondControl.getDate()) {
				secondControl.setDate(newdate,false);
			}
			return this.changeDateEvent.fire([newdate,firstControl]);
		},this,true);
		
		secondControl.changeDateEvent.subscribe(function (newdate){
			if(newdate<firstControl.getDate()) {
				firstControl.setDate(newdate,false);
			}
			return this.changeDateEvent.fire([newdate,secondControl]);
		},this,true);
																			
		firstControl.showCalendarEvent.subscribe(function (){
			secondControl.calButton.hide();
		});
		secondControl.showCalendarEvent.subscribe(function (){
			firstControl.calButton.hide();
		});
		this.getInterval = function (YMD){
			var d1=firstControl.getDate(),d2=secondControl.getDate()
			if(YMD) {
				d1=DateChoice.Util.toYMD(d1);
				d2=DateChoice.Util.toYMD(d2);
			}
			return {from:d1,to:d2}
		}
		this.firstControl = firstControl;
		this.secondControl=secondControl;
    }
}

var SMELZO ={widget:{}};

(function(){

	var DEFAULT_CONFIG ={
		EXPANSION_OFF_CLASS : {key:"expansion_off", value:'expansion-off'},
		EXPANSION_ON_CLASS : {key:"expansion_on", value:'expansion-on'},
		EXPANSION_OFFOVER_CLASS : {key:"expansion_offover", value:'expansion-offover'},
		EXPANSION_ONOVER_CLASS : {key:"expansion_onover", value:'expansion-onover'},
		EXPANSION_ID : {key:"expansion_id", value:null},
		EXPANSION_TAG: {key:"expansion_tag", value:'DIV'},
		TARGET_ID : {key:"target_id", value:null},
		INITIAL_STATE:{key:"initial_state", value:0}
	};
	/*
	usage:
	var ep = new ExpansionPanel ('myelem',{config....})
	*/
	function ExpansionPanel (el,config){
		this.init.apply(this, arguments);
	}
	
	ExpansionPanel.prototype = {
		element:null,
		initialized:false,
		init:function (el,config){
			var e = this.element=D.get(el);
			this.initEvents();
			this.cfg=new YAHOO.util.Config(this);
			this.setupConfig();
			if (config) this.cfg.applyConfig(config, true);
			this.cfg.fireQueue();
			var expansion_tag = this.cfg.getProperty("expansion_tag");
			this.expansionElements = D.getElementsByClassName("expansion",'',e);			
			this.expansionTargets = D.getElementsByClassName("expansion-target",expansion_tag,e);
			if(!L.isArray(this.expansionElements))this.expansionElements=[];
			if(!L.isArray(this.expansionTargets))this.expansionTargets=[];
			var expid= this.cfg.getProperty("EXPANSION_ID");
			if(expid) {
				this.expansionElements.push(D.get(expid));
			}
			var targetid= this.cfg.getProperty("TARGET_ID");
			if(targetid) {
				this.expansionTargets.push(D.get(targetid));
			}
			
			this.registerDisplayStatus();  
			
			if(this.cfg.getProperty('INITIAL_STATE')) this.open();
			else this.close();
			this.registerMouseOver();
			this.registerClickHandlers();
			this.initialized=true;
		},
		registerMouseOver :function (){
			var offOverClass = this.cfg.getProperty('EXPANSION_OFFOVER_CLASS');
			var onOverClass = this.cfg.getProperty('EXPANSION_ONOVER_CLASS');
			var self=this;
			this.expansionElementsApply(function (el){
				EV.addListener(el,'mouseover',function (){
					if(self.state) {
						D.addClass(this,onOverClass);
					}
					else D.addClass(this,offOverClass);
				},el,true);
				EV.addListener(el,'mouseout',function (){
					D.removeClass(this,onOverClass);
					D.removeClass(this,offOverClass);
				},el,true);
			})
		},
		registerDisplayStatus :function (){
			for(var i=0,l=this.expansionTargets.length;i<l;++i){
				var el = this.expansionTargets[i];
				var d= D.getStyle(el,'display');
				if(d=='none') d="";
				el.initialDisplay = d;
			}
		},
		expansionElementsApply : function (fn){
			for(var i=0,l=this.expansionElements.length;i<l;++i){
				var el=this.expansionElements[i];
				fn.apply(this,[el]);
			}
		},
		expansionTargetsApply : function (fn){
			for(var i=0,l=this.expansionTargets.length;i<l;++i){
				var el=this.expansionTargets[i];
				fn.apply(this,[el]);
			}
		},
		set_off_class : function (el){
			D.replaceClass(el,this.cfg.getProperty('EXPANSION_ON_CLASS'),this.cfg.getProperty('EXPANSION_OFF_CLASS'));
		},
		set_on_class : function (el){
			D.replaceClass(el,this.cfg.getProperty('EXPANSION_OFF_CLASS'),this.cfg.getProperty('EXPANSION_ON_CLASS'));
		},

		open_panel : function (el){
			D.setStyle(el,'display',el.initialDisplay||'');
		},
		close_panel : function (el){
			D.setStyle(el,'display','none');
		},
		expansion_click_handler : function (){
			if(!this.state) this.open();
			else this.close();
		},
		open:function (){
			this.state=1;
			this.expansionElementsApply(this.set_on_class);
			this.expansionTargetsApply(this.open_panel);
			
			this.openEvent.fire();
		},
		close:function (){
			this.state=0;
			this.expansionElementsApply(this.set_off_class);
			this.expansionTargetsApply(this.close_panel);
			
			this.closeEvent.fire();
		},
		registerClickHandler : function (el){
			EV.addListener(el,'click',this.expansion_click_handler,this,true);
		},
		
		registerClickHandlers : function (){
			this.expansionElementsApply(this.registerClickHandler);
		},
		initEvents : function (){
			var CE = YAHOO.util.CustomEvent;
			var self = this;
            var builtinEvents = [
				'changeConfig',
                'close',
				'open'
            ];
            for(var i=0,l=builtinEvents.length;i<l;++i){
                var evName = builtinEvents[i];
				try {
                self[evName + 'Event'] = new CE(evName,self,true,CE.FLAT);
				} catch(e) {
				   console.log(p,e);
				}
            }
		},
		setupConfig  : function (){
			for(p in DEFAULT_CONFIG) {
				if(!L.hasOwnProperty(DEFAULT_CONFIG,p)) continue;
				try {
					this.cfg.addProperty(p,{value:DEFAULT_CONFIG[p].value,handler:this.configAppend});			     
				} catch(e) {
				   console.log(p,e);
				}
			}
		},
		configAppend: function(type, args, obj) {
            this.cfg.setProperty(type.toUpperCase(),args[0],true);
            //if(!this.initialized) return ;
            //var changeEventResult = this.changeConfig.fire({name:type,value:args[0]});
            
        }
	}
SMELZO.widget.ExpansionPanel = ExpansionPanel;
}());

function openFramePanel(frameurl,title,width,height,frameStyle,frameConfig){
		if(!width) width=950;
		if(!height) height=520;
		D.addClass(document.body,'yui-skin-sam')
		if(!frameStyle) frameStyle = "border:1px solid #DDD";
		var cfg = {close:true,modal:true,'width':width +"px",visible:false,fixedcenter:true};
		if(frameConfig) {
			cfg=L.merge(cfg,frameConfig);
		}
        PanelFrame =new YAHOO.widget.Panel(D.generateId(),cfg);
        var sBody = '<iframe src="' + frameurl + '" width="100%" frameborder="0" style="' + frameStyle + '" marginheight="0" marginwidth="0" height="' + height + '" scrolling="auto"/>';
        PanelFrame.setBody(sBody);
        PanelFrame.setHeader(title);
		PanelFrame.hideEvent.subscribe(function (){
			try {
			this.destroy();   
			} catch(ex) {}
        });
        //PanelFrame.hideEvent.subscribe(function (){
        //    location.refresh();
        //})
        PanelFrame.render(document.body);
        PanelFrame.show();
		return PanelFrame;
}
/*
 Parameters:
 el - element ID of target DIV
 class_prefix - base name of class generated with http://mierendo.com/software/rounded_css_boxes
 i.e. if name that you have chosen is "my_corners" the CSS rules have names as:.my_corners_tl, .my_corners_t, .my_corners_tr ... in this case class_prefix will be "my_corners"
 
 Usage:
 <div id="my_panel">Some text</div>
 <script type="text/javascript">
	 ApplyCorners('my_panel','my_corners');
 </script>
 
 The output will be:
 <div class="my_corners_t">
<div class="my_corners_l">
<div class="my_corners_r">
<div class="my_corners_b">
<div class="my_corners_tl">
<div class="my_corners_tr">
<div class="my_corners_bl">
<div class="my_corners_br">
<div id="my_panel" class="my_corners">
Some text
</div></div></div></div></div></div></div></div></div>
*/
function ApplyCorners(el,class_prefix){
	var element = document.getElementById (el);
	var clone = element.cloneNode(true);
	clone.className=class_prefix;
	function createDiv(parent,class_suffix){
		var d = document.createElement('div');
		d.className=class_prefix+class_suffix;
		if(parent) parent.appendChild(d);
		return d;
	}
	var _t = createDiv(null,'_t');
	var _l = createDiv(_t,'_l');
	var _r = createDiv(_l,'_r');
	var _b = createDiv(_r,'_b');
	var _tl= createDiv(_b,'_tl');
	var _tr= createDiv(_tl,'_tr');
	var _bl= createDiv(_tr,'_bl');
	var _br= createDiv(_bl,'_br');
	_br.appendChild(clone);
	element.parentNode.insertBefore(_t,element);
	element.parentNode.removeChild(element);
	return _t;
}
function ApplyCorners2(el,class_prefix){
	var element = $(el);
	var clone = element.cloneNode(true);
	D.addClass(clone,class_prefix);
	function createDiv(parent,class_suffix){
		var d = $E.createDiv();
		D.addClass(d,class_prefix+class_suffix);
		if(parent) {
			parent.appendChild(d);
		}
		return d;
	}
	var _t = createDiv(null,'_t');
	var _l = createDiv(_t,'_l');
	var _r = createDiv(_l,'_r');
	var _b = createDiv(_r,'_b');
	var _tl= createDiv(_b,'_tl');
	var _tr= createDiv(_tl,'_tr');
	var _bl= createDiv(_tr,'_bl');
	var _br= createDiv(_bl,'_br');
	_br.appendChild(clone);
	D.insertBefore(_t,element);
	element.parentNode.removeChild(element);
	return _t;
}
