

var AjaxRequest = new Class ({
	Implements: Options
	,options: {
		
	}
	
	,initialize:function(options){
		if (options) this.setOptions(options);
		
		/* process events */
		
	} 
	,getData:function(options,data){
		//var dc = JSON.decode(data);
		new Request.JSON(options).get();
		
	}
	,getDataRequest:function(options,data){
		var dc = JSON.decode(data);
		new Request(options).get(dc);
		
	}

	
});





var avSearch = {
	paths:'searchAdvanced/searchAdvanced.drxml'
	,submit:function(resFrom) {
		
		var efsv = $('fsearch').value;
		var eatfv = $('fFromTime').value;
		var eattv = $('fToTime').value;
		
		if(efsv =="" || efsv ==" ") {
			alert("Skriv mindst et sÃ¸geord");
			return false;
		}
		if(eatfv !="" && eattv !="" && Number(eatfv) >= Number(eattv)) {
			alert("Den valgte tidsangivelse er ikke mulig.");
			return false;
		}		
		var eavs = $('avResults');
		var etitle = $('fstitle');
		var eartist = $('fsartist');
		var efsSw = $('fsSw');
		var efsIn = $('fsIn');
		var efsEx = $('fsEx');
		var ecidv = $('cid').value;
		var eoidv = $('oid').value;
		var edatev = $('date').value;
		
		if (eattv == "24") eattv = "23:59";
		if (eatfv.length == 2) eatfv = eatfv+":00";
		if (eattv.length == 2) eattv = eattv+":00";
		if (eatfv.length == 1) eatfv = "0"+eatfv+":00";
		if (eattv.length == 1) eattv = "0"+eattv+":00";
		
		var searchType;
		var criteria;
		var dd;
		var mm;
		var yyyy;
		
		if (String(edatev) != "null" && String(edatev) != "") {
			var dta = new String(edatev).split("-");
			dd=dta[2];
			mm=dta[1];
			yyyy=dta[0];
		} else {
			dd=""
			mm=""
			yyyy=""
		}		
		if (etitle.checked == true) searchType = '1';
		if (eartist.checked == true) searchType = '2';
		if (efsSw.checked == true) criteria = '1';
		if (efsIn.checked == true) criteria = '2';
		if (efsEx.checked == true) criteria = '3';
		
		if (eatfv) eatfvFN = String(eatfv.substr(0,2))+String(eatfv.substr(3,2))
		else eatfvFN = '';
		if (eattv) eattvFN = String(eattv.substr(0,2))+String(eattv.substr(3,2))
		else eattvFN = '';

// REQUEST //		
		var url = globalVar.wsPaths+avSearch.paths+"?";
		var parm = new Hash({
			cid:ecidv,
			oid:eoidv,
			query:efsv,
			searchType:searchType,
			criteria:criteria,
			resultFrom:resFrom,
			resultLimit:'10',
			dd:dd,
			mm:mm,
			yyyy:yyyy,
			timeFrom:eatfv,
			timeTo:eattv,
			timeFromFN:eatfvFN,
			timeToFN:eattvFN
		});
		url += parm.toQueryString();

		eavs.store("process",new Process(eavs));
		var options = {
			url:url
			,onComplete:function(e){
					eavs.retrieve("process").stop();
					eavs.set('html',e);
				}.bind(this)
			}
		var data = {}
		var ajaxRequest = new AjaxRequest();
		ajaxRequest.getDataRequest(options,data);
	}

	,details:function(num,did) {
		var elmc = $('avTp_'+num);
		var elms = $('avRs_'+num);
		if (elms.getStyle('display')!='block') {
			
			elmc.store("process",new Process(elmc));
			var options = {
				url:globalVar.wsPaths+"getDetails/getDetails.drxml?did="+did
				,onComplete:function(e){
					elmc.retrieve("process").stop();
					elms.setStyle('display','block');
					elmc.setStyle('backgroundImage','url(/playlister/grafik/bg_avSearchResSubItem02.gif)');
					elmc.setStyle('color','#FFFFFF');
					elms.set('html',e);
				}.bind(this)
			}
			var data = {}
			var ajaxRequest = new AjaxRequest();
			ajaxRequest.getDataRequest(options,data);

		} else {
			elms.setStyle('display','none');
			elmc.setStyle('backgroundImage','url(/playlister/grafik/bg_avSearchResSubItem.gif)');
			elmc.setStyle('color','#000000');			
		}
	}
}




var DayList = new Class ({
	Extends: AjaxRequest
	,Implements: Options
	,options: {
		posList:null
		,dataAttributeName:'dr_data'
		,dateAttributeName:'dr_date'
		,cidSelector:'#cid'
		,kanalOversigtSelector:'#kanalOversigt'
		,dabnetListOversigtSelector:'#dabnetList'
		,playlistItemSelector:".playlistItem"
		,searchSimpleRequest:"searchSimple/searchSimple.drxml"
		,searchSimpleProgramRequest:"searchSimple/searchSimpleProgram.drxml"
		
		,getPlaylistReqiest:"getPlaylist/getPlaylist.drxml"
	}
	
	,initialize:function(options){
		if (options) this.setOptions(options);
		
		if (this.options.oid=="") {
			var paths = globalVar.wsPaths+this.options.searchSimpleRequest+"?cid="+this.options.cid+"&d="+this.options.d+"&m="+this.options.m+"&y="+this.options.y
		} else {
			var paths = globalVar.wsPaths+this.options.searchSimpleProgramRequest+"?cid="+this.options.cid+"&oid="+this.options.oid+"&d="+this.options.d+"&m="+this.options.m+"&y="+this.options.y
		}
// PROCESS
		this.options.elm.store("process",new Process(this.options.elm));
		var options = {
			url:paths
			,onComplete:function(e){
					this.options.elm.retrieve("process").stop();
					this.dayListResive(e);
				}.bind(this)
			}
		var data = {}
		this.getDataRequest(options,data);
	}
	,dayListResive:function(e){

		this.options.elm.set('html',e);
		this.options.elm.getElements(this.options.playlistItemSelector + " a").each(function(el){

			el.addEvent('click',function(e){
			 	var obj = {
				 'elm':el
				 ,'className':"playlistItem"
				 }
				var subContent = this.getParentElementByClass(obj);

				this.getTrackList( el.get(this.options.dataAttributeName) , subContent , el.get(this.options.dateAttributeName) );
			}.bind(this))
		}.bind(this))
		
		if (String(this.options.d+"/"+this.options.m+"/"+this.options.y)==dDate) {
			this.getLastElement(this.options.elm); 																// Dags dato, Ã¥bner sidste element
		} else if (String(this.options.elm.getElements(this.options.playlistItemSelector).length)=='1') {
			this.getLastElement(this.options.elm);																// Et element,, Ã¥bner element		
		} else {}


		// TilfÃ¸jer kanal titel til topbar.
		if (this.options.elm.getElement('#channelTitleHidden') != null && document.getElement('#channelTitle') != null)
			document.getElement('#channelTitle').set("html", this.options.elm.getElement('#channelTitleHidden').get("html"));
	
		
	}
	
	,getTrackList:function(data, _element, date) {

		var content = _element.getElement(".itemSub");
		var contentTop = _element.getElement(".itemTop");
		
		if (content.getStyle('display')!='block') {
			// PROCESS

			contentTop.store("process",new Process(contentTop));
			
			var options = {
				url:globalVar.wsPaths+this.options.getPlaylistReqiest+"?pid="+data+"&date="+date.split("T")[0]
				,onComplete:function(e){
					
					try {
						contentTop.retrieve("process").stop();
					} catch(e){}
					
					var eh = new Hash();
					eh.set("_element",_element)
					eh.set("e",e);
					this.setTrackList(eh);
				}.bind(this)
			}
			var data = {}
			
			this.getDataRequest(options,data);

		} else {
			content.setStyle('display','none');
			contentTop.setStyle('backgroundImage','url(/playlister/grafik/bg_playlistItemTop.gif)');
		}
	}
	,setTrackList:function(eh){
				
		var content = eh._element.getElement(".itemSub")
		var contentTop = eh._element.getElement(".itemTop")
		
		content.setStyle('display','block');
		contentTop.setStyle('backgroundImage','url(/playlister/grafik/bg_frontpageTopModSelect.gif)');
		content.set('html',eh.e);

		
		content.getElements('.itemSubContent a').each(function(el){
															   
			if (el.get(this.options.dataAttributeName)!=null) {											   
															   
				el.addEvent('click',function(e){
					var obj = {
					 'elm':el
					 ,'className':"itemSubContent"
					 }
					var subContent = this.getParentElementByClass(obj)
					this.details(el.get(this.options.dataAttributeName),subContent);		   
				}.bind(this))
				
			} else {
				el.getElement("img").setStyle("display","none");
				el.set("onmouseover","this.style.cursor='default'");
			}
			
		}.bind(this))
	}
	
	,isClassic:function(){
		
		// is a classic channel ? //
		for ( var i in klassiskKanaler ) {
			if ( this.options.cid == klassiskKanaler[i].pl ) return "&classicchannel=true";
		} 
		return "&classicchannel=";
	}
	, details:function(data, _element ) {
		
		
		
		
		var elmt = _element.getElement(".itemSubSubTop");
		var elms = _element.getElement(".itemSubSub");
		var elmc = _element.getElement(".itemSubSubTop a");
		var elmi = _element.getElement(".itemSubSubTop img");
		var did = data;

		if (elms.getStyle('display')!='block') {
			// PROCESS
			elmt.store("process",new Process(elmt));

			var options = {
				url:globalVar.wsPaths+"getDetails/getDetails.drxml?did="+did
				,onComplete:function(e){
					
					
					
					elmt.retrieve("process").stop();
					var eh = new Hash();
					eh.set('elms',elms);
					eh.set('elmt',elmt);
					eh.set('elmi',elmi);
					eh.set('elmc',elmc);
					eh.set('e',e);
					this.detailsReturn(eh);
				}.bind(this)
			}
			var data = {}
			this.getData(options,data);

		} else {
			elmc.setStyle('fontWeight','normal');
			elmc.setStyle('color','#000000');
			elmt.setStyle('backgroundImage','url(/playlister/grafik/bg_playlistItemSubContent.gif)');
			elmt.setStyle('backgroundPosition','left bottom');
			elmi.set('src','/playlister/grafik/ic_subPluds01.gif');
			elms.setStyle('display','none');
		}
	}
	,detailsReturn:function(eh){
		
		eh.elms.empty();
		
		
		eh.elms.setStyle('display','block');
		eh.elmt.setStyle('backgroundImage','url(/playlister/grafik/bg_playlistItemSubSubTopSel.gif)');
		eh.elmt.setStyle('backgroundPosition','left top');
		eh.elmc.setStyle('fontWeight','bold');
		eh.elmc.setStyle('color','#FFFFFF');
		eh.elmi.src = '/playlister/grafik/ic_subMinus02.gif';
		
		//console.log(eh.e)
		//alert(eh.e[0].details)
		
		try{
		
		eh.e.details.each(function(d){
			
			
			var opt = {
				"name":d.name
				,"value":d.value
				,"date":d.date
			}
			if (d.name == "additional") {
				
				var sortFnc = function(a,b){
					if(a.role == b.role){
						if(a.name == b.name){
							return 0;
						}
						return (a.name < b.name) ? -1 : 1;
					}
					return (a.role < b.role) ? -1 : 1;
				}
				// sorter/samler rollerne
				d.value.sort(sortFnc);

				// marger roll_id 7

				
				var filter7 = function(){
					var temp = "";
					var obj = [];
					d.value.each(function(f,i){
						if(f.role_id == "7") {
							temp += f.name + " (" + f.instrument +")<br/>";
						} else {
							obj.push(f)
						}
					});
					if (temp != "") obj.push({"role":"medvirkende","name":temp}) 
					return obj
				}
				
				d.value = filter7(d.value);

				
				d.value.each(function(f){
					var optSec = {
						"name":f.role
						,"value":f.name
						
					}
					this.detailsItem(optSec).inject(eh.elms);
				}.bind(this))

				
			} else {
				this.detailsItem(opt).inject(eh.elms);
			}
			//console.log(d)						  
		}.bind(this))

		new Element("div", {"class":"itemSubSubFooter", "html":" "}).inject(eh.elms);
		
		
		} catch(e) {
			
		}

	}
	
	,detailsItem:function(obj){
		
		// <div class="itemSubSubFooter"> </div>
		var title = obj.name.substr(0,1).toUpperCase() + obj.name.substr(1) + ":";


		if (obj.date=="true" && obj.value.length > 1 ) {
			obj.value = obj.value.substr(0,4)
		}
		
		return new Element("div", {"class":"itemSubSubContent"} ).adopt(
			new Element("p", {"class":"subInfo","html":title})			 
			, new Element("p", {"html":obj.value})
			, new Element("div", {"class":"clear"}).adopt(new Element("span", {"html":" "}))
			)
	}
	
	
	
	
	,getLastElement:function(elm) {
		
		var elma = elm.getElements('.playlistItem');
		
		if (elma.length > 0) {
			
			var elms = elma[elma.length-1];
			var elml = elms.getElements('a');
			
			if (typeof(elml)=='object') {
				
				var subContent = elml.getParent().getParent();
				this.getTrackList( elml[0].getProperty(this.options.dataAttributeName) , elms , elml[0].getProperty(this.options.dateAttributeName) ); // get track list
			}
		}
	}
	
	,getParentElementByClass:function(obj){
		var _e = obj.elm;
		var _c = obj.className;
		
		try {
			do 
			{ 
				_e = _e.getParent();
			} 
			while( $type(_e)=='element' && _e.hasClass(_c)==false );
			
			if ($type(_e)=='element' ) {
				return _e;
			} else {
				return false;
			}
		} catch(e) {
			return false	
		}


		
		
	}
	
	
	
});


var SearchSimple = new Class ({
	Extends: AjaxRequest
	,Implements: Options
	,options: {
		datesByChannelAndProgram:'getDatesByChannelAndProgram/getDatesByChannelAndProgram.drxml'
		,submitSearchPath:'/playlister/playlist.asp'
		,getProgramsPath:"getPrograms/getPrograms.drxml"
		
		,defaultKanalText:"VÃ¦lg kanal"
		,defaultProgramText:"VÃ¦lg program"
		,defaultDateText:"VÃ¦lg dato"
		,cidSelector:'cid'
		,oidSelector:'oid'
		,dateSelector:'date'
		,submitSelector:'.simpSubmit'
	}
	
	,initialize:function(options){
		if (options) this.setOptions(options);
		this.searchTools = new SearchSimpleTools();
		
		this.cidElm = $(this.options.cidSelector);
		this.oidElm = $(this.options.oidSelector);
		this.dateElm = $(this.options.dateSelector);
		this.submitElm = document.getElement(this.options.submitSelector);		
		this.cidElm.addEvent('change',this.cidChange.bind(this));
		this.oidElm.addEvent('change',this.oidChange.bind(this));
		this.submitElm.addEvent('click',this.submitSearch.bind(this));
	}
	

	,channelRes:function(obj) {
		

		var rs = this.options.plFnc.getChannelPosList().getChannel;
		var opt = {
			/*
			filterName:"radio"
			,filterOnKey:"type"
			*/
			resultValue:"source_url"
			,resultKey:"name"
			,data:rs
		}

		
		var titleObj = {"title":this.options.defaultKanalText}
		this.selectBox(this.searchTools.objKeyValByFilter(opt),obj.elm,"asc", titleObj);
		
		
		// Sorter kanaler, sÃ¦tter P-kanalerne Ã¸verst.
		var firstElm = obj.elm.options[0]		
		obj.elm.getElements("option").each(function(e){
																					
			if (e.get('text').substr(0,1) == "P") {
				var eItem = e.dispose().inject(firstElm,"before");
			}
		})
		firstElm.dispose().inject(obj.elm,"top");
		

		obj.elm.options[0].selected = true
		this.disable(this.oidElm,this.options.defaultProgramText);
		this.disable(this.dateElm,this.options.defaultDateText);
		

	}
	,program:function(parm) {
		if (String(parm)=='') return false;
		// PROCESS 
		this.oidElm.store("process",new Process(this.oidElm));
		
		var y = this.options.plFnc.options.y;
		var m = this.options.plFnc.options.m;
		var d = this.options.plFnc.options.d;
		
		var options = {
			url:globalVar.wsPaths+this.options.getProgramsPath+"?cid="+parm+"&date="+y+"-"+m+"-"+d
			,onComplete:function(e){
					this.oidElm.retrieve("process").stop();
					this.programReturn(e);
				}.bind(this)
			}
		var data = {}
		this.getData(options,data);
	}
	,programReturn:function(e){

		// PROCESS STOP
		//oidPros.stop()
		var eh= e.getPrograms;
		this.oidElm.removeProperty("disabled");
		
		var opt = {
			resultValue:"pid"
			,resultKey:"title"
			,data:eh
		}
		
		var prgTitleObj = {"title":this.options.defaultProgramText}
		var dateTitleObj = {"title":this.options.defaultDateText}
		
		var total = this.selectBox(this.searchTools.objKeyValByFilter(opt),this.oidElm, "asc", prgTitleObj);

		if (total==0) {
			this.disable(this.oidElm,this.options.defaultProgramText);
			this.dateElm.removeProperty("disabled");
			var d = new Hash(this.searchTools.date30());
			this.selectBox(d,this.dateElm,"",dateTitleObj);
		} else if(total==1) {
			this.removeOption(this.oidElm);
			this.optionLength(this.oidElm);
			this.dateElm.removeProperty("disabled");

			var d = new Hash(this.searchTools.date30());
			this.selectBox(d,this.dateElm,"",dateTitleObj);
		} else {
		//this.disable(this.dateElm,"VÃ¦lg dato");
			this.dateElm.removeProperty("disabled");
			var d = new Hash(this.searchTools.date30());
			this.selectBox(d,this.dateElm,"",dateTitleObj);
			this.oidElm.options[0].selected = true
		}
		this.dateElm.options[0].selected = true;

	}
	
	,date:function(cid,oid) {
		// PROCESS
		
		
		this.dateElm.store("process",new Process(this.dateElm));
		var options = {
			url:globalVar.wsPaths+this.options.datesByChannelAndProgram+"?cid="+cid+"&oid="+oid
			,onComplete:function(e){
					this.dateElm.retrieve("process").stop();
					this.dateReturn(e);
				}.bind(this)
			}
		var data = {}
		this.getData(options,data);
	}
	,dateReturn:function(e){
		
		// PROCESS
		//datePros.stop();
		this.dateElm.removeProperty("disabled");
		var rs= e.dates;
		// formate name:date
		rs.each(function(e,i){
		//	e.name = e.name.substr(8,2) + "/" +e.name.substr(5,2) + "/" + e.name.substr(0,4); 			 
		});
		var opt = {
			resultValue:"date"
			,resultKey:"name"
			,data:rs
			//,raw:e.date
		}
		var dateTitleObj = {"title":this.options.defaultDateText}
	
		var total = this.selectBox(this.searchTools.objKeyValByFilter(opt),this.dateElm,"date",dateTitleObj);
		
		if(total==1) this.removeOption(this.dateElm);
		this.dateElm.options[0].selected = true
		
	}
	
	,selectBox:function(obj,elm,_sort, objTitle) {
		elm.set('html','');
		var cnt=0;
		
		switch(_sort) {
			
			case "date":
				var pos = "top"
				$H(obj).sort().each(function(el){
					$each(el,function(value, key){
					  var html = key.substr(8,2) + "/" +key.substr(5,2) + "/" + key.substr(0,4)

						var elC= new Element('option',{'value':value,'html': html});
						elC.inject(elm,pos)
						cnt++;	
					}.bind(this))
				}.bind(this))
				
			break;
			
			case "asc":
				var pos = "bottom"
				$H(obj).sort().each(function(el){
					$each(el,function(value, key){
						var k = key.replace("&", "&amp;")
						var elC= new Element('option',{'value':value,'html':k });
						elC.inject(elm,pos)
						cnt++;	
					}.bind(this))
				}.bind(this))
				
			break;
			case "desc":
				var pos = "top"
				$H(obj).sort().each(function(el){
					$each(el,function(value, key){

						var elC= new Element('option',{'value':value,'html':key});
						elC.inject(elm,pos)
						cnt++;	
					}.bind(this))
				}.bind(this))
			break;
			default : 
				var pos = "bottom"
				$each(obj,function(value, key){
					
					var elC= new Element('option',{'value':value,'text':key});
					elC.inject(elm,pos)
					cnt++;	
				}.bind(this))
			break;
			
		}

		
		if (objTitle != undefined) {
			var elC= new Element('option',{'value':'','html':objTitle.title} );
			elC.inject(elm,"top")
		}
		return cnt;
	}
	
	,optionLength:function(elm) {
		var elms = $(elm).getElements('option');
		var cnt=0;
		elms.each(function(el) {
			cnt++;
		});
		if (cnt<=1) elm.disabled=true; 
	}
	,removeOption:function(elm) {
		var elms = $(elm).getElements('option');
		elms.each(function(el) {
			if (el.value=='') el.dispose();
		});
	}
	

	,disable:function(elm,text) {
		elm.set('html','');
		var elC= new Element('option',{'value':''}).set('html',text);
		elC.injectInside(elm)
		elm.disabled=true;
	}

	,submitSearch:function() {
		
		var ecidv = this.cidElm.get('value');
		if(ecidv =="") {
			alert("VÃ¦lg en kanal");
			return false;
		}
		var eoidv = this.oidElm.get('value');
/*
		var progTotal = this.getTotal(eoid)
		
		if(eoidv =="" && Number(progTotal)>2) {
			alert("VÃ¦lg en program");
			return false;
		}
*/
		var progTotal = this.searchTools.getTotal(this.oidElm);
		var edatev = this.dateElm.get('value');
		
		if(edatev =='' && eoidv =='') {
			alert("VÃ¦lg en dato eller et program");
			return false;
		} else if (eoidv !='' && progTotal > 2 && edatev =='') {
			alert("VÃ¦lg en dato");
			return false;
		} else {
			var dt = new String(edatev).split("-");
			if (String(dt[2])=='undefined') dt[2]='';
			if (String(dt[1])=='undefined') dt[1]='';
			if (String(dt[0])=='undefined') dt[0]='';
			var urlDate = "&dd="+dt[2]+"&mm="+dt[1]+"&yyyy="+dt[0];
			
		}			
		var name = this.cidElm[this.cidElm.selectedIndex].get('html');	
		window.location = this.options.submitSearchPath+"?cid="+ecidv+"&oid="+eoidv+urlDate;
	}
	
	// select events CHANGE start //
	,cidChange:function(t) {
		this.disable(this.oidElm,this.options.defaultProgramText);
		this.disable(this.dateElm,this.options.defaultDateText);
		this.program(this.cidElm.get('value'));
		
	}
	,oidChange:function() {
		this.disable(this.dateElm,this.options.defaultDateText);
		this.date(this.cidElm.get('value'),this.oidElm.get('value'))
	}
	,dateChange:function() {
		return;
	}
	// select events CHANGE end //

});




var SearchSimpleTools = new Class ({
	Implements: Options
	,options: {	}
	
	,initialize:function(options){
		if (options) this.setOptions(options);
	}
	
	,dateConvertName:function(obj) {
		if (typeof(obj)!="object") var json = JSON.decode(obj);
		else json = obj;
		for(var key in json) {
			var dArr = json[key].split("-");
			var nstr = dArr[2]+"/"+dArr[1]+"/"+dArr[0];
		 	json[key]= nstr
		}
		return json;
	}
	,date30:function() {
		dDateSplit = dDate.split("/");
		
		var nd = new Date(dDateSplit[2],Number(dDateSplit[1]-1),dDateSplit[0]);
		var obj = new Object();			
		for(i=0;i<28;i++) {
			tDate = new Date(nd);
			var nday = new String(tDate.getDate())
			var nMonth = new String(Number(tDate.getMonth()+1))
			if (nday.length < 2) nday = "0"+nday;
			if (nMonth.length < 2) nMonth = "0"+nMonth;
			nda = nday+"/"+nMonth+"/"+tDate.getFullYear();
			ndn = tDate.getFullYear()+"-"+nMonth+"-"+nday;
			obj[nda]=ndn;
			nd = nd - (1000 * 60 * 60 * 24);
		}
		return obj;
	}
	,isFMkanal:function(name) {
		for(var i=0;i<fmKanaler.length;i++) {
			if (name == fmKanaler[i]) return true
		}
		return false;
	}
	,getTotal:function(elm) {
		var cnt=0;
		$(elm).getElements('option').each(function(el) {cnt++;});
		return cnt;
	}
	
	
	,objKeyValByFilter:function(opt){
		
		var fn = opt.filterName;
		var fok = opt.filterOnKey;
		var  rv = opt.resultValue;
		var  rk = opt.resultKey;
		var d = opt.data;
		var h  = {};
		
		d.each(function(e,i){
			
			if (fok != null) {
				if (e[fok]==fn) h[e[rk]]=e[rv];
			} else {
				h[e[rk]]=e[rv];					
			}
			
		});
		return h;

	}
	,objKeySort:function(opt){
	
	}
	
	
});



var globalVar = {
	wsPaths:"/Playlister/feeds/"
	,getChannelPaths:"getChannel/getChannel.drxml"
	,clearTag:function() {
		return new Element('div',{'class':'clear'}).adopt(new Element('span').set('html',"&nbsp;"));
	}
}

var playlistOpenNetradio = function(netId){
	var tobj = {'station':netId}
	DR.netradio.open(tobj);
}






var Tools = new Class ({
	Implements: Options
	,options: {
		
	}
	
	,initialize:function(options){
		if (options) this.setOptions(options);
		
	}
	,getIdFromName:function(name,json) {
		//var json = JSON.decode(obj);
		for(var key in json) {
			if (name.toLowerCase()==key.toLowerCase()) return json[key];
		}
		return false;
	}
	,getChannelType:function(type) {
		var path = "/playlister/grafik/";
		switch(type) {
			case "dn":
				return path + "ic_dab_net.gif";
			break;
			case "d":
				return path + "ic_dab.gif";
			break;
			case "n":
				return path + "ic_net.gif";
			break;
			default :
				return false;
			break;
		}
	}
	,objKeyValByFilter:function(opt){
		
		var fn = opt.filterName;
		var fok = opt.filterOnKey;
		
		
		var  rv = opt.resultValue;
		var  rk = opt.resultKey;
		
		var d = opt.data;
		
		var h  = {};
		d.each(function(e,i){
					
			if (fok != null) {
				if (e[fok]==fn) h[e[rk]]=e[rv];
			} else {
				h[e[rk]]=e[rv];					
			}
			
		});
		return h;

	}
 });


var Display = new Class ({
	Extends: AjaxRequest
	,Implements: [Options]
	,options: {
		ajaxRequest:null
	}
	
	,initialize:function(options){
		if (options) this.setOptions(options);
	}
	,getChannel:function(opt) {

		/*var f = opt.fnc;
    	var o = opt.fncObj;
    	var bound = { f: f.bind(o) };
		*/
		var processElement = document.getElement(this.options.plFnc.options.cidSelector)
		processElement.store("process",new Process(processElement));
		var options = {
			url:globalVar.wsPaths+globalVar.getChannelPaths
			,onComplete:function(e){
				
				processElement.retrieve("process").stop();
				this.options.plFnc.init(e)
				//opt.fnc(e).bind();
				
			}.bind(this)
		}
		var data = {}
		
		this.getData(options,data);
	}


	,kanalOversigt:function(obj) {
		
		var rs = this.options.plFnc.getChannelPosList().getChannel;
		
		var opt = {
			filterName:"radio"
			,filterOnKey:"type"
			,resultValue:"source_url"
			,resultKey:"name"
			,data:rs
		}	
		var elUL= new Element('ul');
		$H(this.options.tools.objKeyValByFilter(opt)).sort().each(function(el){
			$each(el,function(value, key){

							  
				var link = "/playlister/playlist.asp?cid="+value+"&oid=&dd=&mm=&yyyy=";
 				var el = new Element('li').adopt(new Element('p').adopt(new Element('a',{'href':link}).set('html',key)))
				el.injectInside(elUL)		  

			}.bind(this))
		}.bind(this))
		elUL.injectInside(obj.elm);

	}
	,dabnetOversigt:function(obj) {

		var rs = this.options.plFnc.getChannelPosList().getChannel;
		
		var opt = {
			filterName:"dab_net"
			,filterOnKey:"type"
			,resultValue:"source_url"
			,resultKey:"name"
			,data:rs
		}
		// DAB NET kanaler
		var dn = this.options.tools.objKeyValByFilter(opt);
		var opt = {
			filterName:"net"
			,filterOnKey:"type"
			,resultValue:"source_url"
			,resultKey:"name"
			,data:rs
		}
		var n = this.options.tools.objKeyValByFilter(opt);
		
		var elUL= new Element('ul');
		
		$H(dn).sort().each(function(el){
			$each(el,function(value, key){

			var img = this.options.plFnc.tools.getChannelType("dn");
			var link = "/playlister/playlist.asp?cid="+value+"&oid=&dd=&mm=&yyyy=&";
 			var eli = new Element('a',{'href':link}).set('html',key).adopt(new Element('img',{'border':'0','src':img}));
 			var el = new Element('li').adopt(new Element('p').adopt(eli))
			el.injectInside(elUL);
			}.bind(this))
		}.bind(this))
		
		var el = new Element('li').adopt(new Element('p',{html:"&nbsp;"}))
		el.injectInside(elUL);
		
		$H(n).sort().each(function(el){
			$each(el,function(value, key){
							  
			var img = this.options.plFnc.tools.getChannelType("n");
			var link = "/playlister/playlist.asp?cid="+value+"&oid=&dd=&mm=&yyyy=";
			var eli = new Element('a',{'href':link}).set('text',key).adopt(new Element('img',{'border':'0','src':img}));
 			var el = new Element('li').adopt(new Element('p').adopt(eli))
			el.injectInside(elUL);
			}.bind(this))
		}.bind(this))
		elUL.injectInside(obj.elm);
		
	}
	

	
	
	
});


var Playlist = new Class ({
	Implements: Options
	,options: {
		posList:{}
		,cidSelector:'#cid'
		,kanalOversigtSelector:'#kanalOversigt'
		,dabnetListOversigtSelector:'#dabnetList'
		,programListSelector:'#programList'
		,dateSelector:	".datoSelect"
		
	}
	
	,initialize:function(options){
		if (options) this.setOptions(options);
		
		//this.posList = this.options.posList
		
		this.tools = new Tools();
		// ajax events //
		//this.ajaxRequest = new AjaxRequest();
		
		// display types //
		var options = {
		//	'ajaxRequest':this.ajaxRequest
			'tools':this.tools
			,'plFnc':this
			}
			
			
		display = new Display(options);
		
		
		// get channel info 
		var obj = {"fnc":this.init}
		display.getChannel(obj);
		
		
		
		// get program list
		if (document.getElement(this.options.programListSelector)) {
		var options = {
			'type':this.options.type
			,'cid':this.options.cid
			,'oid':this.options.oid
			,'d':this.options.d
			,'m':this.options.m
			,'y':this.options.y
			,'evt':this.options.evt
			,'elm':document.getElement("#"+this.options.type)
			}
			daylist = new DayList(options);
		}
		
		if (document.getElement(this.options.dateSelector)) {
		var options = {
			'type':this.options.type
			,'cid':this.options.cid
			,'cidName':this.options.cidName
			
			,'d':this.options.d
			,'m':this.options.m
			,'y':this.options.y
			,'evt':this.options.evt
			,'elm':document.getElement(this.options.dateSelector)
			}
			dateSelector = new DateSelector(options);
			
		}
		
	}
	
	,init:function(e){

		this.setChannelPosList(e);

		var ecid = document.getElement(this.options.cidSelector);
		var eko = document.getElement(this.options.kanalOversigtSelector);
		var edno = document.getElement(this.options.dabnetListOversigtSelector);



// indsætter select boks data for simple search //
			if (String(eko) != 'null') {
				var opt = {elm:eko};
				display.kanalOversigt(opt);
				
				
				var opt = {elm:eko};
				display.dabnetOversigt(opt);
				globalVar.clearTag().injectInside(eko)
			}
			
// DAB og Netkanaler //

			if (String(edno) != 'null'){
				var opt = {elm:edno};
				display.dabnetOversigt(opt);
				globalVar.clearTag().injectInside(edno);
			}	


// playlist Display //
			if (String(ecid)!= 'null') {
				
				var opt = {
					'ajaxRequest':this.ajaxRequest
					,plFnc:this
					,tools:this.tools
					};
				var searchSimple = new SearchSimple(opt);
				var opt = {
					elm:ecid
					};
				searchSimple.channelRes(opt);

			}


		
	}
	
	
	,setChannelPosList:function(obj){
		this.posList = obj;
	}
	,getChannelPosList:function(obj){
		return this.posList;
	}

	
});











var Process = new Class({
	options: {
		steps:5,
		fps:20,
		offsetX:-14,
		offsetY:4
	},
	initialize: function(_this){

		this.elementInner = new Element("div").set('html','&nbsp;');
		this.element = new Element("div", {"class": "plProcess"}).adopt(this.elementInner);
		this.element.inject(document.getElement('body'));



		this.element.setStyles({
			'top': _this.getTop() +this.options.offsetY
			,'left': _this.getLeft()+this.options.offsetX 
			,'position': 'absolute'
			,'width':'10px'
			,'height':'10px'
			,'overflow':'hidden'
			,'z-index':'1000'
		});
		
		/// getPosition

		this.width = this.element.offsetWidth;
		this.height = this.element.offsetHeight;
		var width = this.elementInner.offsetWidth;
		var height = this.elementInner.offsetHeight;
		this.frame = 0;
		this.anim = this.stepProcess.periodical((1000/this.options.fps).round(), this);

	}

	
	,stepProcess: function(){
		this.frame++;
		if (this.frame>this.options.steps) this.frame = 0;
		this.elementInner.setStyle("margin-left", -(this.frame*this.width) + "px");
	}
	,stop: function(){
		$clear(this.anim);
		this.element.dispose();
	}

});

/*
ajaxProces = new Class({
	
	initialize: function(element){
		if (typeof(element)=='string') element = $(element);
		this.loader = new Proces(element);
	}
	,stop:function() {
		this.loader.stop();
	}
})	
*/





var DateSelector = new Class ({
	Implements: Options
	,options: {
		mainElementSelector:	".datoSelect"
		,listElements:			".calendarList"
		
		,y:						""
		,m:						""
		,d:						""
		,sty:					2010
		,stm:					5
		,std:					9
		
		
		
	}
	
	,initialize:function(options){
		if (options) this.setOptions(options);
		
		this.options.startDate = new Date( this.options.sty , Number(this.options.stm) , this.options.std ) // data avalible from current date
		
		
		
			
		if (document.getElement(this.options.mainElementSelector)){
			
			this.startDate = this.options.startDate;
			this.todaysDate = this.options.todaysDate;
			var opt = {
				'displayMonth':		this.options.m
				,'conatiner':		this.options.elm
				,'listElement':		this.options.elm.getElement(this.options.listElements)
				,'m':				Number(this.options.m)
				,'y':				Number(this.options.y)
				,'d':				Number(this.options.d)

				}
			this.generateView(opt)
		}
		
	}
		
	,generateView:function(obj){

		// Month switch
		this.generateNavigation(obj)
		
		// Day selector
		this.generateListOfDayes(obj);
	}
	
	,generateNavigation:function(obj){
		
		obj.conatiner.getElement('.left a').addEvent("click",function(){
				
			if (obj.m == 1) {
			obj.y = obj.y-1
			obj.m = 12
			} else {
				obj.m = obj.m-1	
			}
			this.generateListOfDayes(obj)														   
		}.bind(this))
		
		obj.conatiner.getElement('.right a').addEvent("click",function(){
			if (obj.m == 12) {
			obj.y = obj.y+1
			obj.m = 1
			} else {
				obj.m = obj.m+1	
			}
			
			this.generateListOfDayes(obj)													   
		}.bind(this))
		
				
		var dayStepper = obj.conatiner.getParent().getElement(".prevNextDate");
			// Date text
			dayStepper.getElement(".content p").set("html", this.getDayName(new Date(obj.y,obj.m-1,obj.d).getDay() ) + " d. " + obj.d + " " + this.getMonthName(obj.m) + " " + obj.y)
			
			var difStart = new Date( Number(this.options.sty) , Number(this.options.stm) , Number(this.options.std+1) ).getTime();
			var difSelected = new Date( Number(obj.y)  , Number(obj.m) ,  Number(obj.d) ).getTime();
			var difToday = new Date(  Number(todayYear_global) , Number(todayMonth_global) , Number(todayDay_global-1) ).getTime();
			
			// Previous date
			var elmLeft = dayStepper.getElement(".left a")
			if (difStart < difSelected) {
				
	
				elmLeft.setStyle("display","block")
				elmLeft.addEvent("click",function(){
					var tempdate = new Date(obj.y,obj.m-1,obj.d)
					tempdate.setDate(tempdate.getDate()-1);
					var path = '/playlister/playlist.asp?cid='+this.options.cid+'&dd='+tempdate.getDate()+'&mm='+Number(tempdate.getMonth()+1)+'&yyyy='+tempdate.getFullYear();
					window.location = path;
				}.bind(this))
				
			} else {
				elmLeft.setStyle("display","none")
			}
	
			// Next date
			var elmRight= dayStepper.getElement(".right a")
			if ( difSelected <= difToday) {
				elmRight.setStyle("display","block")
				elmRight.addEvent("click",function(){
					var tempdate = new Date(obj.y,obj.m-1,obj.d)
					tempdate.setDate(tempdate.getDate()+1);
					var path = '/playlister/playlist.asp?cid='+this.options.cid+'&dd='+tempdate.getDate()+'&mm='+Number(tempdate.getMonth()+1) +'&yyyy='+tempdate.getFullYear();
					window.location = path;									   
				}.bind(this))
			} else {
				elmRight.setStyle("display","none");
			}


			
			
			
			dayStepper.getElement(".right a").addEvent("click",function(){
				var tempdate = new Date(obj.y,obj.m-1,obj.d)
				tempdate.setDate(tempdate.getDate()+1);
				var path = '/playlister/playlist.asp?cid='+this.options.cid+'&dd='+tempdate.getDate()+'&mm='+Number(tempdate.getMonth()+1) +'&yyyy='+tempdate.getFullYear();
				window.location = path;									   
			}.bind(this))
		
	}
	,generateListOfDayes:function(obj){
		
		// updating date display text
		obj.conatiner.getElement('.content p').set("html", this.getMonthName(obj.m) + " " +obj.y  ) 
		
		// updating navigation visiblity
		if (obj.m==todayMonth_global&&obj.y==todayYear_global) {
			obj.conatiner.getElement('.right p').setStyle( "display" , "none" );
		
		} else {
			obj.conatiner.getElement('.right p').setStyle( "display" , "block" );
		}
		// updating navigation visiblity
		if (obj.m== this.options.startDate.getMonth() &&obj.y==this.options.startDate.getFullYear() ) {
			obj.conatiner.getElement('.left p').setStyle( "display" , "none" );
		
		} else {
			obj.conatiner.getElement('.left p').setStyle( "display" , "block" );
		}
		


		var elmUL = obj.listElement.getElement("ul");
		elmUL.empty();
		
		// items before
		var offset = this.getStartingOffset( obj.m, obj.y );
		offset.each(function(e){
			var opt = {
				'cl':	''
				,'html':	'&nbsp;'
				}
				this.newElementEmpty(opt).inject( elmUL );
		}.bind(this));
		
		// items to be selected
		var daysInMonth = this.getDaysInMonth( obj.m,obj.y )

		daysInMonth.each(function(e){
	
			var difToday=new Date( todayYear_global , todayMonth_global , todayDay_global-1 );
			var difTemp=new Date( obj.y , obj.m , e );
			
			if ( difToday.getTime() >= difTemp.getTime()  && this.options.startDate.getTime() <= difTemp.getTime()  ) {

				var cl = ( obj.d == e+1 && obj.m == this.options.m && obj.y == this.options.y) ? "sel deselect0" : "deselect0" ;
				var opt = {
					'cl':	cl
					,'html':	Number(e+1) + '/' + obj.m
					,'href':	'/playlister/playlist.asp?cid='+this.options.cid+'&dd='+Number(e+1)+'&mm='+obj.m+'&yyyy='+obj.y
					}
				this.newElement(opt).inject( elmUL );

			} else {
				var opt = {
					'cl':	'border'
					,'html':	Number(e+1) + '/' + obj.m
					,'href':	'javascript:void(0)'
					}
				this.newElementEmpty(opt).inject( elmUL );
			}
		
		}.bind(this));
		
	}
	
	,newElement:function(obj){
		return new Element("li").adopt(new Element("a", {
			'class':obj.cl
			,'href':obj.href
			,'html':obj.html
		}))
		
	}
	
	,newElementEmpty:function(obj){
		return new Element("li").adopt(new Element("p",								   
			{
			'class':obj.cl
			,'html':obj.html
			}
		))
		
	}
	
	,getStartingOffset: function(month,year){ // month: must be an integer (0 - 11)
		return new Date(year,month-1,1).getDay()-1;
	}
	,getDaysInMonth: function(month, year){ // month: must be an integer (0 - 11) year: used to dertermine if leap year exists
		var daysInMonths = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
		if(new Date(year,1,29).getDate() == 29) // determine if leap year
			daysInMonths[1] = 29;
		return daysInMonths[month-1];
	}
	,getMonthName: function(n){
			var monthList = [
				"Januar"
				,"Februar"
				,"Marts"
				,"April"
				,"Maj"
				,"Juni"
				,"Juli"
				,"August"
				,"September"
				,"Oktober"
				,"November"
				,"December"
			];
			if (n==0)n=12;
			return monthList[n-1];
	}
	,getDayName: function(n){
			var dayList = [
				"Mandag"
				,"Tirsdag"
				,"Onsdag"
				,"Torsdag"
				,"Fredag"
				,"LÃ¸rdag"
				,"SÃ¸ndag"
			];
			if (n==0)n=7;
			return dayList[n-1];
	}
	
});









var flashCom = {
	getClassicChan:function(){
		return klassiskKanaler;
	}
	,isClassicID:function(id){
		for ( var i in klassiskKanaler ) {
					if ( id == klassiskKanaler[i].pl ) return true;
		} 
		return false;
	}
	,isClassicNAME:function(name){
		for ( var i in klassiskKanaler ) {
					if ( id == klassiskKanaler[i].name ) return true;
		} 
		return false;
	}
}



Hash.implement({ 
	sort:function(fn){ 
	
		var out = [], 
			keysToSort = this.getKeys(), 
			m = this.getLength(); 
		(typeof fn == 'function') ? keysToSort.sort(fn) : keysToSort.sort(); 
		for (var i=0; i<m; i++){ 
			var o = {}; 
			o[keysToSort[i]] = this[keysToSort[i]]; 
			out.push(o); 
		} 
		return out; 
	} 
}); 


var init = {
	playlist:function(type,cid,oid,d,m,y,evt,cidName) {

		var options = {'type':type
						,'cid':cid
						,'oid':oid
						,'d':d
						,'m':m
						,'y':y
						,'evt':evt
						,'cidName':cidName
		}
		var playlist = new Playlist(options); 

	}


}














