/*
	SEE END OF FILE FOR SETTINGS
*/

inArray = function(a, search_term) {
  var i = a.length;
  if (i > 0) {
	 do {
		if (a[i] === search_term) {
		   return true;
		}
	 } while (i--);
  }
  return false;
}


var bbcsr =
{
	feeds: {},
	focusIndex: 0,									// currently viewed feed index
	menuFocusIndex: 0,								// stores index of main menu choice for when returning to menu
	intervalId: null,
	
	isCapableOfAudio: false,						// true if browser supports playing sounds
	useAudio: false,								// true if isCapableOfAudio + currently has audio enabled
	isAudioPlaying: false,							// 
	windowBlurred: false,
	
	// initialise pages
	init: function()
	{
		if ( this != bbcsr )
			return bbcsr.init();
		
		this.isCapableOfAudio = this.checkForAudio();

		this.listeners = [];
		
		bbcsr.User.get();
		
		if ( window.location.href.indexOf(bbcsr.SETTINGS_FILE) > -1 )
			this.initSettings();
		else
			this.initIndex();
	},
	
	// clean up
	unload: function()
	{
		this.removeListeners();
	},
	
	// return true if browser caable of audio
	checkForAudio: function()
	{
		return ( bbcjs.plugins.flashVersion >= 6 );
	},
	
	// play audio for buttons + menus
	playUIAudio: function(id)
	{
		var supplant = {
			type: "ui",
			id: id,
			voice: bbcsr.User.current.settings.voice
		}
		
		// makes url like "voice/ui_playagain_male.mp3"
		var url = this.VOICE_PATH_UI.supplant(supplant);
		this.playAudio(url);
	},
	
	// play audio for current feed item
	playArticle: function()
	{
		this.stopAudio();
		this.isAudioPlaying = true;
		var supplant = {
			type: "story",
			id: this.currentFeed.items[this.currentItem].id,
			voice: bbcsr.User.current.settings.voice
		}
		
		var url = this.VOICE_PATH.supplant(supplant);
		this.playAudio(url);
	},
	
	// add swf to page with flash vars passed in for mp3 url + volume
	// this saves us having to do js-flash communication which can be wonky or not present in various browsers
	initAudio: function()
	{
		var obj = new bbcjs.plugins.FlashMovie(this.SPEECH_SWF, 8);
		obj.flashvars = "vol="+bbcsr.User.current.settings.volume;
		obj.quality = "low";
		obj.width = "1";
		obj.height = "1";
		obj.id = "flash";
		obj.allowScriptAccess = "always";
		obj.swLiveConnect = "true";
		
		var objTag = bbcjs.plugins.generateObjectTag(obj);
		$("player").innerHTML = objTag;
	},
	
	getFlash: function()
	{
		if (navigator.appName.indexOf("Microsoft") != -1) {
			return window["flash"];
		} else {
			return document["flash"];
        }
	},
	
	playAudio: function(url)
	{
		if ( !this.getFlash().playAudio )
		{
			setTimeout(function(){bbcsr.playAudio(url)}, 100);
			return;
		}
		this.getFlash().playAudio(url);
	},
	
	// remove player swf from page
	stopAudio: function()
	{
		if ( this.getFlash().stopAudio ) {
			this.getFlash().stopAudio();
		}
	},
	
	// called with geturl from player swf
	onAudioComplete: function()
	{
		this.isAudioPlaying = false;
	},
	
	// called with geturl from player swf
	onAudioError: function()
	{
		this.onAudioComplete();
	},
	
	// write css based on current user settings
	writeStyles: function()
	{
		var settings = bbcsr.User.current.settings;
		bbcjs.dom.empty(this.styleTag);
		var scheme = settings.style;
		var font = settings.font;
		var css = this.styles[scheme].css + "\n" + this.fonts[font].css;
		css += "\n .switch.focus { border-color: " + settings.scan_color + "!important}";
		if ( settings.capitals == "1" )
			css += "\n * {text-transform: uppercase}";
		if ( settings.bold == "1" )
			css += "\n * {font-weight: bold}";
		if ( this.styleTag.styleSheet )
			this.styleTag.styleSheet.cssText = css;
		else
			bbcjs.dom.append(this.styleTag, css);
	},
	
	// initialise index page.
	// add empty style tag for writing css to
	initIndex: function()
	{
		this.useAudio = ( this.isCapableOfAudio && bbcsr.User.current.settings.speech == "1" );

		if ( this.useAudio )
		{
			this.initAudio();
		}
		
		
		var head = document.getElementsByTagName("head")[0];
		this.styleTag = bbcjs.dom.elem( "style", {type: "text/css"} );
		bbcjs.dom.append(head, this.styleTag);
		this.writeStyles();
		
		this.displayMenu();
		
		
	},
	
	// show available feed choices for current user
	displayMenu: function()
	{
		if (this.useAudio) this.stopAudio();

		this.page = "menu";
		var settings = bbcsr.User.current.settings;
		var len = bbcsr.Feed.instances.length;
		var controls = document.getElementById("controls");
		bbcjs.dom.empty(controls);
		var menu = bbcjs.dom.elem( "div", {id: "menu"} );
		for ( var i=0; i<len; i++ )
		{
			if ( settings["feed"+i] != undefined )
			{
				var feed = bbcsr.Feed.getFeedById(settings["feed"+i]);
				if ( feed )
				{
					var img = bbcjs.dom.elem( "img", {src: feed.logo, value: feed.title, id: feed.id, width: 180, height: 100} );
					var a = bbcjs.dom.elem( "a", {href: "#", className: "switch", id: feed.id}, img );
					bbcjs.dom.addEventListener(a, "click", this.handleMenuSelect, this);
					bbcjs.dom.addEventListener(a, "keypress", function(e) { 
							var key = (e.which) ? e.which : window.event.keyCode;
							if (key == 32) {
								bbcsr.handleMenuSelect(e); 
								return false;
							}
						}, this);
						
					var div = bbcjs.dom.elem( "div", {className: "feed"}, [a, feed.title] );
					bbcjs.dom.append(menu, div);
					if ( (i+1)%this.MENU_ITEMS_PER_ROW == 0 )
					{
						var br = bbcjs.dom.elem( "div", {className: "break"}, " " );
						bbcjs.dom.append(menu, br);
					}
				}
			}
		}
		
		if (!!glow.isSupported)
		{
			hPanel = document.getElementById("carerPanel");
			hPanel.style.display = "block";
		}
		
		var content = document.getElementById("content");
		bbcjs.dom.empty(content);
		bbcjs.dom.append(content, bbcjs.dom.elem( "h2", {}, "Please choose a category" ));
		bbcjs.dom.append(content, menu);
		
		var cbbclast = '<div id="cbbc-last" class="cbbc-last-nr"><a href="/cbbc/" class="cbeebies"><img src="/cbbc/img/f/last/cbbc.png" width="87" height="51" alt="CBBC" title="CBBC" /></a><a href="http://news.bbc.co.uk/cbbcnews" class="bitesize"><img src="/cbbc/img/f/last/newsround.png" width="87" height="51" alt="Newsround" title="Newsround" /></a></div>';
		var blqmain = document.getElementById('blq-main');
		bbcjs.dom.append(blqmain, cbbclast);
		
		//this.addListeners();
		this.focusFirst();
	},
	
	// on menu item click
	handleMenuSelect: function(e)
	{
		bbcjs.dom.stopEvent(e);
		var id = e.target.id;
		this.displayFeed(id);
	},
	
	// show first article
	// get the feed if we don"t have it already
	displayFeed: function(id)
	{
		this.menuFocusIndex = this.focusIndex;
		this.page = "article";
		clearInterval(this.intervalId);
		var feed = bbcsr.Feed.getFeedById(id);
		if ( feed.items == undefined )
		{
			bbcjs.http.get(feed.url, {onLoad: this.parseFeed, pass: feed});
			return;
		}
		this.currentFeed = feed;
		this.currentItem = 0;
		
		var controls = document.getElementById("controls");
		var next = bbcjs.dom.elem("input", {type:"button", value: "Next page", className: "switch", id:"nextpage"});
		bbcjs.dom.addEventListener(next, "click", this.handleNext, this);
		bbcjs.dom.empty(controls);
		if ( this.useAudio )
		{
			var again = bbcjs.dom.elem("input", {type:"button", value: "Play again", className: "switch", id:"playagain"});
			bbcjs.dom.addEventListener(again, "click", this.playArticle, this);
			bbcjs.dom.append(controls, again);
		}
		bbcjs.dom.append(controls, next);
		if (!glow.isSupported)
		{
			hPanel = document.getElementById("carerPanel");
			hPanel.style.display = "none";
		} 
		
		if (document.getElementById('cbbc-last'))
		{
			var cbbclast = document.getElementById('cbbc-last');
			bbcjs.dom.remove(cbbclast);
		}
		
		this.displayFeedItem();
	},
	
	// show the current article
	displayFeedItem: function()
	{
        var content = document.getElementById("content");
		bbcjs.dom.empty(content);
		var tot = this.currentFeed.pages.length;
		var num = this.currentItem+1;
		var title = this.currentFeed.title;
		var h2 = bbcjs.dom.elem("h2", {}, title + ", " + num + " of " + tot);
		bbcjs.dom.append(content, h2);
		bbcjs.dom.append(content, this.currentFeed.pages[this.currentItem]);

		if ( this.useAudio )
		{
			this.playArticle();
		}
        this.focusFirst();
	},
	
	// on next button click
	handleNext: function(e)
	{
		bbcjs.dom.stopEvent(e);
		this.displayNextFeedItem();
		return false;
	},
	
	// show the next article
	displayNextFeedItem: function()
	{
		this.currentItem++;
		if ( this.currentItem >= this.currentFeed.items.length )
		{
			this.isAudioPlaying = false;
			this.displayMenu();
		}
		else
		{
			this.displayFeedItem();
		}
	},
	
	// use the parsing function for this feed to parse xml
	parseFeed: function(request, feed)
	{
		var otree = new XML.ObjTree();
		otree.attr_prefix = "_";
		var xml = request.text();
		var tree = otree.parseXML(xml);
		feed.parse(tree);
		bbcsr.displayFeed(feed.id);
	},
	
	// add event listeners to every scannable element (els with "switch" class)
	addListeners: function()
	{
		this.removeListeners();
		var els = bbcjs.dom.getElementsByClassName("switch");
		if ( els.length <= 0 )
		{
			// no items are scannable. maybe the dom hasn"t been modified yet. try again
			setTimeout("bbcsr.addListeners()", 100);
			return;
		}
		
		for ( var i=0; i<els.length; i++ )
		{
			var focusId = bbcjs.dom.addEventListener(els[i], "focus", this.onElementFocus, this );
			var blurId = bbcjs.dom.addEventListener(els[i], "blur", this.onElementBlur, this );
			this.listeners.push({el:els[i], focusId:focusId, blurId:blurId});
		}
		
	},
	
	// remove all listeners from stored references
	removeListeners: function()
	{
		for ( var i in this.listeners )
		{
			bbcjs.dom.removeEventListener(this.listeners[i].focusId);
			bbcjs.dom.removeEventListener(this.listeners[i].blurId);
		}
	},
	
	// when a "switch" element is focussed - add focus class + play audio if required
	onElementFocus: function(e)
	{
		if(bbcsr.User.current.settings.scan == "1")
		{
			//bbcjs.dom.addClassName(e.target, "focus");
			
			var els = bbcjs.dom.getElementsByClassName("switch");
			
			for (var i=0; i < els.length; i++)
			{
				bbcjs.dom.removeClassName(els[i], "focus");
			}
			bbcjs.dom.addClassName(e.target, "focus");
		}
			
		if ( this.useAudio && !this.isAudioPlaying && bbcsr.User.current.settings.scan == "1" )
		{
			var id = e.target.id;
			this.playUIAudio(id);
		}
	},
	
	// when a "switch" element loses focus - remove focus class.
	onElementBlur: function(e)
	{
		if(bbcsr.User.current.settings.scan == "1")
			bbcjs.dom.removeClassName(e.target, "focus");
			
		var els = bbcjs.dom.getElementsByClassName("switch");
			
		for (var i=0; i < els.length; i++)
		{
			bbcjs.dom.removeClassName(els[i], "focus");
		}
	},
	
	// apply focus to first scannable element in page (or the next element if returning to the main menu
	focusFirst: function()
	{
		
		clearInterval(this.intervalId);
		this.focusIndex = ( this.page == "menu" ) ? this.menuFocusIndex : 0;

		this.addListeners();
		this.focusNext(true);
	},
	
	// focus the next scannable item in the page
	focusNext: function(first,lostFocus)
	{
		var els = bbcjs.dom.getElementsByClassName("switch");
		
		if ( this.focusIndex >= els.length )
			this.focusIndex = 0;
		
		// no possible buttons found. maybe the dom hasn"t updated yet. try again in a bit.
		if ( els.length <= 0 )
		{
			this.intervalId = setTimeout("bbcsr.focusNext()", 100);
			return;
		}
		// remove the focus class from the previous element in case the window lost focus + "blur" didn"t fire
		if ( this.currentFocus && els.length > 1 ) //2 //4
		{
			bbcjs.dom.removeClassName(this.currentFocus, "focus");
		}

		if ( lostFocus )
		{
			//this.stopAudio();
			clearTimeout(this.intervalId);
			//this.removeListeners();
			
			bbcjs.dom.removeClassName(this.currentFocus, "focus");
			var focusListenerId = bbcjs.dom.addEventListener( window, "focus", function() { bbcjs.dom.removeEventListener(focusListenerId); bbcsr.focusFirst(); } );
		}
		else //1 //5
		{
			bbcsr.windowBlurred = false;
			this.currentFocus = els[this.focusIndex];
			this.currentFocus.focus();
			
			if ( parseInt(bbcsr.User.current.settings.scan) == 1 ) //6
			{

				this.focusIndex++;
				clearTimeout(this.intervalId);
				//clearTimeout(this.intervalId);
				this.intervalId = setTimeout(function(){bbcsr.focusNext()}, bbcsr.User.current.settings.scan_delay * 1000);
			}
		}
	},
	
	// initialise the settings page
	initSettings: function()
	{
		this.page = "settings";
		this.displayScanSettings();
		this.displaySpeechSettings();
		this.displayStyleSettings();
		this.displayFontSettings();
		this.displayFeedSettings();
		this.displayUserSelect();
	},
	
	// draw the style select options
	displayStyleSettings: function()
	{
		var options = [];
		for ( var i in this.styles )
		{
			var attr = {value: i};
			var option = bbcjs.dom.elem( "option", attr, this.styles[i].name );
			bbcjs.dom.setStyle(option, this.styles[i].settings);
			options.push(option);
		}
		
		var label = document.getElementById("label-style");
		var select = bbcjs.dom.elem( "select", {id: "select-style", name: "style"} );
		bbcjs.dom.append(label, select);
		bbcjs.dom.append(select, options);
		
		var capitals = document.getElementById("capitals");
		
		//this.selectStyleSettings();
	},
	
	// on scan checkbox click
	storeScan: function(e)
	{
		bbcsr.User.current.settings.scan = document.forms[0].scan.checked ? "1" : "0";
		this.storeScanSettings();
		this.selectScanSettings();
	},
	
	// dispaly scan settings
	displayScanSettings: function()
	{
		var scan = document.getElementById("scan");
		bbcjs.dom.addEventListener(scan, "click", this.storeScan, this);
		
		var label = document.getElementById("label-scan-color");
		for ( var i in this.scanColors )
		{
			var attr = {
				type: "radio",
				name: "scan_color",
				className: "input-radio",
				value: this.scanColors[i]
			};
			var radio = bbcjs.dom.elem( "input", attr );
			var div = bbcjs.dom.elem( "div", {className: "input-radio-color"}, radio );
			bbcjs.dom.setStyle(div, {background: this.scanColors[i]});
			bbcjs.dom.append(label, div);
		}
		
		var field = document.getElementById("field-scan");
		for ( var i in this.delays )
		{
			var attr = {
				type: "radio",
				name: "scan_delay",
				className: "input-radio",
				value: this.delays[i]
			};
			var radio = bbcjs.dom.elem( "input", attr );
			var label = bbcjs.dom.elem( "label", {htmlFor: "scan_delay", className: "label-radio label-scan-delay"}, [""+this.delays[i], radio] );
			bbcjs.dom.append(field, label);
		}
		//this.selectScanSettings();
	},
	
	// on scan checkbox click
	storeSpeech: function(e)
	{
		var form = document.forms[0];
		var settings = bbcsr.User.current.settings;
		settings.speech = form.speech.checked ? "1" : "0";
		if ( form.volume )
			settings.volume = form.volume.value;
		if ( form.voice )
			settings.voice = form.voice.value
		this.selectSpeechSettings();
	},
	
	// dispaly scan settings
	displaySpeechSettings: function()
	{
		var speech = $("speech");
		bbcjs.dom.addEventListener(speech, "click", this.storeSpeech, this);
		
		var fieldset = $("field-speech");
		
		if ( this.isCapableOfAudio )
		{
			/*var text = ( this.voices.length == 1 ) ? this.voices[0] + " voice " : "Voice ";
			var label = bbcjs.dom.elem( "label", {htmlFor:"select-voice", id:"label-voice"}, text );
			bbcjs.dom.append(fieldset, label);
			if ( this.voices.length > 1 )
			{
				var options = [];
				for ( var i in this.voices )
				{
					var attr = {value: this.voices[i].toLowerCase()};
					var option = bbcjs.dom.elem( "option", attr, this.voices[i] );
					options.push(option);
				}
				var select = bbcjs.dom.elem( "select", {id: "select-voice", name: "voice"} );
				bbcjs.dom.append(label, select);
				bbcjs.dom.append(select, options);
			}*/
			label = bbcjs.dom.elem( "label", {htmlFor:"input-volume", id:"label-volume"}, "Volume " );
			bbcjs.dom.append(fieldset, label);
			var input = bbcjs.dom.elem( "input", {type:"text", id:"input-volume", name:"volume", size:"3"} );
			bbcjs.dom.addClassName(input, "fd_range_0_100");
			bbcjs.dom.append(fieldset, input);
		}
		else
		{
			bbcjs.dom.addClassName($("fieldset-speech"), "disabled");
			var msg = bbcjs.dom.elem( "div", {}, "To use this feature, please install the latest <a href=\"http://www.bbc.co.uk/cbbc/help/flash.shtml\">Flash player</a>." );
			bbcjs.dom.append(fieldset, msg);
		}
		//this.selectSpeechSettings();
	},
	
	// select style options for current user
	selectStyleSettings: function()
	{
		var settings = bbcsr.User.current.settings;
		var select = document.getElementById("select-style");
		
		var options = select.childNodes;
		var selected = false;
		if ( bbcsr.User.current )
		{
			select.disabled = (bbcsr.User.current.id == 0);
			for ( var j=0; j<options.length; j++ )
			{
				if ( settings.style == options[j].value )
				{
					select.selectedIndex = j;
					selected = true;
					break;
				}
			}
		}
		if ( !selected )
		{
			select.selectedIndex = 0;
		}
		var form = $("config"); // document.forms[1];
		form.capitals.checked = ( settings.capitals == "1" );
		form.bold.checked = ( settings.bold == "1" );
	},
	
	storeScanSettings: function()
	{
		var form = document.forms[0];
		var settings = bbcsr.User.current.settings;
		var els = form.scan_color;
		var len = els.length;

		for ( var i=0; i<len; i++ )
		{
			if ( els[i].checked )
			{
				settings.scan_color = els[i].value;
				break;
			}
		}
		els = form.scan_delay;
		len = els.length;
		for ( var i=0; i<len; i++ )
		{
			if ( els[i].checked )
			{
				settings.scan_delay = els[i].value;
				break;
			}
		}
	},
	
	// select scan options for current user
	selectScanSettings: function()
	{
		var def = (bbcsr.User.current.id == 0);
		var form = $("config"); // document.forms[1];
		var settings = bbcsr.User.current.settings;
		$("scan").checked = ( settings.scan == "1" );
		var fieldSet = $("field-scan");
		var isScanning = ( settings.scan == "1" );
		fieldSet.disabled = !isScanning;
		if ( isScanning )
			bbcjs.dom.removeClassName(fieldSet, "disabled");
		else
			bbcjs.dom.addClassName(fieldSet, "disabled");
		
		var found = false;
		var els = form.scan_color;
		for ( var i=0; i<els.length; i++ )
		{
			els[i].disabled = ( !isScanning || def );
			if ( els[i].value == settings.scan_color )
			{
				els[i].checked = true;
				found = true;
			}
		}
		if ( !found )
			els[0].checked = true;
		
		var found = false;
		var els = form.scan_delay;
		for ( var i=0; i<els.length; i++ )
		{
			els[i].disabled = ( !isScanning || def );
			if ( els[i].value == settings.scan_delay )
			{
				els[i].checked = true;
				found = true;
			}
		}
		if ( !found )
			els[0].checked = true;
		
		form.scan.disabled = def;
	},
	
	// select scan options for current user
	selectSpeechSettings: function()
	{
		var def = (bbcsr.User.current.id == 0);
		var form = $("config"); // document.forms[1];
		form.speech.checked = ( bbcsr.User.current.settings.speech == "1" );
		form.speech.disabled = !this.isCapableOfAudio;
		// trace(form.speech.disabled);
		// form.speech.disabled = false;
		var fieldSet = $("field-speech");
		var isSpeech = ( bbcsr.User.current.settings.speech == "1" );
		
		if ( isSpeech )
			bbcjs.dom.removeClassName(fieldSet, "disabled");
		else
			bbcjs.dom.addClassName(fieldSet, "disabled");
		
		if ( form.voice )
		{
			var select = $("select-voice");
			var options = select.childNodes;
			var selected = false;
			if ( bbcsr.User.current )
			{
				for ( var j=0; j<options.length; j++ )
				{
					if ( bbcsr.User.current.settings.voice == options[j].value )
					{
						select.selectedIndex = j;
						selected = true;
						break;
					}
				}
			}
			if ( !selected )
				select.selectedIndex = 0;
			
			form.voice.disabled = ( !isSpeech || def );
		}
		if ( form.volume )
		{
			form.volume.value = bbcsr.User.current.settings.volume;
			form.volume.disabled = ( !isSpeech || def );
			if( fdSliderController.sliders["input-volume"] )
			{
				fdSliderController.sliders["input-volume"].enabled = !form.volume.disabled;
				fdSliderController.sliders["input-volume"].events.onchange();
			}
		}
		
		form.speech.disabled = ( def || !this.isCapableOfAudio );
	},
	
	// draw font options
	displayFontSettings: function()
	{
		var options = [];
		for ( var i in this.fonts )
		{
			var attr = {value: i};
			var option = bbcjs.dom.elem( "option", attr, this.fonts[i].name );
			bbcjs.dom.setStyle(option, this.fonts[i].settings);
			options.push(option);
		}
		
		var label = $("label-font");
		var select = bbcjs.dom.elem( "select", {id: "select-font", name: "font"} );
		bbcjs.dom.append(label, select);
		bbcjs.dom.append(select, options);
		//this.selectFontSettings();
	},
	
	// select font options for current user
	selectFontSettings: function()
	{
		var select = $("select-font");
		select.disabled = (bbcsr.User.current.id == 0);
		var options = select.childNodes;
		var selected = false;
		if ( bbcsr.User.current )
		{
			for ( var j=0; j<options.length; j++ )
			{
				if ( bbcsr.User.current.settings.font == options[j].value )
				{
					select.selectedIndex = j;
					selected = true;
					break;
				}
			}
		}
		if ( !selected )
			select.selectedIndex = 0;
		
		var form = $("config"); // document.forms[1];
		form.capitals.disabled = form.bold.disabled = (bbcsr.User.current.id == 0);
	},
	
	// on new user click
	createUser: function()
	{
		var form = document.getElementById("username");
		var name = form.value;
		if ( name != "" )
			bbcsr.User.add(name);
		form.value = "";
		this.displayUserSelect();
	},
	
	// draw select user option
	displayUserSelect: function()
	{
		var options = [];
		var current = bbcsr.User.current.id;
		
		bbcsr.User.instances.sort(function(a,b){
			if (a.name < b.name)
				return -1;
			if (a.name > b.name)
				return 1;
			return 0;
		});
		
		bbcjs.forEach(bbcsr.User.instances, function(v)
		{
			var attr = {value: v.id};
			if ( v.id == current )
				attr.selected = "selected";
			options.push(bbcjs.dom.elem( "option", attr, v.name ));
		});
		var select = $("input-user");
		bbcjs.dom.empty(select);
		bbcjs.dom.append(select, options);
		this.selectUser(current);
	},
	
	// on select user change
	selectUser: function(id)
	{
		var form = $("config"); // document.forms[1];
		var user = bbcsr.User.getUserById(id);
		if ( user )
		{
			bbcjs.cookies.setCookie(bbcsr.User.COOKIE_NAME+"_current", user.id, this.COOKIE_EXPIRY, this.COOKIE_PATH, this.COOKIE_DOMAIN);
			bbcsr.User.current = user;
		}
		
		this.selectScanSettings();
		this.selectSpeechSettings();
		this.selectFeedSettings();
		this.selectStyleSettings();
		this.selectFontSettings();
		
		
		if ( bbcsr.User.current.id == 0 )
		{
			bbcjs.dom.addClassName($("fieldset-scan"), "disabled");
			bbcjs.dom.addClassName($("fieldset-speech"), "disabled");
			bbcjs.dom.addClassName($("fieldset-style"), "disabled");
			bbcjs.dom.addClassName($("fieldset-categories"), "disabled");
			form.save.disabled = true;
		}
		else
		{
			bbcjs.dom.removeClassName($("fieldset-scan"), "disabled");
			if ( this.isCapableOfAudio )
			{
				bbcjs.dom.removeClassName($("fieldset-speech"), "disabled");
			}
			bbcjs.dom.removeClassName($("fieldset-style"), "disabled");
			bbcjs.dom.removeClassName($("fieldset-categories"), "disabled");
			form.save.disabled = false;
		}
		
	},
	
	// writes select boxes for available feeds on settings page
	displayFeedSettings: function()
	{
		var fieldset = $("fieldset-categories");
		var div = bbcjs.dom.elem( "div", {id: "categories"} );
		
		var total = Math.min(bbcsr.Feed.instances.length, bbcsr.NUM_ITEMS);
		
		for ( var i=0; i<total; i++ )
		{
			var options = this.getFeedOptions(i);
			var select = bbcjs.dom.elem( "select", {id: "feed"+i, name: "feed"+i} );
			bbcjs.dom.addEventListener( select, "change", this.disableFeedOptions, this );
			bbcjs.dom.append(div, select);
			bbcjs.dom.append(select, options);
			if ( (i+1)%this.MENU_SETTINGS_PER_ROW == 0 )
			{
				var br = bbcjs.dom.elem( "br" );
				bbcjs.dom.append(div, br);
			}
		}
		bbcjs.dom.append(fieldset, div);
		this.selectFeedSettings();
		this.disableFeedOptions();
	},
	
	disableFeedOptions: function()
	{
		var selected = [];
		var total = Math.min(bbcsr.Feed.instances.length, bbcsr.NUM_ITEMS);

		for ( var i=0; i<total; i++ )
		{
			selected.push( $("feed"+i).value );
		}
		
		for ( var i=0; i<total; i++ )
		{
			var select = $("feed"+i);
			
			//var select = select.options;
			var options = select.childNodes;
			// trace(select);
			//var options = document.forms[1]["feed"+i];

			for ( var j=0; j < options.length; j++ )
			{
				options[j].disabled = ( inArray(selected, options[j].value) && j != select.selectedIndex && options[j].value != "" )
			}
		}
	},
	
	// returns array of "option" elements representing available feeds
	getFeedOptions: function(num, selected)
	{
		selected = selected || [];
		var options = [];
		var feed;

		options.push(bbcjs.dom.elem( "option", {value: ""}, "(none)" ));

		for ( var i=0; i<bbcsr.Feed.instances.length; i++ )
		{
			feed = bbcsr.Feed.instances[i];
			if ( feed.id == selected[num] || !inArray(selected, feed.id) )
				options.push(bbcjs.dom.elem( "option", {value: feed.id}, feed.title ));
		}
		return options;
	},
	
	// selects feeds for current user on settings page
	selectFeedSettings: function()
	{
		var total = Math.min(bbcsr.Feed.instances.length, bbcsr.NUM_ITEMS);
		for ( var i=0; i<total; i++ )
		{
			var select = $("feed"+i);
			select.disabled = (bbcsr.User.current.id == 0);
			var options = select.childNodes;
			var selected = false;
			if ( bbcsr.User.current )
			{
				for ( var j=0; j<options.length; j++ )
				{
					if ( bbcsr.User.current.settings["feed"+i] == options[j].value )
					{
						select.selectedIndex = j;
						selected = true;
						break;
					}
				}
			}
			if ( !selected )
				select.selectedIndex = 0;
		}
	},
	
	// store cookies + go to main page
	storeSettings: function()
	{
		var j = 0;
		
		for (var i = 0; i < bbcsr.Feed.instances.length; i++)
		{
			if ( $('feed'+i).selectedIndex != 0)
			{
				j++;
			}
		}
		if (j == 0)
		{
			alert('You need to select at least one category');
		}
		else
		{
			bbcsr.User.current.store();
			window.location.assign(bbcsr.INDEX_FILE);
		}
	}
}

// Feed class constructor
bbcsr.Feed = function(o)
{
	for ( var i in o )
	{
		this[i] = o[i];
	}
	
	bbcsr.Feed.instances.push(this);
	return this;
}

// static reference to feed instances
bbcsr.Feed.instances = [];

// return Feed object matching id or false
bbcsr.Feed.getFeedById = function(id)
{
	var feed = false;
	bbcjs.forEach(this.instances, function(v)
	{
		if ( v.id == id )
			feed = v;
	});
	return feed;
}

// parses feeds provided by server side scripting. accepts an object produced from xml by ObjTree.js
// and adds an array, "page", containing html elements to the current bbcsr.Feed object
var parseFeed = function(tree)
{
	this.items = [];
	var obj = tree.stories;
	this.items = [];
	this.pages = [];
	var extra = 0;
	
	if ( obj.story.constructor != Array )
		obj.story = [obj.story];
	
	for ( var i=0; i<obj.story.length; i++ )
	{
		if ( obj.story[i] == undefined )
			break;
		
		if ( this.items.length >= bbcsr.NUM_ITEMS )
			break;
		
		var item = {};
		var story = obj.story[i];
		
		item.id = story._id.substring(story._id.indexOf("story:")+6);
		
		item.body = story.body.p;
        item.headline = story.title;
		
		item.img = story.image;
		
		var page = [];
		page.push(bbcjs.dom.elem("h3",{}, item.headline));
		var text = [];
		bbcjs.forEach(item.body, function(v)
		{
			text.push(bbcjs.dom.elem("p",{}, v));
		});
		page.push(bbcjs.dom.elem("div",{id: "text"}, text));
		if ( item.img )
		{
			var attr = 
			{
				src: item.img,
				id: "article"
			}
			if ( item.img._alt )
				attr.alt = item.img._alt;
			page.push(bbcjs.dom.elem("img",attr));
		}
		this.pages.push(page);
		this.items.push(item);
	}
}



bbcsr.User = function(name, id)
{
	if ( name != undefined )
		this.id = bbcsr.User.instances.length;
	else
		this.id = id;
	
	// default settings
	this.settings = Object.clone(bbcsr.DEFAULT_SETTINGS);
	var total = Math.min(bbcsr.Feed.instances.length, bbcsr.NUM_ITEMS);
	for ( var i=0; i<total; i++ )
	{
		this.settings["feed"+i] = (bbcsr.Feed.instances[i]) ? bbcsr.Feed.instances[i].id : "";
	}
	
	var cookieData = {};
	if ( bbcjs.cookies.cookieData[this.getCookieName()] != undefined )
	{
		cookieData = bbcjs.cookies.cookieData[this.getCookieName()];
		this.stored = true;
	}
	this.settings = Object.extend(this.settings, cookieData);
	this.name = ( name == undefined ) ? this.settings.name : name;
	bbcsr.User.instances.push(this);
	return this;
}

bbcsr.User.COOKIE_NAME = "bbcsr_user";

bbcsr.User.instances = [];

bbcsr.User.add = function(name, store)
{
	var testName = name.toLowerCase();
	var found = false;
	bbcjs.forEach(bbcsr.User.instances, function(user)
	{
		if ( user.name && user.name.toLowerCase() == testName )
			found = true;
	});
	if ( found )
		return false;
	
	var user = new bbcsr.User(name);
	if ( !user )
		return false;
	if ( store !== false )
	{
		bbcjs.cookies.setCookie(bbcsr.User.COOKIE_NAME+"_current", user.id, bbcsr.COOKIE_EXPIRY, bbcsr.COOKIE_PATH, bbcsr.COOKIE_DOMAIN);
		user.store();
	}
	this.current = user;
	return user;
};

// loads all users from cookies + adds default if required
bbcsr.User.get = function()
{
	var def = bbcsr.User.add("(default)", false);
	if ( bbcjs.cookies.cookieRaw[this.COOKIE_NAME] != undefined )
	{
		var ids = bbcjs.cookies.cookieRaw[this.COOKIE_NAME].split("%2C");
		
		bbcjs.forEach(ids, function(id)
		{
			var user = new bbcsr.User(null, id);
		});
	}
	var cookieName = bbcsr.User.COOKIE_NAME + "_current";
	if ( bbcjs.cookies.cookieRaw[cookieName] != undefined )
	{
		var id = parseInt(bbcjs.cookies.cookieRaw[cookieName]);
		this.current = this.getUserById(id);
	}
	else
	{
		this.current = bbcsr.User.getUserById(0);
	}
}



// return user object matching id
bbcsr.User.getUserById = function(id)
{
	var user = false;
	bbcjs.forEach(this.instances, function(v)
	{
		if ( v.id == id )
			user = v;
	});
	return user;
}

bbcsr.User.prototype =
{
	// store user settings in cookie: bbcsr_users_[id]
	store: function()
	{
		this.stored = true;
		var form = $("config"); // document.forms[1];
		var total = Math.min(bbcsr.Feed.instances.length, bbcsr.NUM_ITEMS);
		for ( var i=0; i<total; i++ )
		{
			this.settings["feed"+i] = $("feed"+i).value;
		}
		this.settings.bold = form.bold.checked ? "1" : "0";
		this.settings.capitals = form.capitals.checked ? "1" : "0";
		this.settings.style = form.style.value;
		this.settings.font = form.font.value;
		this.settings.scan = form.scan.checked ? "1" : "0";
		this.settings.speech = form.speech.checked ? "1" : "0";
		if ( form.volume )
			this.settings.volume = form.volume.value;
		if ( form.voice )
			this.settings.voice = form.voice.value
		var els = form.scan_color;
		var len = els.length;

		for ( var i=0; i<len; i++ )
		{
			if ( els[i].checked )
			{
				this.settings.scan_color = els[i].value;
				break;
			}
		}
		els = form.scan_delay;
		len = els.length;
		for ( var i=0; i<len; i++ )
		{
			if ( els[i].checked )
			{
				this.settings.scan_delay = els[i].value;
				break;
			}
		}
		var cookie = this.settings;
		cookie.name = this.name;
		bbcjs.cookies.setCookie(this.getCookieName(), cookie, bbcsr.COOKIE_EXPIRY, bbcsr.COOKIE_PATH, bbcsr.COOKIE_DOMAIN);
		var ids = [];
		bbcjs.forEach(bbcsr.User.instances, function(v)
		{
			if ( v.stored )
				ids.push(v.id);
		});
		bbcjs.cookies.setCookie(bbcsr.User.COOKIE_NAME, ids.join(","), bbcsr.COOKIE_EXPIRY, bbcsr.COOKIE_PATH, bbcsr.COOKIE_DOMAIN);
	},
	
	// return cookie name for this user: bbcsr_users_[id]
	getCookieName: function()
	{
		return bbcsr.COOKIE_PREFIX + "users_" + this.id;
	}
	
	
	
}

// returns xmlhttprequest object
function getXMLHttpObj()
{
	if ( typeof(XMLHttpRequest) != "undefined" )
		return new XMLHttpRequest();
	
	var axO = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.4.0",
		"Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"], i;
	for ( i=0; i<axO.length; i++)
		try{
			return new ActiveXObject(axO[i]);
		}catch(e){}
	return null;
}

// for debugging
function trace(msg)
{
	if ( window.console != undefined )
		console.info(msg);
}

//Build the screen reader
bbcjs.addOnLoadItem( bbcsr.init );
bbcjs.dom.addEventListener( window, "unload", bbcsr.unload, bbcsr );

bbcjs.dom.addEventListener( window, "blur", function(e) {
	if ( !bbcsr.windowBlurred && e.explicitOriginalTarget == document ) {
		bbcsr.windowBlurred = true;
		bbcsr.focusNext(false,true);
	}
} );

/*
	SETTINGS
*/

// SCANNING
bbcsr.scanColors = ["#f00", "#0f0", "#00f"];				// color code choices for scan hilight
bbcsr.delays = [3,5,10,15];									// choices for scanning period (seconds)


bbcsr.voices = ["Male", "Female"];							// available voices


// STYLES
bbcsr.styles = {};
bbcsr.styles.standard =
{
	name: "Standard",										// text value of option on settings page
	css: "#blq-main {background: #fff; color: #000}",			// string added to styles on index page
	settings: {background: "#fff", color: "#000"}			// object applied to the style options in settings select
};
bbcsr.styles.hiviz =
{
	name: "High visibility",
	css: "#blq-main {background: #000; color: #ff0} a {color: #0ff}" +
		 ".switch {border-color: #000}" +
		 "h1 {background-image: url(images/logo.png)}",
	settings: {background: "#000", color: "#ff0"}
};
bbcsr.styles.hiviz2 =
{
	name: "High visibility 2",
	css: "#blq-main {background: #000; color: #fff} a {color: #0ff}" +
		 ".switch {border-color: #000}" +
		 "h1 {background-image: url(images/logo.png)}",
	settings: {background: "#000", color: "#fff"}
};
bbcsr.styles.dyslexia =
{
	name: "Dyslexia 1",
	css: "#blq-main {background: #CAE4FF; color: #000}" +
		 ".switch {border-color: #CAE4FF}",
	settings: {background: "#CAE4FF", color: "#000"}
};
bbcsr.styles.dyslexia2 =
{
	name: "Dyslexia 2",
	css: "#blq-main {background: #FFFFCC; color: #000}" +
		 ".switch {border-color: #FFFFCC}",
	settings: {background: "#FFFFCC", color: "#000"}
};
bbcsr.styles.lowcontrast =
{
	name: "Low contrast",
	css: "#blq-main {background: #ccc; color: #333}" +
		 ".switch {border-color: #ccc}",
	settings: {background: "#ccc", color: "#333"}
};
bbcsr.styles.lowcontrast2 =
{
	name: "Low contrast 2",
	css: "#blq-main {background: #333; color: #ccc} a {color: #0ff}" +
		 "h1 {background-image: url(images/logo.png)}" +
		 ".switch {border-color: #333}",
	settings: {background: "#333", color: "#ccc"}
};


// FONTS
bbcsr.fonts = {};
/*bbcsr.fonts.none =
{
	name: "(default)",										// text value of option on settings page
	css: "* {font-family: arial, verdana, sans-serif}",		// string added to styles on index page
	settings: {fontFamily: "arial, verdana, sans-serif"}	// object applied to the style options in settings select
};*/
bbcsr.fonts.verdana =
{
	name: "Verdana",
	css: "* {font-family: verdana, arial, sans-serif}",
	settings: {fontFamily: "verdana, arial, sans-serif"}
};
bbcsr.fonts.arial =
{
	name: "Arial",											// text value of option on settings page
	css: "* {font-family: arial, verdana, sans-serif}",		// string added to styles on index page
	settings: {fontFamily: "arial, verdana, sans-serif"}	// object applied to the style options in settings select
};
bbcsr.fonts.courier =
{
	name: "Courier",
	css: "* {font-family: \"Courier New\", courier, monospaced, serif}",
	settings: {fontFamily: "\"Courier New\", courier, monospaced, serif"}
};
bbcsr.fonts.times =
{
	name: "Times",
	css: "* {font-family: \"Times New Roman\", serif}",
	settings: {fontFamily: "\"Times New Roman\", times, serif"}
};


// FEEDS
var feed = new bbcsr.Feed(
{
	id: "home",												// id to store in cookie
	title: "Newsround Headlines",							// feed title
	url: "xml/homepage_stories.xml",						// path to feed xml - relative to index.shtml
	logo: "images/home.jpg",								// path to logo image - relative to index.shtml
	parse: window.parseFeed									// reference to function that parses feed xml
});
var feed = new bbcsr.Feed(
{
	id: "uk",
	title: "UK News",
	url: "xml/uk_stories.xml",
	logo: "images/uk.jpg",
	parse: window.parseFeed
});
var feed = new bbcsr.Feed(
{
	id: "world",
	title: "World News",
	url: "xml/world_stories.xml",
	logo: "images/world.jpg",
	parse: window.parseFeed
});
var feed = new bbcsr.Feed(
{
	id: "sport",
	title: "Sports News",
	url: "xml/sport_stories.xml",
	logo: "images/sport.jpg",
	parse: window.parseFeed
});
/*var feed = new bbcsr.Feed(
{
	id: "music",
	title: "Music News",
	url: "xml/music_stories.xml",
	logo: "images/music.jpg",
	parse: window.parseFeed
});
var feed = new bbcsr.Feed(
{
	id: "tvfilm",
	title: "TV & Film",
	url: "xml/tv_film_stories.xml",
	logo: "images/tvfilm.jpg",
	parse: window.parseFeed
});*/
var feed = new bbcsr.Feed(
{
	id: "animals",
	title: "Animal News",
	url: "xml/animals_stories.xml",
	logo: "images/nature.jpg",
	parse: window.parseFeed
});
/*var feed = new bbcsr.Feed(
{
	id: "science",
	title: "Science & Technology News",
	url: "xml/sci_tech_stories.xml",
	logo: "images/science.jpg",
	parse: window.parseFeed
});*/
var feed = new bbcsr.Feed( // add correct values when known
{
	id: "showbiz",
	title: "Showbiz",
	url: "xml/showbiz_stories.xml",
	logo: "images/showbiz.jpg",
	parse: window.parseFeed
});

// CONSTANTS
bbcsr.INDEX_FILE = "index.shtml"							//
bbcsr.SETTINGS_FILE = "settings.shtml"						//
bbcsr.COOKIE_PREFIX = "bbcsr_";								// prefix for all cookie names
bbcsr.COOKIE_EXPIRY = "+1y";								// cookie expiry time - see bbcjs.lib.date.dateFromNow()
bbcsr.COOKIE_PATH = "/cbbc/newsreader";		//	/cbbc/newsreader		// cookie path (default "/")
bbcsr.COOKIE_DOMAIN = null;									// cookie domain (default "bbc.co.uk")
bbcsr.NUM_ITEMS = 6;										// max num articles to show per feed
bbcsr.MENU_ITEMS_PER_ROW = 3;								// max num icons per row on main menu
bbcsr.MENU_SETTINGS_PER_ROW = 3;							// max num selects per row for feed settings
bbcsr.VOICE_PATH = "http://downloads.bbc.co.uk/cbbc/newsreader/voice/{type}_{id}_{voice}.mp3"			// path to article mp3s, relative to index, with trailing slash
bbcsr.VOICE_PATH_UI = "http://downloads.bbc.co.uk/cbbc/newsreader/voice/ui/{type}_{id}_{voice}.mp3"	// path to article mp3s, relative to index, with trailing slash
bbcsr.SPEECH_SWF = "flash/player2.swf"						// path to player.swf, relative to index


// DEFAULT USER SETTINGS
bbcsr.DEFAULT_SETTINGS =
{
	speech: "1",											// read text allowed - 0 (off)/1 (on)
	voice: "female",										// selected voice from bbcsr.voices array
	volume: "80",											// volume of voice - 0-100
	scan: "1",												// scan through buttons - 0/1
	scan_color: "#0f0",										// hilight color for scan
	scan_delay: "5",										// period bewteen scanning (secs)
	style: "standard",										// id of default style
	font: "verdana",										// id of default font
	capitals: "0",											// all capitals - 0/1
	bold: "0"												// all bold - 0/1
};
