var Accordion = new Class({
						// Constants
						SUBJECT:			0,
						TOPIC:				1,
						TITLE:				2,
						
						SUBJECT_WINDOW:		7,
						TOPIC_WINDOW:		18,
						TITLE_WINDOW:		18,
						
						SUBJECT_COLLAPSED:	55,
						TOPIC_COLLAPSED:	50,
						TITLE_COLLAPSED:	50,
						
						SUBJECT_EXPANDED:	880,
						TOPIC_EXPANDED:		875,
						TITLE_EXPANDED:		875,
						
						CHANGE_SUBJECT: 	true,
						CHANGE_TOPIC: 		true,
						NO_CHANGE_SUBJECT: 	false,
						NO_CHANGE_TOPIC: 	false,
						
						OFF: 				false,
						ON: 				true,

						// Accordion Depth
						iMode:				this.SUBJECT,
						iMaxDepth:			this.SUBJECT,
						
						// Current Paging
						iSubjectPage: 		0,
						iTopicPage:			0,
						iTitlePage:			0,
						
						iSubjectMax:		0,
						arrTopicMax:		null,
						arrTitleMax:		null,
						
						iSubjectMaxPage:	0,
						arrTopicMaxPage:	null,
						arrTitleMaxPage:	null,
						
						// Names of subjects and topics
						strSubject:			null,
						strTopic:			null,
						
						// Request Times
						iLastRequestTime:	null,
						
						// Cache of results
						arrSubjects:		null,
						arrTopics:			null,
						arrTitles:			null,
						
						arrSubjectRealNames:null,
						arrTopicRealNames:	null,
						arrTopicPrices:		null,
						arrTopicIDs:		null,
						
						strCurrentHash: 	null,
						__history:			null,
						
						checkHash: function()
						{
							var strHistoryHash	= this.strCurrentHash;
							
							if(this._isIE())
							{
								//var regHistoryHash	= /subjects\/browse-history(.*)/i;
								//var arrHistoryHash	= regHistoryHash.exec(this.__history.contentWindow.location);
							
								//if(arrHistoryHash && arrHistoryHash.length == 2)
									//strHistoryHash	= arrHistoryHash[1];
							}
							else
							{
								var regHistoryHash	= /\#(.*)/;
								var arrHistoryHash	= regHistoryHash.exec(document.location);
							
								if(arrHistoryHash && arrHistoryHash.length == 2)
									strHistoryHash	= arrHistoryHash[1];
								
							}
							
							if(this.strCurrentHash != strHistoryHash)
							{
								this.strCurrentHash = strHistoryHash;
								
								var strCurSubject	= this.strSubject;
								var strCurTopic		= this.strTopic;
								var strNewSubject	= strCurSubject;
								var strNewTopic		= strCurTopic;
								
								var iCurSubjectPage	= this.iSubjectPage;
								var iCurTopicPage	= this.iTopicPage;
								var iCurTitlePage	= this.iTitlePage;
								var iNewSubjectPage	= iCurSubjectPage;
								var iNewTopicPage	= iCurTopicPage;
								var iNewTitlePage	= iCurTitlePage;
								
								// work out what's changed
								var regAnchor		= /^\/?([^\/]*)\/?([^\/]*)/;
								var regQueryString	= /^[^\?]*\?(.*)/;
								var arrAnchorParts	= regAnchor.exec(this.strCurrentHash.replace(/\?.*/, ""));
								var arrQueryString 	= regQueryString.exec(this.strCurrentHash);
								
								if(arrAnchorParts && arrAnchorParts.length >= 2)
									strNewSubject = arrAnchorParts[1];
								
								if(arrAnchorParts && arrAnchorParts.length >= 3)
									strNewTopic = arrAnchorParts[2];
									
								if(arrQueryString && arrQueryString.length >= 2)
									strNewQuery = arrQueryString[1];
								
								if(!arrAnchorParts)
								{
									strNewSubject = "";
									strNewTopic = "";
								}
								
								if(!arrQueryString)
								{
									iNewSubjectPage 	= 0;
									iNewTopicPage 		= 0;
									iNewTitlePage 		= 0;
								}
								else
								{
									var arrTypes		= new Array("subject", "topic", "title");
								
									for(var type = 0; type < arrTypes.length; type++)
									{
										var regSubjectPage = new RegExp("(?:^|&)"+arrTypes[type]+"-page=([0-9]+)", "i");
									
										// we need to parse the query string
										if(strNewQuery.test(regSubjectPage))
										{
											var arrQueryString = regSubjectPage.exec(strNewQuery);
											if(arrQueryString.length == 2)
											{
												var iPageNum = arrQueryString[1];
												
												switch(type)
												{
													case this.SUBJECT:	iNewSubjectPage = iPageNum;
																		break;
													case this.TOPIC:	iNewTopicPage = iPageNum;
																		break;
													case this.TITLE:	iNewTitlePage = iPageNum;
																		break;
												}
											}
										}
										else
										{
											switch(type)
											{
												case this.SUBJECT:	iNewSubjectPage = 0;
																	break;
												case this.TOPIC:	iNewTopicPage = 0;
																	break;
												case this.TITLE:	iNewTitlePage = 0;
																	break;
											}
										}
									}
								}
								
								var bChanged = false;
							
								// go to the correct place
								if(strNewSubject == "" && strNewTopic == "" && (strNewSubject != strCurSubject || strNewTopic != strCurTopic))
								{
									this.strSubject = "";
									this.strTopic 	= "";
									this.goto(this.SUBJECT);
									bChanged 		= true;
								}
								
								if(strNewSubject != "" && (strNewSubject != strCurSubject))
								{
									this.strSubject = strNewSubject;
									this.setMaxDepth(this.TOPIC);
									this.goto(this.TOPIC, "subject_"+this.strSubject, this.CHANGE_SUBJECT, this.NO_CHANGE_TOPIC, this.iTopicPage);
									bChanged		= true;
								}
								
								if(strNewTopic != strCurTopic)
								{
									if(strNewTopic != "")
									{
										this.strTopic 	= strNewTopic;
										this.setMaxDepth(this.TITLE);
										this.goto(this.TITLE, "topic_"+this.strTopic, this.NO_CHANGE_SUBJECT, this.CHANGE_TOPIC, this.iTopicPage, this.iTitlePage);
									}
									else
									{
										this.strSubject = strNewSubject;
										this.setMaxDepth(this.TOPIC);
										this.goto(this.TOPIC, "subject_"+this.strSubject, this.CHANGE_SUBJECT, this.NO_CHANGE_TOPIC, this.iTopicPage);
									}
									bChanged = true;
								}
								
								// if we've not done any change but we've noted
								// a change in the paging numbers for the subject, topic
								// or title then we need to enact that change
								if(!bChanged && (iNewSubjectPage != iCurSubjectPage || iNewTopicPage != iCurTopicPage || iNewTitlePage != iCurTitlePage))
								{
									if(iNewSubjectPage != iCurSubjectPage)
										this.setSubjectPage("subject_page_"+iNewSubjectPage);
									
									if(iNewTopicPage != iCurTopicPage)
										this.setTopicPage("topic_page_"+iNewTopicPage);
									
									if(iNewTitlePage != iCurTitlePage)
										this.setTitlePage("title_page_"+iNewTitlePage);
								}
								
								if(this._isIE())
								{
									this.setDocumentAnchor(true);
								}
							}
						},
						  
						// constructor
						initialize: function()
						{
							var bTextOnly = Cookie.read('TextOnly');
							
							if(bTextOnly != "Yes")
							{
								/*if(this._isIE())
								{
									this.__history				= new Element('iframe');
									this.__history.addClass('hidden');
									this.__history.setAttribute('src', '/subjects/history/');
									this.__history.setAttribute('width', '200');
									this.__history.setAttribute('height', '200');
									this.__history.setAttribute('id', 'browse_history');
									
									if($('site'))
										$('site').adopt(this.__history);
								}*/
								
								this.strCurrentHash			= window.location.hash;
								
								// instantiate local vars
								this.arrSubjects			= new Array();
								this.arrTopics				= new Array();
								this.arrTitles				= new Array();
								
								this.arrTopicMax			= new Array();
								this.arrTitleMax			= new Array();
								
								this.arrTopicMaxPage		= new Array();
								this.arrTitleMaxPage		= new Array();
								
								this.arrSubjectRealNames	= new Array();
								this.arrTopicRealNames		= new Array();
								this.arrTopicPrices			= new Array();
								this.arrTopicIDs			= new Array();
								
								this.strSubject				= "";
								this.strTopic				= "";
								
								// get the links
								var aSubjectLink			= $('lnk_subject');
								var aTopicLink				= $('lnk_topic');
								var aTitleLink				= $('lnk_title');
								
								// if we found the subject link 
								if(aSubjectLink)
								{
									// set it to hidden if it isn't already
									if(!aSubjectLink.hasClass('hidden'))
										aSubjectLink.addClass('hidden');
									
									// disable it
									this._disableLink(aSubjectLink);
									
									// add our own callback function
									aSubjectLink.addEvent('click',function(evt)
																  {
																	  this.addClass('hidden');
																	  accordion.goto(accordion.SUBJECT, this.id);
																	  accordion.setDocumentAnchor();
																  });
								}
								
								// if we found our topic link
								if(aTopicLink)
								{
									// set it to hidden if it isn't already
									if(!aTopicLink.hasClass('hidden'))
										aTopicLink.addClass('hidden');
									
									// disable it
									this._disableLink(aTopicLink);
									
									// add our own callback function
									aTopicLink.addEvent('click',	function(evt)
																	{
																		accordion.goto(accordion.TOPIC, this.id);
																		accordion.setDocumentAnchor();
																	});
								}
								
								// if we found our title link
								if(aTitleLink)
								{
									// set it to hidden if it isn't already
									aTitleLink.addClass('hidden');
									
									// disable it
									this._disableLink(aTitleLink);
									
									// add our own callback function
									aTitleLink.addEvent('click',	function(evt)
																	{
																		accordion.goto(accordion.TITLE, this.id);
																		accordion.setDocumentAnchor();
																	});
								}
								
								// get all the subject links
								var arrSubjects 	= $$('#subjectholder a');
								
								// go through each
								for(var i = 0; i < arrSubjects.length; i++)
								{
									// disable the link
									this._disableLink(arrSubjects[i]);
									
									// assign a new behaviour
									arrSubjects[i].addEvent('click',  function(evt)
																	  {
																			accordion.setMaxDepth(accordion.TOPIC);
																			accordion.goto(accordion.TOPIC, this.id, accordion.CHANGE_SUBJECT);
																			accordion.setDocumentAnchor();
																	  });
								}
								
								// get all the subject links
								var arrTopics 	= $$('#topicholder a');
								
								// go through each
								for(var i = 0; i < arrTopics.length; i++)
								{
									// disable the link
									this._disableLink(arrTopics[i]);
									
									// assign a new behaviour
									arrTopics[i].addEvent('click',    function(evt)
																	  {
																			accordion.setMaxDepth(accordion.TITLE);
																			accordion.goto(accordion.TITLE, this.id);
																			accordion.setDocumentAnchor();
																	  });
								}
								
								var aTopicSubject			= $('lnk_topic_subjects');
								if(aTopicSubject)
								{
									this._disableLink(aTopicSubject);
									
									aTopicSubject.addEvent('click', function(evt)
																	{
																		accordion.goto(accordion.SUBJECT);
																		accordion.setDocumentAnchor();
																	});
								}
								
								var aTitleSubject			= $('lnk_title_subjects');
								var aTitleTopic				= $('lnk_title_topics');
								if(aTitleSubject && aTitleTopic)
								{
									this._disableLink(aTitleSubject);
									this._disableLink(aTitleTopic);
									
									aTitleSubject.addEvent('click', function(evt)
																	{
																		accordion.goto(accordion.SUBJECT);
																		accordion.setDocumentAnchor();
																	});
									
									aTitleTopic.addEvent('click', 	function(evt)
																	{
																		accordion.goto(accordion.TOPIC);
																		accordion.setDocumentAnchor();
																	});
								}
								
								// get the subject holder
								var divSubjectHolder 	= $('subjectholder');
								var arrPaging			= $$('#subjectwrapper .paging');
								
								// if we have the paging
								if(arrPaging.length)
								{
									var divPaging = arrPaging[0];
									divPaging.empty();
								}
								
								// if we have it, clear it
								if(divSubjectHolder)
								{
									divSubjectHolder.empty();
									divSubjectHolder.set('tween', {duration:200});
									divSubjectHolder.set('opacity', 0);
								}
								
								var divSubjectWrapper	= $('subjectwrapper');
								var divTopicWrapper		= $('topicwrapper');
								var divTitleWrapper		= $('titlewrapper');
								
								if(divSubjectWrapper && divTopicWrapper && divTitleWrapper)
								{
									divTopicWrapper.addClass('rightpinned');
									
									var iSubjectWrapperWidth 	= divSubjectWrapper.getStyle('width').toInt();
									var iTopicWrapperWidth 		= divTopicWrapper.getStyle('width').toInt();
									var iTitleWrapperWidth 		= divTitleWrapper.getStyle('width').toInt();
									
									divSubjectWrapper.set('tween', 	{transition: Fx.Transitions.Expo.easeInOut, duration: 230,
																	 onComplete: function()
																	 {
																		if(accordion)
																		{
																			accordion.toggleHolders(accordion.ON);
																			//accordion.setDocumentAnchor();
																		}
																		
																	 }});
									
									divTopicWrapper.set('tween', 	{transition: Fx.Transitions.Expo.easeInOut, duration: 230,
																	 onComplete: function()
																	 {
																		if(accordion)
																		{
																			accordion.toggleHolders(accordion.ON);
																			//accordion.setDocumentAnchor();
																		}
																	 }});
									
									divTitleWrapper.set('tween', 	{transition: Fx.Transitions.Expo.easeInOut, duration: 230,
																	 onComplete: function()
																	 {
																		if(accordion)
																		{
																			accordion.toggleHolders(accordion.ON);
																			//accordion.setDocumentAnchor();
																		}
																	 }
																	 });
								
									// finally set the topic to be active
									// and the title to be inactive
									/*divSubjectWrapper.setStyle('width', iSubjectWrapperWidth+'px');
									divTopicWrapper.setStyle('width', iTopicWrapperWidth+'px');
									divTitleWrapper.setStyle('width', iTitleWrapperWidth+'px');
									
									divSubjectWrapper.tween('width', [iSubjectWrapperWidth, this.SUBJECT_EXPANDED]);
									divTopicWrapper.tween('width', [iTopicWrapperWidth, this.TOPIC_COLLAPSED]);
									divTitleWrapper.tween('width', [iTitleWrapperWidth, this.TITLE_COLLAPSED]);*/
								}
							
								this.iMode 	= this.SUBJECT;
								
								// now update to the URL
								this.updateForURL();
										
								// now go and fetch content
								this._getContent();
								
								// check the hash string every quarter second
								this.checkHash.periodical(50, this);
							}
						},
						
						updateForURL: function()
						{
							var strCurSubject	= this.strSubject;
							var strCurTopic		= this.strTopic;
							
							var strDocLocation	= document.location;
							
							var regAnchors		= /\#([^\?]*)/;
							var regQueryString	= /\#?\?([^\#]+)/;
							var regURLParts		= new RegExp("http[s]?://[^/]*/subjects/?([^/\\?\\#]*)/?([^/\\?\\#]*)/?[^\\#\\?]*", "i");
							var regNotBase		= new RegExp("http[s]?://[^/]*/subjects/.+", "i");
							
							var arrURL 			= regURLParts.exec(strDocLocation);
							var arrQueryString	= regQueryString.exec(strDocLocation);
							var arrAnchors		= regAnchors.exec(strDocLocation);
							
							var strAnchors		= "";
							var strTempTopic	= "";
							var strQueryString	= "";
														
							if(arrURL.length == 3)
							{
								this.strSubject 	= arrURL[1];
								strTempTopic		= arrURL[2];
							}
							
							if(arrQueryString && arrQueryString.length == 2)
								strQueryString 		= arrQueryString[1];
							
							if(arrAnchors && arrAnchors.length == 2)
								strAnchors			= arrAnchors[1];
							
							if(strQueryString && strQueryString != "")
							{
								var arrTypes		= new Array("subject", "topic", "title");
								
								for(var type = 0; type < arrTypes.length; type++)
								{
									var regSubjectPage = new RegExp("(?:^|&)"+arrTypes[type]+"-page=([0-9]+)", "i");
								
									// we need to parse the query string
									if(strQueryString.test(regSubjectPage))
									{
										var arrQueryString = regSubjectPage.exec(strQueryString);
										if(arrQueryString.length == 2)
										{
											var iPageNum = arrQueryString[1];
											switch(type)
											{
												case this.SUBJECT:	this.iSubjectPage = iPageNum;
																	break;
												case this.TOPIC:	this.iTopicPage = iPageNum;
																	break;
												case this.TITLE:	this.iTitlePage = iPageNum;
																	break;
											}
										}
									}
								}
							}
							
							if(regURLParts.test(strDocLocation) && strAnchors != "")
							{
								var regAnchor		= /^\/?([^\/]*)\/?([^\/]*)/;
								var arrAnchorParts	= regAnchor.exec(strAnchors);
								
								if(arrAnchorParts.length >= 2)
									this.strSubject = arrAnchorParts[1];
								
								if(arrAnchorParts.length >= 3)
									strTempTopic = arrAnchorParts[2];
							}
							
							if(this.strSubject == "" && strTempTopic == "" && (this.strSubject != strCurSubject || strTempTopic != strCurTopic))
							{
								this.goto(this.SUBJECT);
							}
							
							if(this.strSubject != "" && (this.strSubject != strCurSubject))
							{
								this.setMaxDepth(this.TOPIC);
								this.goto(this.TOPIC, "subject-"+this.strSubject, this.CHANGE_SUBJECT, this.NO_CHANGE_TOPIC, this.iTopicPage);
							}
							
							if(strTempTopic != "" && (strTempTopic != strCurTopic))
							{
								this.strTopic 	= strTempTopic;
								this.setMaxDepth(this.TITLE);
								this.goto(this.TITLE, "topic-"+this.strTopic, this.NO_CHANGE_SUBJECT, this.CHANGE_TOPIC, this.iTopicPage, this.iTitlePage);
							}
							
							this.setDocumentAnchor();
						},
						
						setDocumentAnchor: function(bJustSetIELocation)
						{
							var strAnchor = "";
							if(this.strSubject != "")
							{
								strAnchor += "/"+this.strSubject+"/";
								if(this.strTopic)
								{
									strAnchor += this.strTopic + "/";
								}
							}
							
							if(isNaN(this.iSubjectPage))
								this.iSubjectPage = 0;
							
							if(isNaN(this.iTopicPage))
								this.iTopicPage = 0;
							
							if(isNaN(this.iTitlePage))
								this.iTitlePage = 0;
								
							
							var strQuery = "";
							if(this.iSubjectPage != 0)
								strQuery = "?subject-page="+this.iSubjectPage;
							
							if(this.iTopicPage != 0)
								strQuery += (strQuery == "" ? "?" : "&") + "topic-page="+this.iTopicPage;
							
							if(this.iTitlePage != 0)
								strQuery += (strQuery == "" ? "?" : "&") + "title-page="+this.iTitlePage;
							
							if(bJustSetIELocation)
								window.location.hash = "#"+(strAnchor+strQuery);
							else
								this._setDocAnc.delay(250, this, [strAnchor, strQuery]);
								
						},
						
						_isIE: function()
						{
							return (Browser.Engine.trident != undefined);
						},
						
						_setDocAnc: function(strAnchor, strQuery)
						{
							var strNewLocation  	= window.location.href.replace(/\#.*/, "");
							strNewLocation			+= "#"+(strAnchor+strQuery);
							window.location.href 	= strNewLocation;
							
							//if(this._isIE())
								//this.__history.src	= "/subjects/browse-history"+(strAnchor+strQuery);
						},
						
						setSubjectPagingLinkBehaviour: function()
						{
							var arrSubjectPagingLinks	= $$('#subjectwrapper .paging a');
							
							// go through each
							for(var i = 0; i < arrSubjectPagingLinks.length; i++)
							{
								// disable the link
								this._disableLink(arrSubjectPagingLinks[i]);
								
								// assign a new behaviour
								arrSubjectPagingLinks[i].addEvent('click', 	function(evt)
																			{
																				accordion.setSubjectPage(this.id);
																				accordion.setDocumentAnchor();
																			});
							}
						},
						
						setTopicPagingLinkBehaviour: function()
						{
							var arrTopicPagingLinks	= $$('#topicwrapper .paging a');
							
							// go through each
							for(var i = 0; i < arrTopicPagingLinks.length; i++)
							{
								// disable the link
								this._disableLink(arrTopicPagingLinks[i]);
								
								// assign a new behaviour
								arrTopicPagingLinks[i].addEvent('click', 	function(evt)
																			{
																				accordion.setTopicPage(this.id);
																				accordion.setDocumentAnchor();
																			});
							}
						},
						
						setTitlePagingLinkBehaviour: function()
						{
							var arrTitlePagingLinks	= $$('#titlewrapper .paging a');
							
							// go through each
							for(var i = 0; i < arrTitlePagingLinks.length; i++)
							{
								// disable the link
								this._disableLink(arrTitlePagingLinks[i]);
								
								// assign a new behaviour
								arrTitlePagingLinks[i].addEvent('click', 	function(evt)
																			{
																				accordion.setTitlePage(this.id);
																				accordion.setDocumentAnchor();
																			});
							}
						},
						
						setSubjectPage: function(strID)
						{
							var divSubjectHolder = $('subjectholder');
							
							// if we have it
							if(divSubjectHolder)
							{
								divSubjectHolder.set('tween', {duration:200});
								divSubjectHolder.set('opacity', 0);
								
								// clear it out
								divSubjectHolder.empty();
							}
							
							switch(strID)
							{
								case "subject_previous": 	this.iSubjectPage--;
															break;
								case "subject_next": 		this.iSubjectPage++;
															break;
								default:					this.iSubjectPage = parseInt(strID.substr("subject_page_".length));
															break;
							}
							this.iMode 	= this.SUBJECT;
									
							this._getContent();
						},
						
						setTopicPage: function(strID)
						{
							var divTopicHolder = $('topicholder');
							
							// if we have it
							if(divTopicHolder)
							{
								divTopicHolder.set('tween', {duration:200});
								divTopicHolder.set('opacity', 0);
								
								// clear it out
								divTopicHolder.empty();
							}
							
							switch(strID)
							{
								case "topic_previous": 		this.iTopicPage--;
															break;
								case "topic_next": 			this.iTopicPage++;
															break;
								default:					this.iTopicPage = parseInt(strID.substr("topic_page_".length));
															break;
							}
							this.iMode 	= this.TOPIC;
									
							this._getContent();
						},
						
						setTitlePage: function(strID)
						{
							var divTitleHolder = $('titleholder');
							
							// if we have it
							if(divTitleHolder)
							{
								divTitleHolder.set('tween', {duration:200});
								divTitleHolder.set('opacity', 0);
								
								// clear it out
								divTitleHolder.empty();
							}
							
							switch(strID)
							{
								case "title_previous": 		this.iTitlePage--;
															break;
								case "title_next": 			this.iTitlePage++;
															break;
								default:					this.iTitlePage = parseInt(strID.substr("title_page_".length));
															break;
							}
							this.iMode 	= this.TITLE;
									
							this._getContent();
						},
						
						setMaxDepth: function(iMaxDepth)
						{
							this.iMaxDepth = iMaxDepth;
						},
						
						toggleHolders: function(bOn)
						{
							var divSubjectContainer	= $('subjectcontainer');
							var divTopicContainer	= $('topiccontainer');
							var divTitleContainer	= $('titlecontainer');
							
							if(divSubjectContainer && divTopicContainer && divTitleContainer)
							{
								if(bOn)
								{
									if(this.iMode == this.SUBJECT)
										divSubjectContainer.removeClass('hidden');
									
									if(this.iMode == this.TOPIC)
										divTopicContainer.removeClass('hidden');
									
									if(this.iMode == this.TITLE)
										divTitleContainer.removeClass('hidden');
								}
								else
								{
									divSubjectContainer.addClass('hidden');
									divTopicContainer.addClass('hidden');
									divTitleContainer.addClass('hidden');
								}
							}
						},
						
						goto: function(iMode, el, bSubjectChange, bTopicChange, iTopicPage, iTitlePage)
						{
							// find the three wrapper panels
							var divSubjectWrapper	= $('subjectwrapper');
							var divTopicWrapper		= $('topicwrapper');
							var divTitleWrapper		= $('titlewrapper');
							

							if(divSubjectWrapper && divTopicWrapper && divTitleWrapper)
							{
								var spanTopicPrice		= $('topicprice');
								var aAddTopicToBasket		= $('addtopictobasketlink');
								
								if(aAddTopicToBasket && !aAddTopicToBasket.hasClass('hidden'))
									aAddTopicToBasket.addClass('hidden');
									
								if(spanTopicPrice && !spanTopicPrice.hasClass('hidden'))
									spanTopicPrice.addClass('hidden');
								
								switch(iMode)
								{
									case this.SUBJECT:	this.iMode 			= iMode;
														
														this.strSubject		= "";
														this.strTopic		= "";
														
														// set the subject to active,
														// remove the active class from the topic
														// and also the title.
														divSubjectWrapper.className='active';
														divTopicWrapper.removeClass('active');
														divTitleWrapper.removeClass('active');
														
														// get the subject holder
														var divSubjectHolder = $('subjectholder');
														
														// if we have it
														if(divSubjectHolder)
														{
															divSubjectHolder.set('tween', {duration:200});
															divSubjectHolder.set('opacity', 0);
															
															// clear it out
															divSubjectHolder.empty();
														}
														
														// get the paging links
														var arrPaging = $$('#subjectwrapper .paging');
														
														// clear the paging
														if(arrPaging.length)
														{
															var divPaging = arrPaging[0];
															divPaging.empty();
														}
								
														// grab the links
														var aSubjectLink	= $('lnk_subject');
														var aTopicLink		= $('lnk_topic');
														var aTitleLink		= $('lnk_title');
														
														if(aSubjectLink)
															aSubjectLink.addClass('hidden');
														
														// if we need to keep the topics
														// and titles active, then do so
														if(aTopicLink && this.iMaxDepth >= this.TOPIC)
															aTopicLink.removeClass('hidden');
														
														if(aTitleLink && this.iMaxDepth >= this.TITLE)
															aTitleLink.removeClass('hidden');
														else if(aTitleLink)
															aTitleLink.addClass('hidden');
															
														var iSubjectWrapperWidth 	= divSubjectWrapper.getStyle('width').toInt();
														var iTopicWrapperWidth 		= divTopicWrapper.getStyle('width').toInt();
														var iTitleWrapperWidth 		= divTitleWrapper.getStyle('width').toInt();
														
														this.toggleHolders(this.OFF);
														
														if(iSubjectWrapperWidth != this.SUBJECT_EXPANDED)
														{
															divSubjectWrapper.setStyle('width', iSubjectWrapperWidth+'px');
															divSubjectWrapper.tween('width', [iSubjectWrapperWidth, this.SUBJECT_EXPANDED]);
														}
														
														divTopicWrapper.removeClass('leftpinned');
														divTopicWrapper.addClass('rightpinned');
														
														if(iTopicWrapperWidth != this.TOPIC_COLLAPSED)
														{
															divTopicWrapper.setStyle('width', iTopicWrapperWidth+'px');
															divTopicWrapper.tween('width', [iTopicWrapperWidth, this.TOPIC_COLLAPSED]);
														}
														else
														{
															divTopicWrapper.setStyle('width', this.TOPIC_EXPANDED+'px');
															divTopicWrapper.tween('width', [this.TOPIC_EXPANDED, this.TOPIC_COLLAPSED]);
														}
														
														if(iTitleWrapperWidth != this.TITLE_COLLAPSED)
														{
															divTitleWrapper.setStyle('width', iTitleWrapperWidth+'px');
															divTitleWrapper.tween('width', [iTitleWrapperWidth, this.TITLE_COLLAPSED]);
														}
														
														// end
														break;
														
									case this.TOPIC:	this.iMode = iMode;
														
														var iSubjectWrapperWidth 	= divSubjectWrapper.getStyle('width').toInt();
														var iTopicWrapperWidth 		= divTopicWrapper.getStyle('width').toInt();
														var iTitleWrapperWidth 		= divTitleWrapper.getStyle('width').toInt();
														
														this.strTopic		= "";
													
														var spanSubjectRealName		= $('topic_subjectrealname');
														if(spanSubjectRealName)
															spanSubjectRealName.set('text', 'Retrieving...');
									
														// grab the links
														var aSubjectLink	= $('lnk_subject');
														var aTopicLink		= $('lnk_topic');
														var aTitleLink		= $('lnk_title');
														
														// if we have the link to
														// the subject then activate it
														// so the user can go back
														if(aSubjectLink)
															aSubjectLink.removeClass('hidden');
														
														// hide the topic link
														// because we are on that panel
														if(aTopicLink)
															aTopicLink.addClass('hidden');
														
														// if we've been down to title level
														// and then come back up keep the title
														// link active so the user can go back
														if(aTitleLink && this.iMaxDepth >= this.TITLE)
															aTitleLink.removeClass('hidden');
														else if(aTitleLink)
															aTitleLink.addClass('hidden');
														
														// the subject wrapper is not active
														divSubjectWrapper.removeClass('active');
														
														// get the topic holder
														var divTopicHolder = $('topicholder');
														
														// if we have it
														if(divTopicHolder)
														{
															divTopicHolder.set('tween', {duration:200});
															divTopicHolder.set('opacity', 0);
															
															// clear it out
															divTopicHolder.empty();
														}
														
														// get the paging links
														var arrPaging = $$('#topicwrapper .paging');
														
														// clear the paging
														if(arrPaging.length)
														{
															var divPaging = arrPaging[0];
															divPaging.empty();
														}
														
														// if we've gone down down to this
														// topic level because someone
														// changed the subject
														if(bSubjectChange)
														{
															// we changed subject so show the first page
															this.iTopicPage				= iTopicPage || 0;
															
															// work out the name of our selected subject
															var strSubjectClass			= el.substring("subject-".length).toLowerCase();
															
															// set the subject string;
															this.strCurrentSubject		= strSubjectClass.replace(/_/g, "-");
															
															// clear out any existing classes
															// and add the name of the subject as the class
															divTopicWrapper.className 	= '';
															divTopicWrapper.addClass(strSubjectClass.replace(/-/g, "_"));
															
															// clear the title wrappers subject class
															var bRightPinned 			= divTitleWrapper.hasClass('rightpinned');
															var bLeftPinned 			= divTitleWrapper.hasClass('leftpinned');
															var bActive 				= divTitleWrapper.hasClass('active');
															divTitleWrapper.className	= '';
															
															if(bRightPinned)
																divTitleWrapper.addClass('rightpinned');
															
															if(bLeftPinned)
																divTitleWrapper.addClass('leftpinned');
															
															if(bActive)
																divTitleWrapper.addClass('active');
														}
														
														if(this.strSubject == "")
															this.strSubject = this.strCurrentSubject;
														
														this.toggleHolders(this.OFF);
														
														// finally set the topic to be active
														// and the title to be inactive
														divTopicWrapper.addClass('active');
														divTitleWrapper.removeClass('active');
														
														var bMoved = false;
														
														if(iSubjectWrapperWidth != this.SUBJECT_COLLAPSED)
														{
															divSubjectWrapper.setStyle('width', iSubjectWrapperWidth+'px');
															divSubjectWrapper.tween('width', [iSubjectWrapperWidth, this.SUBJECT_COLLAPSED]);
															divTopicWrapper.addClass('rightpinned');
															divTopicWrapper.removeClass('leftpinned');
															bMoved = true;
														}
														
														if(iTopicWrapperWidth != this.TOPIC_EXPANDED)
														{
															divTopicWrapper.setStyle('width', iTopicWrapperWidth+'px');
															divTopicWrapper.tween('width', [iTopicWrapperWidth, this.TOPIC_EXPANDED]);
															bMoved = true;
														}
														
														if(iTitleWrapperWidth != this.TITLE_COLLAPSED)
														{
															divTopicWrapper.removeClass('rightpinned');
															divTopicWrapper.addClass('leftpinned');
															divTitleWrapper.setStyle('width', iTitleWrapperWidth+'px');
															divTitleWrapper.tween('width', [iTitleWrapperWidth, this.TITLE_COLLAPSED]);
															bMoved = true;
														}
														
														if(!bMoved)
															this.toggleHolders(this.ON);
														
														// end
														break;
														
									case this.TITLE:	this.iMode = iMode;
														
														var spanTopicRealName		= $('title_topicrealname');
														var spanForwardSlash		= $('title_forwardslash');
														var aTitleSubject			= $('lnk_title_topics');
														if(spanTopicRealName && spanForwardSlash && aTitleSubject)
														{
															spanTopicRealName.set('text', 'Retrieving...');
															spanForwardSlash.addClass('hidden');
															aTitleSubject.addClass('hidden');
														}
														
														// grab the links
														var aSubjectLink	= $('lnk_subject');
														var aTopicLink		= $('lnk_topic');
														var aTitleLink		= $('lnk_title');
														
														// all the user to go back to either
														// the subject level or the topic level
														if(aSubjectLink)
															aSubjectLink.removeClass('hidden');
														if(aTopicLink)
															aTopicLink.removeClass('hidden');
															
														aTitleLink.addClass('hidden');
															
														// if we've gone down down to this
														// topic level because someone
														// changed the subject
														if(bTopicChange)
														{
															// we changed subject so show the first page
															this.iTitlePage				= iTitlePage || 0;
															
															// work out the name of our selected subject
															var strTopicClass			= el.substring("topic-".length).toLowerCase();
															
															// set the subject string;
															this.strTopic				= strTopicClass.replace(/_/g, "-");
															this.strCurrentTopic		= this.strTopic;
															
															divTitleWrapper.addClass(this.strCurrentSubject.replace(/-/g, "_"));
														}
														
														// get the paging links
														var arrPaging = $$('#titlewrapper .paging');
														
														// clear the paging
														if(arrPaging.length)
														{
															var divPaging = arrPaging[0];
															divPaging.empty();
														}
														
														// get the topic holder
														var divTitleHolder = $('titleholder');
														
														// if we have it
														if(divTitleHolder)
														{
															divTitleHolder.set('tween', {duration:200});
															divTitleHolder.set('opacity', 0);
															
															// clear it out
															divTitleHolder.empty();
														}
														
														if(this.strTopic == "")
															this.strTopic = this.strCurrentTopic;
														
														
														this.toggleHolders(this.OFF);
														
														var iSubjectWrapperWidth 	= divSubjectWrapper.getStyle('width').toInt();
														var iTopicWrapperWidth 		= divTopicWrapper.getStyle('width').toInt();
														var iTitleWrapperWidth 		= divTitleWrapper.getStyle('width').toInt();
														
														// finally deactivate the subject and topic
														// and activate the title wrapper
														divSubjectWrapper.removeClass('active');
														divTopicWrapper.removeClass('active');
														divTitleWrapper.addClass('active');
															
														var bMoved = false;
														
														if(iSubjectWrapperWidth != this.SUBJECT_COLLAPSED)
														{
															divSubjectWrapper.setStyle('width', iSubjectWrapperWidth+'px');
															divSubjectWrapper.tween('width', [iSubjectWrapperWidth, this.SUBJECT_COLLAPSED]);
															bMoved = true;
															//alert("Subject not collapsed");
														}
														
														if(iTopicWrapperWidth != this.TOPIC_COLLAPSED)
														{
															divTopicWrapper.setStyle('width', iTopicWrapperWidth+'px');
															divTopicWrapper.tween('width', [iTopicWrapperWidth, this.TOPIC_COLLAPSED]);
															divTopicWrapper.addClass('leftpinned');
															divTopicWrapper.removeClass('rightpinned');
															bMoved = true;
														}
														else if(iTopicWrapperWidth == this.TOPIC_COLLAPSED)
														{
															divTopicWrapper.tween('width', [iTopicWrapperWidth, this.TOPIC_EXPANDED]);
															divTopicWrapper.addClass('rightpinned');
															bMoved = true;
															
														}
														
														// cancel any existing tweens
														divTitleWrapper.get('tween').cancel();
														
														if(iTitleWrapperWidth != this.TITLE_EXPANDED)
														{
															divTitleWrapper.removeClass('leftpinned');
															divTitleWrapper.addClass('rightpinned');
															divTitleWrapper.setStyle('width', iTitleWrapperWidth+'px');
															divTitleWrapper.tween('width', [iTitleWrapperWidth, this.TITLE_EXPANDED]);
															bMoved = true;
														}
														
														if(!bMoved)
															this.toggleHolders(this.ON);
														
														// end
														break;
								}
								
								this._getContent();
							}
						},
						
						_disableLink: function(mxLabel)
						{
							// assume failure
							var bDisabled 	= false;
							
							// try and locate the item
							var elTarget	= $(mxLabel);
							
							// if we located it
							if(elTarget)
							{
								// disable the link
								if(Browser.Engine.trident) // IE
									elTarget.onclick = function(){ return false; };
								else // FF, Safari, Opera
									elTarget.setAttribute('onclick', 'return false');
								
								// declare success
								bDisabled = true;
							}
							
							// return the result
							return bDisabled;
						},
						
						_getContent: function()
						{
							// set the request time as now
							this.iLastRequestTime = (new Date()).getTime();
							
							// do a loop to see if we have
							// all the items that we need
							var bCached = true;
							switch(this.iMode)
							{
								case this.SUBJECT: 	if(this.iSubjectMax == 0)
														bCached = false;
													else
													{
														var iStart 		= this.iSubjectPage*this.SUBJECT_WINDOW;
														var iEnd		= Math.min(this.iSubjectMax, (this.iSubjectPage+1)*this.SUBJECT_WINDOW);
														for(var i = iStart; i < iEnd; i++)
														{
															if(!this.arrSubjects[i])
															{
																bCached = false;
																break;
															}
														}

													}
													break;
													
								case this.TOPIC: 	if(this.arrTopicMax[this.strSubject] == 0 || !this.arrTopics[this.strSubject])
														bCached = false;
													else
													{
														var iStart 		= this.iTopicPage*this.TOPIC_WINDOW;
														var iEnd		= Math.min(this.arrTopicMax[this.strSubject], (this.iTopicPage+1)*this.TOPIC_WINDOW);
														for(var i = iStart; i < iEnd; i++)
														{
															if(!this.arrTopics[this.strSubject][i])
															{
																bCached = false;
																break;
															}
														}

													}
													break;
													
								case this.TITLE: 	if(this.arrTitleMax[this.strTopic] == 0 || !this.arrTitles[this.strTopic])
														bCached = false;
													else
													{
														var iStart 		= this.iTitlePage*this.TITLE_WINDOW;
														var iEnd		= Math.min(this.arrTitleMax[this.strTopic], (this.iTitlePage+1)*this.TITLE_WINDOW);
														for(var i = iStart; i < iEnd; i++)
														{
															if(!this.arrTitles[this.strTopic][i])
															{
																bCached = false;
																break;
															}
														}

													}
													break;
							}
							
							if(bCached)
							{
								// use cached values
								var strArrayTag = this.strSubject;
								if(this.iMode == this.TITLE)
									strArrayTag = this.strTopic;
								this.update(strArrayTag);
							}
							else
							{
								var rqAccordion = new Request({url:		"/z_ajax/ajax_handler.php?" + 
																		"subject=" 		+ this.strSubject.replace(/_/g, "-") + "&" + 
																		"topic=" 		+ this.strTopic.replace(/_/g, "-") 	 + "&" +
																		"subject-page=" + this.iSubjectPage + "&" +
																		"topic-page=" 	+ this.iTopicPage	+ "&" +
																		"title-page=" 	+ this.iTitlePage,
															   method: 	"post"});
													
								// add a callback function
								rqAccordion.onSuccess = function(strResponseText, strResponseXML)
								{
									var iTimeStamp			= null;
									
									for(var i = 0; i < strResponseXML.childNodes.length; i++)
									{
										if(strResponseXML.childNodes[i].nodeName == "response")
										{
											var xmlResponse 		= strResponseXML.childNodes[i].childNodes;
											var iObjectType			= null;
											var iIndexStart			= null;
											var iMaxNum				= null;
											var strArrayTag			= null;
											var strTopicRealName	= null;
											var strTopicPrice		= null;
											var strTopicID			= null;
											var strSubjectRealName	= null;
											var arrResponseObjects 	= new Array();
									
											for(var j = 0; j < xmlResponse.length; j++)
											{
												var xmlNode = xmlResponse[j];
												switch(xmlNode.nodeName)
												{
													case "result":					// Show that there was nothing
																					if(accordion)
																						accordion.showNoResult();
																					break;
																					
													// ---------- GENERAL --------- //
													
													case "timestamp":				iTimeStamp 				= xmlNode.firstChild.nodeValue;
																					break;
													
													case "maxnum":					iMaxNum 				= xmlNode.firstChild.nodeValue;
																					break;
													
													// ---------- SUBJECT --------- //	
													
													case "subject": 				if(accordion)
																						iObjectType			= accordion.SUBJECT;
																					
																					var objSubject 			= new Object();
																					
																					for(var k = 0; k < xmlNode.childNodes.length; k++)
																					{
																						switch(xmlNode.childNodes[k].nodeName)
																						{
																							case "id":		
																							case "name":
																							case "url":		objSubject[xmlNode.childNodes[k].nodeName] = 
																											xmlNode.childNodes[k].firstChild.nodeValue;
																						}
																					}
																					arrResponseObjects.push(objSubject);
																					break;
																			
													case "subjectstart":			iIndexStart = xmlNode.firstChild.nodeValue;
																					break;
																			
													// ---------- TOPIC --------- //						
													
													case "topic":					if(accordion)
																						iObjectType			= accordion.TOPIC;
																						
																					var objTopic 			= new Object();
		
																					for(var k = 0; k < xmlNode.childNodes.length; k++)
																					{
																						switch(xmlNode.childNodes[k].nodeName)
																						{
																							case "id":		
																							case "name":
																							case "image":
																							case "url":		objTopic[xmlNode.childNodes[k].nodeName] = 
																											xmlNode.childNodes[k].firstChild.nodeValue;
																						}
																					}
																					arrResponseObjects.push(objTopic);
																					
																					break;
																			
													case "topicsubject": 			strArrayTag = xmlNode.firstChild.nodeValue;
																					break;
																			
													case "topicstart":				iIndexStart = xmlNode.firstChild.nodeValue;
																					break;
																					
													// -------- TOPIC / TITLE ------- //
																			
													case "topicsubjectrealname":	strSubjectRealName = xmlNode.firstChild.nodeValue;
																					break;
													
													// ------------ TITLE ----------- //
													
													case "title":					if(accordion)
																						iObjectType			= accordion.TITLE;
																						
																					var objTitle 			= new Object();
		
																					for(var k = 0; k < xmlNode.childNodes.length; k++)
																					{
																						switch(xmlNode.childNodes[k].nodeName)
																						{
																							case "id":		
																							case "name":
																							case "image":
																							case "url":		objTitle[xmlNode.childNodes[k].nodeName] = 
																											xmlNode.childNodes[k].firstChild.nodeValue;
																						}
																					}
																					arrResponseObjects.push(objTitle);
																					
																					break;
																			
													case "titletopic": 				strArrayTag = xmlNode.firstChild.nodeValue;
																					break;
																			
													case "titlestart":				iIndexStart = xmlNode.firstChild.nodeValue;
																					break;
																			
													case "titletopicrealname":		strTopicRealName = xmlNode.firstChild.nodeValue;
																					break;
																					
													case "titletopicprice":			strTopicPrice = xmlNode.firstChild.nodeValue;
																					break;
													
													case "titletopicid":			strTopicID = xmlNode.firstChild.nodeValue;
																					break;
													
												}
											}
											
											if(accordion && (iObjectType != null) && (iIndexStart!= null) && (iMaxNum != null))
											{
												// have the accordion store the results
												accordion.store(arrResponseObjects, 
																parseInt(iObjectType), 
																parseInt(iIndexStart),
																parseInt(iMaxNum),
																strArrayTag,
																strSubjectRealName,
																strTopicRealName,
																strTopicPrice,
																strTopicID);
												
												// only show them to the user if this
												// is the most recent thing they requested
												if(iTimeStamp == accordion.iLastRequestTime)
												{
													accordion.update(strArrayTag);
													
													// if we got back something we didn't expect
													// like a load of subjects when we requested
													// titles and topics, it means there was a problem
													// with the request so we need to bounce the user
													// to the subject listing
													if(iObjectType != accordion.iMode)
													{
														// clear everything and bounce back
														accordion.strTopic 		= "";
														accordion.strSubject 	= "";
														accordion.goto(accordion.SUBJECT);
													}
												}
												
											}
										}
									}
									
								};
								
								// now send the timestamp
								rqAccordion.send("iTimeStamp="+this.iLastRequestTime);
							}
						},
						
						store: function(arrObjects, iType, iIndexStart, iMaxNum, strArrayTag, strSubjectRealName, strTopicRealName, strTopicPrice, strTopicID)
						{
							switch(iType)
							{
								case this.SUBJECT:	this.iSubjectMax		= iMaxNum;
													this.iSubjectMaxPage 	= Math.ceil(iMaxNum / this.SUBJECT_WINDOW);
													for(var i = 0; i < arrObjects.length; i++)
													{
														this.arrSubjects[iIndexStart + i] 				= arrObjects[i];
													}
													break;
									
								case this.TOPIC:	if(strArrayTag)
													{
														this.arrTopicMax[strArrayTag]		= iMaxNum;
														this.arrTopicMaxPage[strArrayTag] 	= Math.ceil(iMaxNum / this.TOPIC_WINDOW);
														
														if(!this.arrTopics[strArrayTag])
															this.arrTopics[strArrayTag] = new Array();
															
														for(var i = 0; i < arrObjects.length; i++)
														{
															this.arrSubjectRealNames[strArrayTag]			= strSubjectRealName;
															this.arrTopics[strArrayTag][iIndexStart + i] 	= arrObjects[i];
														}
														
													}
													
								case this.TITLE:	if(strArrayTag)
													{
														this.arrTitleMax[strArrayTag]		= iMaxNum;
														this.arrTitleMaxPage[strArrayTag] 	= Math.ceil(iMaxNum / this.TITLE_WINDOW);
														
														if(!this.arrTitles[strArrayTag])
															this.arrTitles[strArrayTag] = new Array();
															
														for(var i = 0; i < arrObjects.length; i++)
														{
															this.arrSubjectRealNames["topic_"+strArrayTag]	= strSubjectRealName;
															this.arrTopicRealNames[strArrayTag]			 	= strTopicRealName;
															this.arrTopicPrices[strArrayTag]			 	= strTopicPrice;
															this.arrTopicIDs[strArrayTag]			 		= strTopicID;
															this.arrTitles[strArrayTag][iIndexStart + i] 	= arrObjects[i];
														}
													}
													break;
							}
						},
						
						createPaging: function(arrPaging, iCurrent, iMax, strTag)
						{
							if(arrPaging.length)
							{
								var divPaging = arrPaging[0];
								divPaging.empty();
								if(iMax > 1)
								{
									//divPaging.set('html', "Pages:");
									var spPages		= new Element('span');
									var divPageContainer		= new Element('div');
									
									spPages.set('html', "Pages:");
									divPageContainer.addClass('pagecontainer');
									
									var ulPaging = new Element('ul');
									
									// if we are past 0, put in the
									// previous page link
									if(iCurrent > 0)
									{
										var liPrevious 	= new Element('li');
										var aPrevious	= new Element('a');
										
										liPrevious.setAttribute('id', 'li_'+strTag+'_previous');
										
										aPrevious.setAttribute('id', strTag+'_previous');
										aPrevious.setAttribute('href', '?'+strTag+'-page='+(iCurrent-1));
										aPrevious.set('html', 'Previous');
										
										liPrevious.adopt(aPrevious);
										ulPaging.adopt(liPrevious);
									}
									
									for(var i = 0; i < iMax; i++)
									{
										var liPage 	= new Element('li');
										
										if(i != iCurrent)
										{
											var aPage	= new Element('a');
											
											liPage.setAttribute('id', 'li_'+strTag+'_page_'+i);
										
											aPage.setAttribute('id', strTag+'_page_'+i);
											aPage.setAttribute('href', '?'+strTag+'-page='+i);
											aPage.set('html', (i+1));
											
											liPage.adopt(aPage);
										}
										else
										{
											liPage.set('html', (i+1));
										}
										ulPaging.adopt(liPage);
									}
									
									// if we are pre the end -1, put
									// in a next page link
									if(iCurrent < iMax-1)
									{
										var liNext 		= new Element('li');
										var aNext		= new Element('a');
										
										liNext.setAttribute('id', 'li_'+strTag+'_next');
										
										aNext.setAttribute('id', strTag+'_next');
										aNext.setAttribute('href', '?'+strTag+'-page='+(iCurrent+1));
										aNext.set('html', 'Next');
										
										liNext.adopt(aNext);
										ulPaging.adopt(liNext);
									}
									
									divPageContainer.adopt(ulPaging);
									divPaging.adopt(spPages);
									divPaging.adopt(divPageContainer);
									
								}
							}
						},
						
						updateSitemap: function(strSubject, strTopic)
						{
							var olSitemapListSubjects 	= $('sitemap_list_subjects');
							var arrSitemapSubjects		= $$('#sitemap_list_subjects li')
							
							// if we are not at the subject level in any
							// way we need to reset all the links to active
							for(var i = 0; i < arrSitemapSubjects.length; i++)
							{
								var strLiContents = arrSitemapSubjects[i].get('html');
								var regContents		= /<span>([^<]*)<\/span>/i;
								var arrContents		= regContents.exec(strLiContents);
								
								if(arrContents && arrContents.length == 2)
								{
									var strSubjectLink	= this.createSEOTitle(arrContents[1]);
									
									var aSubject = new Element('a');
									aSubject.set('text', arrContents[1]);
									aSubject.setAttribute('href', '/subjects/'+strSubjectLink+"/");
									aSubject.setAttribute('id', 'sitemap_list_'+(strSubjectLink.replace(/-/g, "_"))+'_link');
									
									arrSitemapSubjects[i].empty();
									arrSitemapSubjects[i].adopt(aSubject);
								}
							}
							
							if(strSubject && !strTopic)
							{
								var strSubjectLink	= this.createSEOTitle(strSubject).replace(/-/g, "_");
								var aSubject		= $('sitemap_list_'+strSubjectLink+'_link');
								
								if(aSubject)
								{
									var strSubjectName 	= aSubject.get('text');
									var spSubjectName	= new Element('span');
									spSubjectName.set('text', strSubjectName);
									var liSubject 		= aSubject.getParent();
									liSubject.empty();
									liSubject.adopt(spSubjectName);
								}
							}
							
							this.__handleSitemapLinks();
						},
						
						__handleSitemapLinks: function()
						{
							var arrSitemapSubjects		= $$('#sitemap_list_subjects li a');
							for(var i = 0; i < arrSitemapSubjects.length; i++)
							{
								arrSitemapSubjects[i].removeEvents();
								this._disableLink(arrSitemapSubjects[i]);
								
								arrSitemapSubjects[i].addEvent('click', function()
																		{
																			if(!accordion.bUpdating)
																			{
																				var strTopic 	= this.id.replace(/^sitemap_list_/, "subject_");
																				strTopic		= strTopic.replace(/_link$/, "");
																				
																				accordion.strSubject = "";
																				accordion.setMaxDepth(accordion.TOPIC);
																				accordion.goto(accordion.TOPIC, strTopic, accordion.CHANGE_SUBJECT);
																				accordion.setDocumentAnchor();
																			}
																		});
							}
						},
						
						writeBreadcrumbs: function(strSubject, strTopic)
						{
							
							var olBreadCrumbTrail = $('breadcrumb_trail')
							if(olBreadCrumbTrail)
							{
								// empty it
								olBreadCrumbTrail.empty();
								
								// create the home crumb
								var liHomeCrumb = new Element('li');
								var aHomeCrumb	= new Element('a');
								aHomeCrumb.setAttribute('title', 'Breadcrumb Link: GCSEPod Home Page');
								aHomeCrumb.setAttribute('href', '/home/');
								aHomeCrumb.set('text', 'Home');
								
								liHomeCrumb.addClass('firstcrumb');
								liHomeCrumb.adopt(aHomeCrumb);
								
								// add it to the list
								olBreadCrumbTrail.adopt(liHomeCrumb);

								// if we have no subject
								if(!strSubject)
								{
									// it is the current crumb
									var liSubjectCrumb = new Element('li');
									liSubjectCrumb.set('text', 'Subjects');
									liSubjectCrumb.addClass('activecrumb');
									
									olBreadCrumbTrail.adopt(liSubjectCrumb);
								}
								else
								{
									var liSubjectsCrumb 	= new Element('li');
									var aSubjectsCrumb	= new Element('a');
									aSubjectsCrumb.setAttribute('title', 'Breadcrumb Link: Subjects');
									aSubjectsCrumb.setAttribute('href', '/subjects/');
									aSubjectsCrumb.set('text', 'Subjects');
									
									this._disableLink(aSubjectsCrumb);
									aSubjectsCrumb.addEvent('click', function()
																	 {
																		if(!accordion.bUpdating)
																		{
																			accordion.goto(accordion.SUBJECT);
																			accordion.setDocumentAnchor();
																		}
																	 });
									
									liSubjectsCrumb.adopt(aSubjectsCrumb);
									
									olBreadCrumbTrail.adopt(liSubjectsCrumb);
									
									var strClass 		= strTopic ? "" : " class=\"activecrumb\"";
									var liSubjectCrumb	= new Element('li');
									
									olBreadCrumbTrail.adopt(liSubjectCrumb);
									
									if(!strTopic)
									{
										liSubjectCrumb.addClass('activecrumb');
										liSubjectCrumb.set('text', strSubject);
									}
									else
									{
										var aSubjectCrumb = new Element('a');
										aSubjectCrumb.set('text', strSubject);
										aSubjectCrumb.setAttribute('title', 'Breadcrumb Link: '+strSubject);
										
										var strSubjectLink	= this.createSEOTitle(strSubject);
										
										aSubjectCrumb.setAttribute('href', '/subjects/'+strSubjectLink);
										this._disableLink(aSubjectCrumb);
										
										aSubjectCrumb.addEvent('click', function()
																		{
																			if(!accordion.bUpdating)
																			{
																				accordion.goto(accordion.TOPIC);
																				accordion.setDocumentAnchor();
																			}
																		});
									
										
										liSubjectCrumb.adopt(aSubjectCrumb);
										
										var liTopicCrumb	= new Element('li');
										liTopicCrumb.addClass('activecrumb');
										liTopicCrumb.set('text', strTopic);
										
										olBreadCrumbTrail.adopt(liTopicCrumb);
										
									}
									
								}
							}
						},
						
						updateFeeds: function(strSubject)

						{
							// if the share and subscribe
							// object exists, call the setFeeds function
							if($defined(shareAndSubscribe))
								shareAndSubscribe.setFeeds(strSubject);
						},
						
						createSEOTitle: function(strTitle)
						{
							return site.createSEOTitle(strTitle);
						},
						
						showNoResult: function()
						{
							var divTopicHolder 			= $('topicholder');
							var spanSubjectRealName		= $('topic_subjectrealname');
													
							if(divTopicHolder && spanSubjectRealName)
							{
								var arrSubjectUpperFirst = this.strSubject.split("-");
								var strSubjectUpperFirst = "";
								
								for(var i = 0; i < arrSubjectUpperFirst.length; i++)
									strSubjectUpperFirst += (i>0?" ":"")+arrSubjectUpperFirst[i].substring(0,1).toUpperCase()+arrSubjectUpperFirst[i].substring(1);
									
								strSubjectUpperFirst = strSubjectUpperFirst.replace(/Gcse/, "GCSE");
								
								spanSubjectRealName.set('text', strSubjectUpperFirst);
								this.writeBreadcrumbs(strSubjectUpperFirst);
								this.updateSitemap(strSubjectUpperFirst);
															
								// clear it out
								divTopicHolder.empty();
								
								// create an error message
								var pError 				= new Element('p');
								pError.set('html', 'We are currently creating topics for this subject. Please <a href="/contact/">let us know</a> what you would like us to cover.');
								
								// have the topic holder adopt the error message
								// and then fade in
								divTopicHolder.adopt(pError);
								divTopicHolder.tween('opacity', [0,1]);
							}
						},
						
						update: function(strArrayTag)
						{
							this.bUpdating = true;
							switch(this.iMode)
							{
								case this.SUBJECT:  // get our start and end points
													document.title = "Download GCSE learning & revision audio | Education Anywhere - GCSEPod.co.uk";
													
													this.updateFeeds();
													this.writeBreadcrumbs();
													this.updateSitemap();
													
													this.iSubjectPage	= Math.min(this.iSubjectPage, this.iSubjectMaxPage-1);
													var iStart 			= this.iSubjectPage		*this.SUBJECT_WINDOW;
													var iEnd			= (this.iSubjectPage+1)	*this.SUBJECT_WINDOW;
													
													// get the subject holder
													var divSubjectHolder 		= $('subjectholder');
													
													// if we have it
													if(divSubjectHolder)
													{
														var ulSubjects = new Element('ul');
														ulSubjects.setAttribute('title', 'Content: Subjects - Page '+(this.iSubjectPage+1));
														
														// now go through and populate
														for(var i = iStart; i < iEnd; i++)
														{
															if(this.arrSubjects[i])
															{
																var liSubject 	= new Element('li');
																var aSubject	= null;
																
																/*** BETA ***/
																
																aSubject = new Element('a');
																
																aSubject.setAttribute('href', this.arrSubjects[i].url);
																aSubject.setAttribute('title', 'Navigation: ' + this.arrSubjects[i].name);
																aSubject.setAttribute('id', 'subject_'+this.arrSubjects[i].id);
																aSubject.set('text', this.arrSubjects[i].name);
															
																this._disableLink(aSubject);
																
																aSubject.addEvent('click',  function(evt)
																{
																	accordion.setMaxDepth(accordion.TOPIC);
																	accordion.goto(accordion.TOPIC, this.id, accordion.CHANGE_SUBJECT);
																	accordion.setDocumentAnchor();
																});
																
																if(this.arrSubjects[i].name != "History" &&
																   this.arrSubjects[i].name != "Religious Studies" &&
																   this.arrSubjects[i].name != "English" &&
																   this.arrSubjects[i].name != "Geography" &&
																   this.arrSubjects[i].name != "Physics" &&
																   this.arrSubjects[i].name != "Chemistry" &&
																   this.arrSubjects[i].name != "Maths" &&
																   this.arrSubjects[i].name != "Biology")
																{
																	aSubject.addClass("inactive");
																}
																
																liSubject.adopt(aSubject);
																ulSubjects.adopt(liSubject);
															}
														}
														
														divSubjectHolder.adopt(ulSubjects);
														
														// now do the paging links
														var arrPaging = $$("#subjectwrapper .paging");
														
														this.createPaging(arrPaging, this.iSubjectPage, this.iSubjectMaxPage, "subject");
														
														this.setSubjectPagingLinkBehaviour();
													}
													
													divSubjectHolder.tween('opacity', [0,1]);
													
													break;
													
								case this.TOPIC:  	// get our start and end points
													this.iTopicPage	= Math.min(this.iTopicPage, this.arrTopicMaxPage[strArrayTag]-1);
													var iStart 		= this.iTopicPage	 	* this.TOPIC_WINDOW;
													var iEnd		= (this.iTopicPage+1) 	* this.TOPIC_WINDOW;
													
													// get the topic holder
													var divTopicHolder 			= $('topicholder');
													var spanSubjectRealName		= $('topic_subjectrealname');
													
													// if we have it
													if(divTopicHolder && spanSubjectRealName)
													{
														divTopicHolder.set('tween', {duration:200});
														divTopicHolder.set('opacity', 0);
													
														// clear it out
														divTopicHolder.empty();
														
														if(this.arrTopics[strArrayTag] && this.arrSubjectRealNames[strArrayTag])
														{
															this.updateFeeds(this.arrSubjectRealNames[strArrayTag]);
															this.writeBreadcrumbs(this.arrSubjectRealNames[strArrayTag]);
															this.updateSitemap(this.arrSubjectRealNames[strArrayTag]);
															
															spanSubjectRealName.set('text', this.arrSubjectRealNames[strArrayTag]);
															
															document.title = this.arrSubjectRealNames[strArrayTag] + " - Download GCSE learning & revision audio | Education Anywhere - GCSEPod.co.uk";
													
															var ulTopics = new Element('ul');
															ulTopics.setAttribute('title', 'Content: Topics - Page '+(this.iTopicPage+1));
															
															// now go through and populate
															for(var i = iStart; i < iEnd; i++)
															{
																if(this.arrTopics[strArrayTag][i])
																{
																	var liTopic 	= new Element('li');
																	var aTopic		= new Element('a');
																	var imgTopic	= new Element('img');
																	
																	aTopic.setAttribute('href', this.arrTopics[strArrayTag][i].url);
																	aTopic.setAttribute('title', 'Navigation: ' + this.arrTopics[strArrayTag][i].name);
																	aTopic.setAttribute('id', 'topic_'+this.arrTopics[strArrayTag][i].id);
																	
																	imgTopic.setAttribute('src', this.arrTopics[strArrayTag][i].image);
																	imgTopic.setAttribute('alt', 'Topic: ' + this.arrTopics[strArrayTag][i].name);
																	imgTopic.setAttribute('width', '74');
																	imgTopic.setAttribute('height', '74');
																	
																	aTopic.adopt(imgTopic);
																	
																	this._disableLink(aTopic);
																	
																	aTopic.addEvent('click',  function(evt)
																	{
																		accordion.setMaxDepth(accordion.TITLE);
																		accordion.goto(accordion.TITLE, this.id, accordion.NO_CHANGE_SUBJECT, accordion.CHANGE_TOPIC);
																		accordion.setDocumentAnchor();
																	});
																	
																	liTopic.adopt(aTopic);
																	ulTopics.adopt(liTopic);
																}
															}
															divTopicHolder.adopt(ulTopics);
														}
														else
														{
															divTopicHolder.set('html', 'There are no topics in this subject');
														}
														
														// now do the paging links
														var arrPaging = $$("#topicwrapper .paging");
														
														this.createPaging(arrPaging, this.iTopicPage, this.arrTopicMaxPage[strArrayTag], "topic");
														
														this.setTopicPagingLinkBehaviour();
													
														divTopicHolder.tween('opacity', [0,1]);
													}
													
													break;
													
								case this.TITLE:  	// get our start and end points
													this.iTitlePage	= Math.min(this.iTitlePage, this.arrTitleMaxPage[strArrayTag]-1);
													var iStart 		= this.iTitlePage		* this.TITLE_WINDOW;
													var iEnd		= (this.iTitlePage+1)	* this.TITLE_WINDOW;
													
													// get the topic holder
													var divTitleHolder 			= $('titleholder');
													var spanSubjectRealName		= $('title_subjectrealname');
													var spanTopicRealName		= $('title_topicrealname');
													var spanForwardSlash		= $('title_forwardslash');
													var spanTopicPriceValue		= $('topicpricevalue');
													var aAddTopicToBasket		= $('addtopictobasketlink');
													var aTitleSubject			= $('lnk_title_topics');
													var spanTopicPrice			= $('topicprice');
														
													// if we have it
													if(divTitleHolder && spanSubjectRealName && spanTopicRealName && spanForwardSlash && aTitleSubject)
													{
														divTitleHolder.set('tween', {duration:200});
														divTitleHolder.set('opacity', 0);
														
														// clear it out
														divTitleHolder.empty();
														
														if(this.arrTitles[strArrayTag] && this.arrTopicRealNames[strArrayTag])
														{
															var strRealSubjectName  = this.arrSubjectRealNames["topic_"+strArrayTag];
															var strRealTopicName  	= this.arrTopicRealNames[strArrayTag];
															var strRealTopicPrice  	= this.arrTopicPrices[strArrayTag];
															var strRealTopicID  	= this.arrTopicIDs[strArrayTag];
															
															if(spanTopicPriceValue)
																spanTopicPriceValue.set('html', '&pound;'+strRealTopicPrice);
																
															if(aAddTopicToBasket)
																aAddTopicToBasket.set('href', '?add-topic-to-cart='+strRealTopicID);
																
															//alert(strRealTopicPrice + ": " + strRealTopicID);
															
															this.updateFeeds(strRealSubjectName);
															this.writeBreadcrumbs(strRealSubjectName, strRealTopicName);
															this.updateSitemap(strRealSubjectName, strRealTopicName);
															
															document.title = strRealTopicName + " - " + strRealSubjectName + " - Download GCSE learning & revision audio | Education Anywhere - GCSEPod.co.uk";
													
															
															spanSubjectRealName.set('text', strRealSubjectName);
															spanTopicRealName.set('text', strRealTopicName);
															spanForwardSlash.removeClass('hidden');
															aTitleSubject.removeClass('hidden');
															
															var ulTitles = new Element('ul');
															ulTitles.setAttribute('title', 'Content: Titles - Page '+(this.iTitlePage+1));
															
															// now go through and populate
															for(var i = iStart; i < iEnd; i++)
															{
																if(this.arrTitles[strArrayTag][i])
																{
																	var liTitle 	= new Element('li');
																	var aTitle		= new Element('a');
																	var imgTitle	= new Element('img');
																	
																	aTitle.setAttribute('href', this.arrTitles[strArrayTag][i].url);
																	aTitle.setAttribute('title', 'Navigation: ' + this.arrTitles[strArrayTag][i].name);
																	aTitle.setAttribute('id', 'title_'+this.arrTitles[strArrayTag][i].id);
																	
																	imgTitle.setAttribute('src', this.arrTitles[strArrayTag][i].image);
																	imgTitle.setAttribute('alt', 'Title: ' + this.arrTitles[strArrayTag][i].name);
																	imgTitle.setAttribute('width', '74');
																	imgTitle.setAttribute('height', '74');
																	
																	aTitle.adopt(imgTitle);
																	
																	liTitle.adopt(aTitle);
																	ulTitles.adopt(liTitle);
																}
															}
															divTitleHolder.adopt(ulTitles);
														}
														else
														{
															divTitleHolder.set('html', 'There are no titles in this topic');
														}
														
														// now do the paging links
														var arrPaging = $$("#titlewrapper .paging");
														
														this.createPaging(arrPaging, this.iTitlePage, this.arrTitleMaxPage[strArrayTag], "title");
														
														this.setTitlePagingLinkBehaviour();
														
														divTitleHolder.tween('opacity', [0,1]);
														
														if(aAddTopicToBasket && aAddTopicToBasket.hasClass('hidden'))
															aAddTopicToBasket.removeClass('hidden');
															
														if(spanTopicPrice && spanTopicPrice.hasClass('hidden'))
															spanTopicPrice.removeClass('hidden');
													}
													break;
							}
							
							delete this.bUpdating;
							
						}
						  
						  
});

var accordion = null;

window.addEvent('domready', function()
{
	if($('accordion'))
		accordion = new Accordion();
});