var CyloSort =
{
	sort_col:[],//these are put into array so we can have multiple tables on one page.
	max_rows:[],//should be classed up really but didnt predict this problem
	altern8R:[],//should this table use alternate coloured rows
	_page:[],
	old_sort_col:[],
	sort_ord:[],
	default_col_to_sort_by:[],
	keep_id_order:false,
	current_active_table_id:0,//current active table var to keep track of currently used table to access arrays
	reset: function()
	{
		CyloSort.sort_col=[];//these are put into array so we can have multiple tables on one page.
		CyloSort.max_rows=[];//should be classed up really but didnt predict this problem
		CyloSort._page=[];
		CyloSort.old_sort_col=[];
		CyloSort.sort_ord=[];
		CyloSort.default_col_to_sort_by=[];
		CyloSort.current_active_table_id=0;
	},
	Go: function()
	{	
		CyloSort.reset();
		try
		{
			tabs = document.getElementsByTagName("table");
			for(x=0;x<tabs.length;x++)
			{
				if(tabs[x].className.indexOf("CyloSort")>-1)
				{
					if(tabs[x].id==""){tabs[x].id=CyloSort.createUniquID();}
					th = tabs[x].getElementsByTagName("th");
					for(i=0;i<th.length;i++)
					{
						cn = th[i].className;
						if(cn.indexOf("CyloSort")>-1)
						{
							linkID = CyloSort.createUniquID();
							th[i].innerHTML = "<a id='"+linkID+"' style='cursor:pointer;' onclick='CyloSort.Do(\""+tabs[x].id+"\",this,"+i+");'>"+th[i].innerHTML+"</a>";
							if(cn.indexOf("CyloSortTrue")>-1)
							{
								arr = new Array(tabs[x].id,linkID,i);
								CyloSort.default_col_to_sort_by.push(arr);
							}
						}
					}
					if(tabs[x].className.indexOf("altern8")>-1)
					{
						CyloSort.altern8(tabs[x]);
					}
					CyloSort.divide(tabs[x]);
				}

			}
			
			//May have some default coloumns to set
			for(dx=0;dx<CyloSort.default_col_to_sort_by.length;dx++)
			{
				alink=document.getElementById(CyloSort.default_col_to_sort_by[dx][1]);
				CyloSort.Do(CyloSort.default_col_to_sort_by[dx][0],alink,CyloSort.default_col_to_sort_by[dx][2]);
			}
		}
		catch (e)
		{
			alert(e.message);
		}
		
	},
	Do: function(tabid,alink,col)
	{
		th=alink.parentNode;
		CyloSort.current_active_table_id=tabid;
		if(typeof(this.sort_col[tabid])!="undefined")
		{
			this.old_sort_col[tabid]=this.sort_col[tabid];
		}else{
			this.old_sort_col[tabid]="CyloNULL";
		}
		if(typeof(this.sort_ord[tabid])=="undefined")this.sort_ord[tabid]="desc";
		if(typeof(this._page[tabid])=="undefined")this._page[tabid]=1;

		this.sort_col[tabid]=col;
		if(this.old_sort_col[tabid]==this.sort_col[tabid])if(this.sort_ord[tabid] =="desc"){this.sort_ord[tabid]="acs";}else{this.sort_ord[tabid]="desc";}
		
		table=this.getParent(th,"table");
		var rows = new Array();
		tempIDArr=new Array();
		baseRow = CyloSort.getWeatherHasHeaderTag(table);
		tb_l=table.tBodies.length;
		for (k=0;k<tb_l;k++) {
			tbr_l=table.tBodies[k].rows.length;
			for (j=baseRow;j<tbr_l;j++) { 
				rows[j-baseRow] = table.tBodies[k].rows[j];
				if(this.keep_id_order==true)tempIDArr.push(table.tBodies[k].rows[j].id+"");
			}
		}
		CyloSort.showRowsAll(table);
		
		if(th.className.indexOf("CyloSortString")!=-1){rows.sort(this.sortString);}
		if(th.className.indexOf("CyloSortHREF")!=-1){rows.sort(this.sortHREF);}
		if(th.className.indexOf("CyloSortNumber")!=-1){rows.sort(this.sortNumber);}
		if(th.className.indexOf("CyloSortDateUK")!=-1){rows.sort(this.sortDateUK);}
		if(th.className.indexOf("CyloSortDateUS")!=-1){rows.sort(this.sortDateUS);}
		if(th.className.indexOf("CyloSortImageSize")!=-1){rows.sort(this.sortImageSize);}
		if(th.className.indexOf("CyloSortImageSRC")!=-1){rows.sort(this.sortImageSRC);}
		//if(th.className.indexOf("CyloSortColor")!=-1){rows.sort(this.sortColor);}[NI]
		

		//harsh//
		if(this.keep_id_order==true)
		{
			for (k=0;k<tb_l;k++) {
				tbr_l=table.tBodies[k].rows.length;
				for (j=tbr_l-1;j>baseRow;j--) { 
					table.tBodies[k].rows[j].parentNode.removeChild(table.tBodies[k].rows[j]);
				}
			}
		}

		for (i=0; i<rows.length; i++)
		{ 
			table.tBodies[0].appendChild(rows[i]);
		}

		if(this.keep_id_order==true)
		{
			for (k=0;k<tb_l;k++) {
				tbr_l=table.tBodies[k].rows.length;
				for (j=tbr_l-1;j>baseRow;j--) { 
					table.tBodies[k].rows[j].id=tempIDArr[i];
				}
			}
		}
		if(table.className.indexOf("altern8")>-1)
		{
			CyloSort.altern8(table);
		}
		CyloSort.showRows(table.id,CyloSort.max_rows[tabid],CyloSort._page[tabid]);
	},
	sortString: function(a,b)
	{
		
		vC = a.cells[CyloSort.sort_col[CyloSort.current_active_table_id]].innerHTML;
		vN = b.cells[CyloSort.sort_col[CyloSort.current_active_table_id]].innerHTML;
		
		return CyloSort.getOrder(vC.localeCompare(vN));
	},
	sortHREF: function(a,b)
	{
		vC = CyloSort.stripHTML(a.cells[CyloSort.sort_col[CyloSort.current_active_table_id]].innerHTML);
		vN = CyloSort.stripHTML(b.cells[CyloSort.sort_col[CyloSort.current_active_table_id]].innerHTML);
		
		return CyloSort.getOrder(vC.localeCompare(vN));
	},
	sortNumber: function(a,b)
	{
		vC = parseFloat(a.cells[CyloSort.sort_col[CyloSort.current_active_table_id]].innerHTML);
		vN = parseFloat(b.cells[CyloSort.sort_col[CyloSort.current_active_table_id]].innerHTML);
		
		if (vC===""||isNaN(vC)) vC = Number.NEGATIVE_INFINITY;
		if (vN===""||isNaN(vN)) vN = Number.NEGATIVE_INFINITY;
		
		if(vC>vN)return CyloSort.getOrder(1);
		if(vC<vN)return CyloSort.getOrder(-1);
		return 0;
	},
	sortDateUK: function(a,b)
	{
		vC = CyloSort.getUKDate(a.cells[CyloSort.sort_col[CyloSort.current_active_table_id]].innerHTML);
		vN = CyloSort.getUKDate(b.cells[CyloSort.sort_col[CyloSort.current_active_table_id]].innerHTML);
		if(vC>vN)return CyloSort.getOrder(1);
		if(vC<vN)return CyloSort.getOrder(-1);
		return 0;
	},
	sortDateUS: function(table,col)
	{
		vC = CyloSort.getUSDate(a.cells[CyloSort.sort_col[CyloSort.current_active_table_id]].innerHTML);
		vN = CyloSort.getUSDate(b.cells[CyloSort.sort_col[CyloSort.current_active_table_id]].innerHTML);
		if(vC>vN)return CyloSort.getOrder(1);
		if(vC<vN)return CyloSort.getOrder(-1);
		return 0;
	},
	sortImageSize: function(a,b)
	{
		vC = a.cells[CyloSort.sort_col[CyloSort.current_active_table_id]].getElementsByTagName("img");
		if(vC.length>0)
		{
			vC = vC[0].offsetWidth * vC[0].offsetHeight;
		}else{
			 vC = Number.NEGATIVE_INFINITY;
		}
		vN = b.cells[CyloSort.sort_col[CyloSort.current_active_table_id]].getElementsByTagName("img");
		if(vN.length>0)
		{
			vN = vN[0].offsetWidth * vN[0].offsetHeight;
		}else{
			 vN = Number.NEGATIVE_INFINITY;
		}
		if(vC>vN)return CyloSort.getOrder(1);
		if(vC<vN)return CyloSort.getOrder(-1);
		return 0;
	},
	sortImageSRC: function(a,b)
	{
		vC = a.cells[CyloSort.sort_col[CyloSort.current_active_table_id]].getElementsByTagName("img");
		if(vC.length>0)
		{
			vC = vC[0].src;
		}else{
			 vC = "";
		}
		vN = b.cells[CyloSort.sort_col[CyloSort.current_active_table_id]].getElementsByTagName("img");
		if(vN.length>0)
		{
			vN = vN[0].src
		}else{
			 vN = "";
		}
		return CyloSort.getOrder(vC.localeCompare(vN));
	},
	getUKDate: function(d)
	{
		day=0,month=0,year=0;
		if(d.indexOf("/")>-1)
		{
			shev1 = d.indexOf("/");
			shev2 = d.lastIndexOf("/");
			day=d.substring(0,shev1);
			month=d.substring(shev1+1,shev2);
			year=d.substring(shev2+1);
		}else if(d.indexOf("-")>-1)
		{
			shev1 = d.indexOf("-");
			shev2 = d.lastIndexOf("-");
			day=d.substring(0,shev1);
			month=d.substring(shev1+1,shev2);
			year=d.substring(shev2+1);
		}else if(d.indexOf(" ")>-1)
		{
			//11 January,  1979
			day = d.substring(0,d.indexOf(" "));
			day=CyloSort.trim(day);
			if(d.indexOf(",")>-1)
			{
				month = d.substring(d.indexOf(" ")+1,d.indexOf(","))
			}else{
				month = d.substring(d.indexOf(" ")+1,d.lastIndexOf(" "))
			}
			month = CyloSort.getMonth(month);
			year = d.substring(d.lastIndexOf(" ")+1);
			day=CyloSort.clearInd(day);
		}
		year=CyloSort.addZero(CyloSort.trim(year));
		month=CyloSort.addZero(CyloSort.trim(month));
		day=CyloSort.addZero(CyloSort.trim(day));
		
		_d = year+""+month+""+day;_d++;_d--;
		return _d;
	},
	getUSDate: function(d)
	{
		day=0,month=0,year=0;
		if(d.indexOf("/")>-1)
		{
			shev1 = d.indexOf("/");
			shev2 = d.lastIndexOf("/");
			month=d.substring(0,shev1);
			day=d.substring(shev1+1,shev2);
			year=d.substring(shev2+1);
		}else if(d.indexOf("-")>-1)
		{
			shev1 = d.indexOf("-");
			shev2 = d.lastIndexOf("-");
			month=d.substring(0,shev1);
			day=d.substring(shev1+1,shev2);
			year=d.substring(shev2+1);
		}else if(d.indexOf(" ")>-1)
		{
			//January 11, 1979
			month = d.substring(0,d.indexOf(" "));
			month = CyloSort.getMonth(month);
			if(d.indexOf(",")>-1)
			{
				day = d.substring(d.indexOf(" "),d.lastIndexOf(","));
			}else{
				day = d.substring(d.indexOf(" "),d.lastIndexOf(" "));
			}
			day=CyloSort.trim(day);
			day=CyloSort.clearInd(day);
			year = d.substring(d.lastIndexOf(" ")+1);
		}
		year=CyloSort.addZero(CyloSort.trim(year));
		month=CyloSort.addZero(CyloSort.trim(month));
		day=CyloSort.addZero(CyloSort.trim(day));
		_d = year+""+month+""+day;_d++;_d--;
		return _d;
	},
	getMonth: function(m)
	{
		m=m.toLowerCase();
		switch(m)
		{
			case"january":
			case"jan":return "01";
			case"february":
			case"feb":return "02";
			case"march":
			case"mar":return "03";
			case"april":
			case"apr":return "04";
			case"may":return "05";
			case"june":
			case"jun":return "06";
			case"july":
			case"jul":return "07";
			case"august":
			case"aug":return "08";
			case"september":
			case"sep":return "09";
			case"october":
			case"oct":return "10";
			case"november":
			case"nov":return "11";
			case"december":
			case"dec":return "12";
		}
		return m;
	},
	addZero: function(v)
	{
		v = v + "";
		l = v.length;
		if(l<2)
			v = "0"+v;
		return v;
	},
	getOrder: function(n)
	{
		if(CyloSort.sort_ord[CyloSort.current_active_table_id]&&CyloSort.sort_ord[CyloSort.current_active_table_id]=="acs")
		{
			if(n!=0)
			(n=-n)
		}
		return n;
	},	
	getParent: function(el, tag)
	{
		if (el == null) {
			return null;
		} else if (el.nodeType == 1 && el.tagName.toLowerCase() == tag.toLowerCase()) {
			return el;
		} else {
			return this.getParent(el.parentNode, tag);
		}
	},
	getWeatherHasHeaderTag: function(t)
	{	
		s = t.innerHTML;
		s=s.toLowerCase();
		if(s.indexOf("<thead>")>-1)
		{
			
			return 0;
		}else{
			
			return 1;
		}
		
	},
	isHex: function(h)
	{
		ok="0123456789abcdef";
		h+="";
		h=h.toLowerCase();
		for(i=0;i<h.length;i++)
		{
			if(ok.indexOf(h.charAt(i))==-1)return false;
		}
		return true;
	},
	stripHTML: function(g)
	{
		var re= /<\S[^><]*>/g
		g=g.replace(re, "");
		return g
	},
	
	replaceAll: function(str,from,to)
	{ 
		var idx = str.indexOf( from ); while ( idx > -1 ) { str = str.replace( from, to ); idx = str.indexOf( from );}
		return str;
	},
	trim: function( v )
	{	
		v=v+"";
		return CyloSort.lTrim(CyloSort.rTrim(v));
	},

	lTrim: function( v )
	{
		v=v+"";
		var re = /\s*((\S+\s*)*)/; return v.replace(re, "$1");
	},
	
	rTrim: function( v )
	{ 
		v=v+"";
		var re = /((\s*\S+)*)\s*/; return v.replace(re, "$1");
	},
	clearInd: function(d)
	{
		d=d.toLowerCase();
		d = CyloSort.replaceAll(d,"st","");
		d = CyloSort.replaceAll(d,"nd","");
		d = CyloSort.replaceAll(d,"rd","");
		d = CyloSort.replaceAll(d,"th","");
		return d;		
	},
	altern8: function(t)
	{
		var tb = t.getElementsByTagName("tbody");
		
		for (var i = 0; i < tb.length; i++)
		{
			var tr = tb[i].getElementsByTagName("tr");
			trlen=tr.length;
			f = t.getElementsByTagName("tfooter");
			trlen=trlen-f.length;
			
			//baseRow = CyloSort.getWeatherHasHeaderTag(t);

			for (var x=1;x<trlen;x++)//dont want to do the header or footer
			{
				nc = "CyloOdd";
				if ( (x % 2) == 0  )
				{
					nc = "CyloEven";
				}
				cn = tr[x].className;
				
				cn = CyloSort.replaceAll(cn,"CyloEven","");
				cn = CyloSort.replaceAll(cn,"CyloOdd","");
				cn += " "+nc;
				
				tr[x].className = cn;
			}
		}
	},
	divide: function(t)
	{
		CyloSort._page[t.id]=1;
		cn = t.className;
		if(cn.indexOf("CyloSort[")>-1)
		{
			limitRows = cn.substring(cn.indexOf("CyloSort[")+9);
			limitRows = limitRows.substring(0,limitRows.indexOf("]"));
			
			var tb = t.getElementsByTagName("tbody");
			var tr = tb[0].getElementsByTagName("tr");
			tr_l=tr.length;
			if(isNaN(limitRows)==false)
			{
				if(tr_l>limitRows)
				{
					
					CyloSort.max_rows[t.id]=limitRows;
					limitDiv="<div id='CyloPaginationDiv"+t.id+"'>Page: <a id='CyloSPage"+t.id+"1' class='CyloSortPageLink' onclick='CyloSort.showRows(\""+t.id+"\",\""+limitRows+"\",\""+1+"\");'>["+1+"]</a>";
					miniC=0;
					page=2;
					
					doneOne=false;
					for (var x=limitRows;x<tr_l;x++)
					{
						if(doneOne==false)
						{
							x++;
							doneOne=true;
						}
						tr[x].style.display='none';
						miniC++;
						if(miniC==limitRows)
						{
							limitDiv+=" <a id='CyloSPage"+t.id+""+page+"' class='CyloSortPageLink' onclick='CyloSort.showRows(\""+t.id+"\",\""+limitRows+"\",\""+page+"\");'>"+page+"</a>";
							miniC=0;
							page++;
						}
					}
					//catch final rows
					if(miniC>0)
					{
						limitDiv+=" <a id='CyloSPage"+t.id+""+page+"' class='CyloSortPageLink' onclick='CyloSort.showRows(\""+t.id+"\",\""+limitRows+"\",\""+page+"\");'>"+page+"</a>";
					}
					limitDiv+="</div>";
					//UPDATE 08/01/2009
					tspan=document.createElement("span");
					tspan.innerHTML=limitDiv;
					if(t.nextSibling)
					{
						ns=t.nextSibling;
						ns.parentNode.insertBefore(tspan, ns.nextSibling);
					}else{
						t.parentNode.appendChild(tspan);
					}
				}
			}
		}	
	},
	showRows: function(t,max_rows,p)
	{
		if(typeof(max_rows)=="undefined")return 0;
		cpd=document.getElementById("CyloPaginationDiv"+t).innerHTML;
		cpd=CyloSort.replaceAll(cpd,"[","");
		cpd=CyloSort.replaceAll(cpd,"]","");
		document.getElementById("CyloPaginationDiv"+t).innerHTML=cpd;
		//CyloSort.max_rows=max_rows;
		CyloSort._page[t]=p;
		document.getElementById("CyloSPage"+t+""+p).innerHTML="["+p+"]";
		t=document.getElementById(t);
		var tb = t.getElementsByTagName("tbody");
		var tr = tb[0].getElementsByTagName("tr");
		baseRow = CyloSort.getWeatherHasHeaderTag(t);
		tr_l=tr.length;
		for (var x=baseRow;x<tr_l;x++)//dont want to do the header
		{
			if(x >= ((p-1)*max_rows) && x < (p*max_rows))
			{
				tr[x].style.display='';
			}else{
				tr[x].style.display='none';
			}
		}
		
	},
	showRowsAll: function(t)
	{
		var tb = t.getElementsByTagName("tbody");
		var tr = tb[0].getElementsByTagName("tr");
		tr_l=tr.length;
		for (var x=0;x<tr_l;x++)//dont want to do the header
		{
			tr[x].style.display='';
		}
	},
	createUniquID: function()
	{
		exists = 1;
		while(exists>0)
		{
			var chars = "abcdefghiklmnopqrstuvwxyzCYLO";
			var string_length = 15;
			var randomstring = '';
			
			for (var i=0; i<string_length; i++)
			{
				var rnum = Math.floor(Math.random() * chars.length);
				randomstring += chars.substring(rnum,rnum+1);
			}
			
			if(document.getElementById(randomstring)){}
			else
			{	
				exists =-1;
				return randomstring;
			}
		}
	}
};
