var today=new Date()
var thd=today.getDate();
var thm=today.getMonth()+1;
var thy=today.getFullYear();
var todaycode=eN(thy,thm,thd);
var curDate=todaycode;
events=events.concat(gigs);
events.sort(sortByDate);

var arMon=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
var arDays=["Saturdays","Sundays","Mondays","Tuesdays","Wednesdays","Thursdays","Friday"];
var arDaysInMon=[31,0,31,30,31,30,31,31,30,31,30,31];
arDaysInMon[1]=(((thy%100!=0)&&(thy%4==0))||(thy%400==0))?29:28;

var stR=todaycode,stQ="",iDay=(today.getDay()+1)%7,stV="";

var arID=[],arRange=[],arInd=[];

var qv="";
var arTags=["music","exhibition","theatre","culture","kids","art"];
var arTagged=[];

function ge(objID) {return document.getElementById(objID);}

function cleanup(clv){
	return clv.replace(/(<([^>]+)>)/ig,"");
	}

function sortByDate(a,b){
	var x=parseInt(a[1],10), y=parseInt(b[1],10);
	return ((x<y)?-1:(x>y)?1:0);
	}

function arGot(arIn,val,idx){ // check if an array contains the value...
//alert("arGot("+val+","+idx+")");
	val=val.toString().toLowerCase();
	var arGG=[];
	if (idx>-1) {for (tp in arIn) {if (arIn[tp][idx].toString().toLowerCase().indexOf(val)!=-1) arGG.push(tp);}}
	else {for (tp in arIn) {if (arIn[tp].toString().toLowerCase().indexOf(val)!=-1) arGG.push(tp);}}
	return arGG;
	}

function tSw(g) { // toggle / switch more info
	tOn(g);
	tOff(9000+g);
}

function tOn(g) { // toggle On by ID
	var tg=eval("'tog"+g+"'");
	if (!ge(tg)) return;
	var style2 = ge(tg).style;
	style2.display = "block";
}

function tOff(g) { // toggle Off by ID
	var tg=eval("'tog"+g+"'");
	if (!ge(tg)) return;
	var style2 = ge(tg).style;
	style2.display = "none";
}

function prettyDate(datelist,inclyr) {
	noyr=(inclyr)?inclyr:1;
	datelist+="";
	if (datelist<8) {
		return arDays[datelist];
		}
	if (datelist.indexOf("200")==-1) return datelist;
	if (datelist==todaycode) return "Today";
	dc=datelist.split(",");
	var sz="", curyr=0, curmt=0, arDN=[];
	for (t=0;t<dc.length;t++) {
	var dz="", mz="", yz="", dz2="", mz2="", yz2="", started=false, past=false;
		arDN=dN(dc[t]);
		curyr=(arDN[0]==0)?curyr:arDN[0];
		curmt=(arDN[1]==0)?curmt:arDN[1];
		arDN[0]=curyr;
		arDN[1]=curmt;
		yz=" "+curyr;
		mz=" "+arMon[(curmt-1)];
		dz=""+arDN[2]+daySuffix(arDN[2]);
		if ((eN(arDN[0],arDN[1],arDN[2])<todaycode)&&(inclyr!=0)) started=true;
		if (arDN.length>3) {
			arDN[3]=(arDN[3]==0)?curyr:arDN[3];
			arDN[4]=(arDN[4]==0)?curmt:arDN[4];
			yz2=" "+arDN[3];
			yz=(yz==yz2)?"":yz;
			mz2=" "+arMon[(arDN[4]-1)];
			mz=(mz==mz2)?"":mz;
			dz2=""+arDN[5]+daySuffix(arDN[5]);
			}
		if (t<dc.length-1) {
			dndc=dN(dc[t+1]);
			if (yz!="") {
				if ((dndc[0]==0)||(dndc[0]==arDN[0])) {yz="";mz+=", ";}
				else yz+=", ";
				}
			if (yz2!="") {
				if ((dndc[0]==0)||(dndc[0]==arDN[3])) {yz2="";mz2+=", ";}
				else yz2+=", ";
				}
			if ((dndc[1]==0)||(dndc[1]==arDN[1])) {mz="";dz+="+";}
			}
		if (inclyr==0) {yz="";yz2="";};
		sz+=dz+mz+yz;
		sz+=(dz2=="")?"":"-"+dz2+mz2+yz2;
		}
	return sz;
	}

// Thanks to Brian @ frequency-decoder.com for this one:
function daySuffix(d) {
    d = ""+d;
    return d.substr(-(Math.min(d.length, 2))) > 3 && d.substr(-(Math.min(d.length, 2))) < 21 ? "th" : ["th", "st", "nd", "rd", "th"][Math.min(Number(d)%10, 4)];
}



function dN(dcc){ // split datecode into parts... using modulus + remainders
	var n=0, idy=0, imn=0, iyr=0, arO=[], arN=dcc.toString().split("-");
	for (nx in arN) {
		n=parseInt(arN[nx],10);
		idy=n%100;
		iyr=n-n%10000;
		imn=n-iyr-idy;
		arO.push(iyr/10000,imn/100,idy)
		}
	return arO;
	}

function eN(iyr,imn,idy){ // join datecode parts into single number... using modulus + remainders
	return (iyr*10000+imn*100+idy);
	}

function inDate(xxx) {
	var arEv=[];
 	for(y in events) {
		var arD=events[y][1].split(",");
		for (z in arD) {
			if (xxx==arD[z]) arEv.push(y);
			else {
				if (arD[z].indexOf("-")!=-1) { //expand date range
					ddd=arD[z].split("-");
					ddd0=dN(ddd[0]);
					if (ddd[1]<100) ddd[1]=parseInt(ddd[1],10)+ddd0[1]*100;
					if (ddd[1]<10000) ddd[1]=parseInt(ddd[1],10)+ddd0[0]*10000;
					if ((xxx>=ddd[0])&&(xxx<=ddd[1])) arEv.push(y);
					}
				}
			}
		}
	if (arEv.length>0) return arEv;
}


function showSumm(divv,wh,aRR,pix) {
	if (!ge(divv)||!wh) return;
	var l=[];
	for (k in wh) {
		if (k>50) break;
		wx=parseInt(wh[k],10);
		if (aRR[wx]) {
			l.push("<div  style='float:left;clear:left;'><nobr><a target='_top' href='http://whatson.indundee.co.uk/?q="+cleanup(aRR[wx][0])+"&+gigs'>");
				if (pix&&aRR[wx][3]!="") {
					var arpx=aRR[wx][3].split(",");
					l.push("<span><img style='border:0;height:25px;width:25px;margin-right:2px;vertical-align:middle;' src='http://www.cadmin.pwp.blueyonder.co.uk/id/photos/"+arpx[0]+".jpg'>");
					}
			l.push(cleanup(aRR[wx][0]));
			if(pix)l.push(" ["+prettyDate(aRR[wx][1])+"]</span>");
			l.push("</a></nobr></div>");
			}
		}
	if (l=="") l=["No matches...<br>Try another word."];
	ge(divv).innerHTML=l.join("");
	}

function updatecal(inc) {
	var mnow=today.getMonth()+1;
	var ynow=today.getFullYear();
	if (inc==0) {thm=mnow;thy=ynow;}
	else {
		thm+=inc;
		if (thm>12) {thm=1;thy++;}
		if (thm<1) {thm=12;thy--;}
		if ((thy*100+thm)==ynow*100+mnow) buildCal(eN(thy,thm,thd));
		else if ((thy*100+thm)>=ynow*100+mnow) buildCal(eN(thy,thm,1));
		else {thm=mnow;thy=ynow;}
		}
	}

function iDsrch() {
	var q=ge("srchtxt").value;
	if (ge("srchsmmry")||ge("srchsmmrypics")) stR="";
	stQ=q;
	if ((q.length>0)&&(q!=qv)) {
		getResults(stR,stQ,0,stV);
		qv=q;
		}
	}

function getResults(drng,qs,tag,ven) {
//alert("getResults("+drng+","+qs+","+tag+","+ven+")");
	var sd="",comp1,comp2,hitz=0,gcd=[],hd=1,thisdate=0;
	drng+="";
	var arInd1=[],arInd2=[],arDrng=drng.split("-");
	arInd.length=0;
	stR=drng;
	stQ=qs;
	stV=ven;
	if (ge("srchtxt")) ge("srchtxt").value=qs;
	if (ge("venu")) {if (ven=="") {ge("venu").selectedIndex=0;}}
	if (drng=="") {
		if (ge("dtrange")) ge("dtrange").disabled=true;
		for (t in events) {
			thisdate=(events[t][1].indexOf("-")==-1)?events[t][1]:events[t][1].substring(events[t][1].indexOf("-")+1);
			if (parseInt(thisdate,10)>=todaycode) arInd1[t]=t;
			}
		hd=0;
		if (ge("togcal")) buildCal(todaycode);
		}
	else {
		if (ge("dtrange")) {
			ge("dtrange").disabled=false;
			ge("dtrange").value=prettyDate(stR).replace(/(<([^>]+)>)/ig,"");
			}
		var i1=(parseInt(arDrng[0],10)>todaycode)?arDrng[0]:todaycode;
		var i2=(arDrng.length>1)?arDrng[1]:i1;
		curDate=i1;
		arRange=(i2==i1)?[i1]:getRange(i1,i2);
		if (i1==todaycode) updatecal(0);
		if (ge("togcal")) buildCal(i1,i2);
		}
	if (hd==1) {
		if (i2==i1) {arInd1=inDate(i1);}
		else {
			for (t in arRange) {
				arST=inDate(arRange[t]);
				for (qx in arST) {if (arGot(arInd1,arST[qx]).length==0) arInd1.push(arST[qx]);}
				}
			}
		}
	for (w in events) {
		var gplu=0,gmin=0,gtag=0,plmi=1,thisvenue=events[w][5];
		var gven=(ven=="")?1:0;
		var evtags=events[w][9].split(",");
		comp1=cleanup((events[w][0]+events[w][1]+events[w][5]+events[w][6]+events[w][9]+events[w][10]).toLowerCase());
		if (tag!=0) comp1=events[w][9].toLowerCase();
		comp2=qs.toLowerCase();
		var foundit=comp1.indexOf(comp2);
		if (ge("srchsmmry")||ge("srchsmmrypics")) gtag=1;
		if (foundit!=-1) {
			gplu+=(plmi==1)?1:0;
			gmin+=(plmi==-1)?1:0;
			gven+=(thisvenue==ven)?1:0;
			for (qa in evtags) {gtag+=(arGot(arTagged,"+"+evtags[qa]).length>0)?1:0;}
			}
		if (gplu>0&&gmin==0&&gtag>0&&gven>0&&(arGot(arInd2,w).length==0)) arInd2.push(w);
		}
	for (p1 in arInd1) {
		for (p2 in arInd2) {
			if (arInd1[p1]==arInd2[p2]) {
				if (parseInt(events[arInd1[p1]][1])==stR) {arInd.unshift(arInd1[p1]);}
				else {arInd.push(arInd1[p1]);}
				}
			}
		}
	if(ge("srchsmmry"))showSumm("srchsmmry",arInd,events,false);
	if(ge("srchsmmrypics"))showSumm("srchsmmrypics",arInd,events,true);
	hitz=arInd.length;
	sd+=hitz;
	sd+=(hitz==0)?" hits: try another search":(hitz==1)?" lonely hit":" hits";
	if (ge("filter")) ge("filter").innerHTML=sd;
	}

function getRange(datecode,dc2) {
	var arG=[],d=dN(datecode);
	arG.push(datecode);
	if (dc2<100) dc2=parseInt(dc2,10)+d[1]*100;
	if (dc2<10000) dc2=parseInt(dc2,10)+d[0]*10000;
	while (arG[arG.length-1]<dc2) {
		datecode++;
		if (datecode>thmtot(datecode)) datecode=nxtmon(datecode);
		arG.push(datecode);
		}
	return arG;
	}
