
// PoliticsWeb v3.0
// Copyright Michael Dent
// michael@politicsweb.co.uk

// 1. Menu
// 2. Ajax framework
// 3. Comments
// 4. Show/hide full post
// 5. Lookup postcode


// 1. Menu

function openMenu(id) {
	if (document.getElementById('sub-' + id).style.left == '') {
		document.getElementById('sub-' + id).style.left = findPosX(document.getElementById('menu-' + id)) + 'px';
	}
	document.getElementById('sub-' + id).style.display = 'block';
	document.getElementById('menu-' + id).classid += ' cur';
	if (typeof closetimer != 'undefined') {
		if (typeof lastopened != 'undefined') {
			if (lastopened == id) clearTimeout(closetimer);
		}
	}
	lastopened = id;
}

function closeMenu(id) {
	closetimer = setTimeout("document.getElementById('sub-" + id + "').style.display='';oldclass=document.getElementById('menu-" + id + "').classid;newclass=oldclass.replace(/cur/g,'');document.getElementById('menu-" + id + "').classid=newclass;", 100);
}

function findPosX(obj) {
	var curleft = 0;
	if (obj.offsetParent) {
		while(1) {
			curleft += obj.offsetLeft;
			if(!obj.offsetParent) break;
			obj = obj.offsetParent;
		}
	} else if (obj.x) {
		curleft += obj.x;
	}
	return curleft;
}


// 2. Ajax framework

function createAjax(page) {
	xmlHttp = ((window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP.3.0"));
	xmlHttp.open("POST", page, true);
	xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
}


// 3. Comments

function comments(reference) {
	el = document.getElementById(reference);
	el2 = document.getElementById('post-' + reference);
	if (el.style.display == 'block') {
		el.style.display = '';
		el2.style.display = '';
	} else {
		el.style.display = 'block';
		el2.style.display = 'block';
	}
}

function postComment(reference,details) {
	el = document.getElementById('post-' + reference);
	html  = '<form onsubmit="ajaxComment(\'' + reference + '\',\'' + details + '\'); return false;">';
	html += 'Name:<br /><input type="text" id="comment-name" /><br /><br />Comment:<br /><textarea id="comment"></textarea><br /><br />';
	if (userEmailAuthentication) {
		html += 'Email (not public):<br /><input type="text" id="comment-email" /><br /><br />';
	} else {
		html += '<input type="hidden" id="comment-email" value="n/a" />';
	}
	if (userPostcodeLookup) {
		html += 'Postcode (not public):<br /><input type="text" id="comment-postcode" /><br /><br />';
	} else {
		html += '<input type="hidden" id="comment-postcode" value="n/a" />';
	}
	html += '<input type="submit" value="Post comment" id="btn-post"></form>';
	el.innerHTML = html;
	document.getElementById('comment-name').focus();
}

function deleteComment(id) {
	createAjax("/calls/comment.php");
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
			if (xmlHttp.responseText == 'success') {
				child = document.getElementById('comment-' + id);
				parent = child.parentNode;
				parent.removeChild(child);
			}
		}
	};
	vars = 'delete=' + id;
	xmlHttp.send(vars);
}

function ajaxComment(reference,details) {
	theReference = reference;
	theDetails = details;
	if (userPostcodeLookup) {
		lookupPostcode(document.getElementById('comment-postcode').value,'commentConstituencyReceived');
	} else {
		doSubmitForm();
	}
}

function commentConstituencyReceived(r) {
	document.getElementById('comment-postcode').value = r.name;
	doAjaxComment();
}

function doAjaxComment() {
	reference = theReference;
	details = theDetails;
	name = document.getElementById('comment-name').value;
	comment = document.getElementById('comment').value;
	email = document.getElementById('comment-email').value;
	postcode = document.getElementById('comment-postcode').value;
	document.getElementById('btn-post').disabled = true;
	createAjax("/calls/comment.php");
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
			if (xmlHttp.responseText == 'success') {
				document.getElementById(reference).innerHTML += '<p>' + comment + '<br />- <strong>' + name + '</strong></p>';
				el = document.getElementById('post-' + reference);
				el.innerHTML = '<a href="javascript:postComment(\'' + reference + '\',\'' + details + '\');">Post a comment</a>';
			} else if (xmlHttp.responseText == 'approval') {
				alert('Your comment has been received and saved, and will appear on the website shortly subject to approval.');
				el = document.getElementById('post-' + reference);
				el.innerHTML = '<a href="javascript:postComment(\'' + reference + '\',\'' + details + '\');">Post a comment</a>'
			} else if (xmlHttp.responseText == 'email') {
				alert('Thank you for your comment. As a final step, please click the link in your email to confirm your email address.');
				el = document.getElementById('post-' + reference);
				el.innerHTML = '<a href="javascript:postComment(\'' + reference + '\',\'' + details + '\');">Post a comment</a>'
			} else if (xmlHttp.responseText == 'politicsweb') {
				alert('Please do not post a comment with a name containing \'PoliticsWeb\'.');
				el = document.getElementById('post-' + reference);
				el.innerHTML = '<a href="javascript:postComment(\'' + reference + '\',\'' + details + '\');">Post a comment</a>'
			} else {
				alert(xmlHttp.responseText);
			}
		}
	};
	comment = comment.replace('&','###');
	vars = 'url=' + window.location + '&reference=' + reference + '&details=' + details + '&name=' + name + '&comment=' + comment + '&email=' + email + '&postcode=' + postcode;
	xmlHttp.send(vars);
}


// 4. Show/hide full post

function fullPost(id) {
	document.getElementById('short-post-' + id).style.display = 'none';
	document.getElementById('full-post-' + id).style.display = 'block';
}

function shortPost(id) {
	document.getElementById('full-post-' + id).style.display = 'none';
	document.getElementById('short-post-' + id).style.display = 'block';
}


// 5. Lookup postcode

function lookupPostcode(pc,callback) {
	var s = document.createElement('script');
	var url = 'http://www.theyworkforyou.com/api/getConstituency?key=BXJpE7BgtQM6DXMS84C2eGDn&callback=' + callback + '&postcode=' + pc;
	s.setAttribute('src', url);
	s.setAttribute('type', 'text/javascript');
	document.getElementsByTagName('head')[0].appendChild(s);
}


function seeOlder(content,show,more) {
	createAjax("/calls/module.php?x=blog");
	more = more-10;
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
			document.getElementById('see-older').innerHTML = xmlHttp.responseText;
			document.getElementById('see-older-link').href = 'javascript:seeOlder(' + content + ',' + newshow + ',' + more + ');';
			document.getElementById('see-older-link').innerHTML = 'See older posters (' + more + ' more)';
			document.getElementById('see-older-link').style.display = '';
			document.getElementById('see-older-loading').style.display = '';
		}
	};
	xmlHttp.send('content=' + content + '&show=' + show);
	newshow = show+10;
	document.getElementById('see-older-link').style.display = 'none';
	document.getElementById('see-older-loading').style.display = 'block';
}

function sendUserMap() {
	createAjax("/calls/module.php?x=map");
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
			if (xmlHttp.responseText == 'success') {
				window.location.reload();
			} else if (xmlHttp.responseText == 'approval') {
				alert('Your map post has been received and saved, and will appear on the website shortly subject to approval.');
				window.location.reload();
			} else {
				alert(xmlHttp.responseText);
			}
		}
	};
	els = document.getElementById('add-issue').elements;
	vars = '';
	for (var i = 0; i < els.length; i++) {
		if (els[i].name != '') vars += els[i].name + "=" + els[i].value + '&';
	}
	vars = vars.slice(0,(vars.length-1)); 
	xmlHttp.send(vars);
}

function deleteMapPost(id) {
	createAjax("/calls/module.php?x=map");
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
			if (xmlHttp.responseText == 'success') {
				window.location.reload();
			}
		}
	};
	vars = 'delete=' + id;
	xmlHttp.send(vars);
}

function setIcons() {
	icons = new Array();
	icons['blue-marker'] = new GIcon();
	icons['blue-marker'].image = "/images/marker.png";
	icons['blue-marker'].iconSize = new GSize(20, 34);
	icons['blue-marker'].iconAnchor = new GPoint(9, 34);
	icons['red-exclamation'] = new GIcon();
	icons['red-exclamation'].image = "/images/exclamation.png";
	icons['red-exclamation'].iconSize = new GSize(32, 32);
	icons['red-exclamation'].iconAnchor = new GPoint(9, 34);
}

function addMarker() {
	window.onmousemove = mouseFollower;
	document.getElementById("add-marker-img").style.opacity = '0.3';
	document.getElementById("add-marker-img").style.filter = 'alpha(opacity=30)';
	img = new Image();
	img.src = '/images/marker-ticked.png';
	GEvent.addListener(gmap, "click", function(overlay, latlng) {
		if (document.getElementById("location").value == '') {
			markericon = icons['blue-marker'];
			mymarker = new GMarker(latlng,markericon);
			gmap.addOverlay(mymarker);
			document.getElementById('mouse-follower').style.display = '';
			window.onmousemove = '';
			document.getElementById("location").value = latlng;
			document.getElementById("add-marker-img").onclick = '';
			document.getElementById("add-marker-img").src = '/images/marker-ticked.png';
			document.getElementById("add-marker-img").style.opacity = '';
			document.getElementById("add-marker-img").style.filter = '';
		}
	});
}

function addMarkerAdmin() {
	div = document.getElementById('map');
	div.style.position = 'absolute';
	div.style.top = '0';
	div.style.left = '0';
	div.style.width = '100%';
	div.style.height = '500px';
	div.style.zIndex = '8';
	document.getElementById('icon').style.visibility = 'hidden';
	load();
	window.onmousemove = mouseFollower;
	document.getElementById("add-marker-img").style.opacity = '0.3';
	document.getElementById("add-marker-img").style.filter = 'alpha(opacity=30)';
	img = new Image();
	img.src = '/images/marker-ticked.png';
	GEvent.addListener(gmap, "click", function(overlay, latlng) {
		if (document.getElementById("location").value == '') {
			markericon = icons['blue-marker'];
			mymarker = new GMarker(latlng,markericon);
			gmap.addOverlay(mymarker);
			document.getElementById('mouse-follower').style.display = '';
			window.onmousemove = '';
			document.getElementById("location").value = latlng;
			document.getElementById("add-marker-img").onclick = '';
			document.getElementById("add-marker-img").src = '/images/marker-ticked.png';
			document.getElementById("add-marker-img").style.opacity = '';
			document.getElementById("add-marker-img").style.filter = '';
			setTimeout("document.getElementById('map').style.display = 'none';",500);
			setTimeout("document.getElementById('icon').style.visibility = '';",500);
		}
	});
}


function createMarker(lat,lng,id,icon) {
	latlng = new GLatLng(lat,lng);
	markericon = icons[icon];
	mymarker = new GMarker(latlng,markericon);
	GEvent.addListener(mymarker, "click", function() {
		window.location.href = '#' + id;
		document.getElementById('map-post-' + id).style.backgroundColor = '#fffde5';
		setTimeout("document.getElementById('map-post-" + id + "').style.backgroundColor = ''",800);
	});
	gmap.addOverlay(mymarker);
}

function mouseFollower(e) {
	document.getElementById('mouse-follower').style.display = 'block';
	img = document.getElementById('mouse-follower');
	var mouseX = 0;
	var mouseY = 0;
	if (!e) var e = window.event;
	if (e.pageX || e.pageY) 	{
		mouseX = e.pageX;
		mouseY = e.pageY;
	}
	else if (e.clientX || e.clientY) 	{
		mouseX = e.clientX + document.body.scrollLeft
			+ document.documentElement.scrollLeft;
		mouseY = e.clientY + document.body.scrollTop
			+ document.documentElement.scrollTop;
	}
	mouseX -= 10;
	mouseY -= 34;
	img.style.left = mouseX + 'px';
	img.style.top = mouseY + 'px';
}

function newsletterSubscribe() {
	createAjax("/calls/module.php?x=newsletter");
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
			if (xmlHttp.responseText == 'success') {
				document.getElementById('newsletter-subscribe').innerHTML = '<strong>Thank you!</strong> You have been successfully subscribed to the newsletter.';
			} else {
				alert(xmlHttp.responseText);
			}
		}
	};
	els = document.getElementById('newsletter-subscribe').elements;
	vars = '';
	for (var i = 0; i < els.length; i++) {
		if (els[i].name != '') vars += els[i].name + "=" + els[i].value + '&';
	}
	vars = vars.slice(0,(vars.length-1)); 
	xmlHttp.send(vars);
}

function unsubscribePerson(id) {
	createAjax("/calls/module.php?x=newsletter");
	xmlHttp.onreadystatechange = function() { 
		if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
			document.getElementById('p' + xmlHttp.responseText).parentNode.removeChild(document.getElementById('p' + xmlHttp.responseText));
		}
	};
	vars = 'delete=' + id;
	xmlHttp.send(vars);
}

function niceDuration(secs) {
	if (secs > 59) {
		mins = secs/60;
		if (mins > 59) {
			hours = Math.floor(mins/60);
			mins = Math.floor(mins-(hours*60));
			time = hours + " hours " + mins + " mins";
		} else {
			mins = mins.toFixed(1);
			time = mins + " minutes";
		}
	} else {
		time = secs + " seconds";
	}
	return time;
}

function startSend() {
	emailsRemaining = totalEmails;
	readyToFinish = false;
	document.getElementById('send-newsletter-button').style.display = 'none';
	document.getElementById('progress-bar').style.display = 'block';
	document.getElementById('sending-newsletter').style.display = 'block';
	sendMessage(1);
}

function sendMessage(sendNum) {
	document.getElementById('sending-newsletter-h3').style.visibility = 'hidden';
	setTimeout("document.getElementById('sending-newsletter-h3').style.visibility=''",100);
	emailsRemaining--;
	if (emailsRemaining == 0) readyToFinish = true;
	timeRemaining = emailsRemaining * sendDelay;
	document.getElementById('time-remaining').innerHTML = niceDuration(timeRemaining);
	barWidth = (totalEmails-emailsRemaining)/totalEmails*100;
	barWidth = barWidth.toFixed(1);
	document.getElementById('progress-bar-inner').style.width = barWidth + '%';
	createAjax("/calls/module.php?x=newsletter");
	xmlHttp.onreadystatechange = function() { 
		if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
			if (readyToFinish) sendingComplete();
		}
	};
	isLast = (readyToFinish) ? 1 : 0;
	vars = 'do-send=' + newsletterId + '&send-to=' + sendTo + '&send-to-list=' + sendToList + '&send-num=' + sendNum + '&is-last=' + isLast;
	xmlHttp.send(vars);
	sendNum++;
	if (!readyToFinish) setTimeout("sendMessage("+sendNum+")",sendDelay*1000);
}

function sendingComplete() {
	document.getElementById('sending-newsletter').style.display = '';
	document.getElementById('progress-bar').style.display = '';
	document.getElementById('newsletter-sent').style.display = 'block';
}



/* Ultimate Fade-in slideshow (v2.0)
* Last updated: Sept 10th, 2009. This notice must stay intact for usage 
* Author: Dynamic Drive at http://www.dynamicdrive.com/
* Visit http://www.dynamicdrive.com/ for full source code
*/

var fadeSlideShow_descpanel={
	controls: [['x.png',7,7], ['restore.png',10,11], ['loading.gif',54,55]], //full URL and dimensions of close, restore, and loading images
	fontStyle: 'normal 11px Verdana', //font style for text descriptions
	slidespeed: 200 //speed of description panel animation (in millisec)
}

function fadeSlideShow(settingarg){
	this.setting=settingarg
	settingarg=null
	var setting=this.setting
	setting.fadeduration=setting.fadeduration? parseInt(setting.fadeduration) : 500
	setting.curimage=(setting.persist)? fadeSlideShow.routines.getCookie("gallery-"+setting.wrapperid) : 0
	setting.curimage=setting.curimage || 0 //account for curimage being null if cookie is empty
	setting.currentstep=0 //keep track of # of slides slideshow has gone through (applicable in displaymode='auto' only)
	setting.totalsteps=setting.imagearray.length*(setting.displaymode.cycles>0? setting.displaymode.cycles : Infinity) //Total steps limit (applicable in displaymode='auto' only w/ cycles>0)
	setting.fglayer=0, setting.bglayer=1 //index of active and background layer (switches after each change of slide)
	setting.oninit=setting.oninit || function(){}
	setting.onslide=setting.onslide || function(){}
	var preloadimages=[] //preload images
	setting.longestdesc="" //get longest description of all slides. If no desciptions defined, variable contains ""
	for (var i=0; i<setting.imagearray.length; i++){ //preload images
		preloadimages[i]=new Image()
		preloadimages[i].src=setting.imagearray[i][0]
		if (setting.imagearray[i][3] && setting.imagearray[i][3].length>setting.longestdesc.length)
			setting.longestdesc=setting.imagearray[i][3]
	}
	var closebutt=fadeSlideShow_descpanel.controls[0] //add close button to "desc" panel if descreveal="always"
	setting.closebutton=(setting.descreveal=="always")? '<img class="close" src="'+closebutt[0]+'" style="float:right;cursor:hand;cursor:pointer;width:'+closebutt[1]+'px;height:'+closebutt[2]+'px;margin-left:2px" title="Hide Description" />' : ''
	var slideshow=this
	jQuery(document).ready(function($){ //fire on DOM ready
		var setting=slideshow.setting
		var fullhtml=fadeSlideShow.routines.getFullHTML(setting.imagearray) //get full HTML of entire slideshow
		setting.$wrapperdiv=$('#'+setting.wrapperid).css({position:'relative', visibility:'visible', background:'black', overflow:'hidden', width:setting.dimensions[0], height:setting.dimensions[1]}).empty() //main slideshow DIV
		if (setting.$wrapperdiv.length==0){ //if no wrapper DIV found
			alert("Error: DIV with ID \""+setting.wrapperid+"\" not found on page.")
			return
		}
		setting.$gallerylayers=$('<div class="gallerylayer"></div><div class="gallerylayer"></div>') //two stacked DIVs to display the actual slide 
			.css({position:'absolute', left:0, top:0, width:'100%', height:'100%', background:'black'})
			.appendTo(setting.$wrapperdiv)
		var $loadingimg=$('<img src="'+fadeSlideShow_descpanel.controls[2][0]+'" style="position:absolute;width:'+fadeSlideShow_descpanel.controls[2][1]+';height:'+fadeSlideShow_descpanel.controls[2][2]+'" />')
			.css({left:setting.dimensions[0]/2-fadeSlideShow_descpanel.controls[2][1]/2, top:setting.dimensions[1]/2-fadeSlideShow_descpanel.controls[2][2]}) //center loading gif
			.appendTo(setting.$wrapperdiv)
		var $curimage=setting.$gallerylayers.html(fullhtml).find('img').hide().eq(setting.curimage) //prefill both layers with entire slideshow content, hide all images, and return current image
		if (setting.longestdesc!=""){ //if at least one slide contains a description (feature is enabled)
			fadeSlideShow.routines.adddescpanel($, setting)
			if (setting.descreveal=="always"){ //position desc panel so it's visible to begin with
				setting.$descpanel.css({top:setting.dimensions[1]-setting.panelheight})
				setting.$descinner.click(function(e){ //asign click behavior to "close" icon
					if (e.target.className=="close"){
						slideshow.showhidedescpanel('hide')
					}
				})
				setting.$restorebutton.click(function(e){ //asign click behavior to "restore" icon
					slideshow.showhidedescpanel('show')
					$(this).css({visibility:'hidden'})
				})
			}
			else{ //display desc panel on demand (mouseover)
				setting.$wrapperdiv.bind('mouseenter', function(){slideshow.showhidedescpanel('show')})
				setting.$wrapperdiv.bind('mouseleave', function(){slideshow.showhidedescpanel('hide')})
			}
		}
		setting.$wrapperdiv.bind('mouseenter', function(){setting.ismouseover=true}) //pause slideshow mouseover
		setting.$wrapperdiv.bind('mouseleave', function(){setting.ismouseover=false})
		if ($curimage.get(0).complete){ //accounf for IE not firing image.onload
			$loadingimg.hide()
			slideshow.paginateinit($)
			slideshow.showslide(setting.curimage)
		}
		else{ //initialize slideshow when first image has fully loaded
			$loadingimg.hide()
			slideshow.paginateinit($)
			$curimage.bind('load', function(){slideshow.showslide(setting.curimage)})
		}
		setting.oninit.call(slideshow) //trigger oninit() event
		$(window).bind('unload', function(){ //clean up and persist
			if (slideshow.setting.persist) //remember last shown image's index
				fadeSlideShow.routines.setCookie("gallery-"+setting.wrapperid, setting.curimage)
			jQuery.each(slideshow.setting, function(k){
				if (slideshow.setting[k] instanceof Array){
					for (var i=0; i<slideshow.setting[k].length; i++){
						if (slideshow.setting[k][i].tagName=="DIV") //catches 2 gallerylayer divs, gallerystatus div
							slideshow.setting[k][i].innerHTML=null
						slideshow.setting[k][i]=null
					}
				}
			})
			slideshow=slideshow.setting=null
		})
	})
}

fadeSlideShow.prototype={

	navigate:function(keyword){
		var setting=this.setting
		clearTimeout(setting.playtimer)
		if (setting.displaymode.type=="auto"){ //in auto mode
			setting.displaymode.type="manual" //switch to "manual" mode when nav buttons are clicked on
			setting.displaymode.wraparound=true //set wraparound option to true
		}
		if (!isNaN(parseInt(keyword))){ //go to specific slide?
			this.showslide(parseInt(keyword))
		}
		else if (/(prev)|(next)/i.test(keyword)){ //go back or forth inside slide?
			this.showslide(keyword.toLowerCase())
		}
	},

	showslide:function(keyword){
		var slideshow=this
		var setting=slideshow.setting
		if (setting.displaymode.type=="auto" && setting.ismouseover && setting.currentstep<=setting.totalsteps){ //if slideshow in autoplay mode and mouse is over it, pause it
			setting.playtimer=setTimeout(function(){slideshow.showslide('next')}, setting.displaymode.pause)
			return
		}
		var totalimages=setting.imagearray.length
		var imgindex=(keyword=="next")? (setting.curimage<totalimages-1? setting.curimage+1 : 0)
			: (keyword=="prev")? (setting.curimage>0? setting.curimage-1 : totalimages-1)
			: Math.min(keyword, totalimages-1)
		var $slideimage=setting.$gallerylayers.eq(setting.bglayer).find('img').hide().eq(imgindex).show() //hide all images except current one
		var imgdimensions=[$slideimage.width(), $slideimage.height()] //center align image
		$slideimage.css({marginLeft: (imgdimensions[0]>0 && imgdimensions[0]<setting.dimensions[0])? setting.dimensions[0]/2-imgdimensions[0]/2 : 0})
		$slideimage.css({marginTop: (imgdimensions[1]>0 && imgdimensions[1]<setting.dimensions[1])? setting.dimensions[1]/2-imgdimensions[1]/2 : 0})
		setting.$gallerylayers.eq(setting.bglayer).css({zIndex:1000, opacity:0}) //background layer becomes foreground
			.stop().css({opacity:0}).animate({opacity:1}, setting.fadeduration, function(){ //Callback function after fade animation is complete:
				clearTimeout(setting.playtimer)
				try{
					setting.onslide.call(slideshow, setting.$gallerylayers.eq(setting.fglayer).get(0), setting.curimage)
				}catch(e){
					alert("Fade In Slideshow error: An error has occured somwhere in your code attached to the \"onslide\" event: "+e)
				}
				setting.currentstep+=1
				if (setting.displaymode.type=="auto"){
					if (setting.currentstep<=setting.totalsteps || setting.displaymode.cycles==0)
						setting.playtimer=setTimeout(function(){slideshow.showslide('next')}, setting.displaymode.pause)
				}
			}) //end callback function
		setting.$gallerylayers.eq(setting.fglayer).css({zIndex:999}) //foreground layer becomes background
		setting.fglayer=setting.bglayer
		setting.bglayer=(setting.bglayer==0)? 1 : 0
		setting.curimage=imgindex
		if (setting.$descpanel)
			setting.$descpanel.css({visibility:(setting.imagearray[imgindex][3])? 'visible' : 'hidden'})
		if (setting.imagearray[imgindex][3])
			setting.$descinner.empty().html(setting.closebutton + setting.imagearray[imgindex][3])
		if (setting.displaymode.type=="manual" && !setting.displaymode.wraparound){
			this.paginatecontrol()
		}
		if (setting.$status) //if status container defined
			setting.$status.html(setting.curimage+1 + "/" + totalimages)
	},

	showhidedescpanel:function(state, showcontrol){
		var setting=this.setting
		var endpoint=(state=="show")? setting.dimensions[1]-setting.panelheight : this.setting.dimensions[1]
		setting.$descpanel.stop().animate({top:endpoint}, fadeSlideShow_descpanel.slidespeed, function(){
			if (setting.descreveal=="always" && state=="hide")
				setting.$restorebutton.css({visibility:'visible'}) //show restore button
		})
	},

	paginateinit:function($){
		var slideshow=this
		var setting=this.setting
		if (setting.togglerid){ //if toggler div defined
			setting.$togglerdiv=$("#"+setting.togglerid)
			setting.$prev=setting.$togglerdiv.find('.prev').data('action', 'prev')
			setting.$next=setting.$togglerdiv.find('.next').data('action', 'next')
			setting.$prev.add(setting.$next).click(function(e){ //assign click behavior to prev and next controls
				var $target=$(this)
				slideshow.navigate($target.data('action'))
				e.preventDefault()
			})
			setting.$status=setting.$togglerdiv.find('.status')
		}
	},

	paginatecontrol:function(){
		var setting=this.setting
			setting.$prev.css({opacity:(setting.curimage==0)? 0.4 : 1}).data('action', (setting.curimage==0)? 'none' : 'prev')
			setting.$next.css({opacity:(setting.curimage==setting.imagearray.length-1)? 0.4 : 1}).data('action', (setting.curimage==setting.imagearray.length-1)? 'none' : 'next')
			if (document.documentMode==8){ //in IE8 standards mode, apply opacity to inner image of link
				setting.$prev.find('img:eq(0)').css({opacity:(setting.curimage==0)? 0.4 : 1})
				setting.$next.find('img:eq(0)').css({opacity:(setting.curimage==setting.imagearray.length-1)? 0.4 : 1})
			}
	}

	
}

fadeSlideShow.routines={

	getSlideHTML:function(imgelement){
		var layerHTML=(imgelement[1])? '<a href="'+imgelement[1]+'" target="'+imgelement[2]+'">\n' : '' //hyperlink slide?
		layerHTML+='<img src="'+imgelement[0]+'" style="border-width:0;" />\n'
		layerHTML+=(imgelement[1])? '</a>\n' : ''
		return layerHTML //return HTML for this layer
	},

	getFullHTML:function(imagearray){
		var preloadhtml=''
		for (var i=0; i<imagearray.length; i++)
			preloadhtml+=this.getSlideHTML(imagearray[i])
		return preloadhtml
	},

	adddescpanel:function($, setting){
		setting.$descpanel=$('<div class="fadeslidedescdiv"></div>')
			.css({position:'absolute', visibility:'hidden', width:'100%', left:0, top:setting.dimensions[1], font:fadeSlideShow_descpanel.fontStyle, zIndex:'1001'})
			.appendTo(setting.$wrapperdiv)
		$('<div class="descpanelbg"></div><div class="descpanelfg"></div>') //create inner nav panel DIVs
			.css({position:'absolute', left:0, top:0, width:setting.$descpanel.width()-8, padding:'4px'})
			.eq(0).css({background:'black', opacity:0.7}).end() //"descpanelbg" div
			.eq(1).css({color:'white'}).html(setting.closebutton + setting.longestdesc).end() //"descpanelfg" div
			.appendTo(setting.$descpanel)
		setting.$descinner=setting.$descpanel.find('div.descpanelfg')
		setting.panelheight=setting.$descinner.outerHeight()
		setting.$descpanel.css({height:setting.panelheight}).find('div').css({height:'100%'})
		if (setting.descreveal=="always"){ //create restore button
			setting.$restorebutton=$('<img class="restore" title="Restore Description" src="' + fadeSlideShow_descpanel.controls[1][0] +'" style="position:absolute;visibility:hidden;right:0;bottom:0;z-index:1002;width:'+fadeSlideShow_descpanel.controls[1][1]+'px;height:'+fadeSlideShow_descpanel.controls[1][2]+'px;cursor:pointer;cursor:hand" />')
				.appendTo(setting.$wrapperdiv)


		}
	},


	getCookie:function(Name){ 
		var re=new RegExp(Name+"=[^;]+", "i"); //construct RE to search for target name/value pair
		if (document.cookie.match(re)) //if cookie found
			return document.cookie.match(re)[0].split("=")[1] //return its value
		return null
	},

	setCookie:function(name, value){
		document.cookie = name+"=" + value + ";path=/"
	}
}

function populateTags() {
	document.getElementById('tags').innerHTML = '';
	tags = document.getElementById('param1').value.split('/');
	for (i=0; i<tags.length; i++) {
		parts = tags[i].split('###');
		if (parts[1] != null) {
			display = parts[0] + ' (' + parts[1] + ')';
		} else {
			display = parts[0];
		}
		moveUp = '';
		if (i != 0) moveUp = '<a href="javascript:moveTagUp(' + i + ');"><img src="http://files.politicsweb.co.uk/move-up.gif" class="move-up" /></a>';
		if (display != '') document.getElementById('tags').innerHTML += '<div>' + display + '<a href="javascript:deleteTag(' + i + ');"><img src="http://files.politicsweb.co.uk/icn-delete.png" class="delete" /></a>' + moveUp + '</div><br />';
	}
}

function deleteTag(num) {
	tags = document.getElementById('param1').value.split('/');
	tags.splice(num,1);
	if (tags[0] == '') tags.splice(0,1);
	tags = tags.join('/');
	document.getElementById('param1').value = tags;
	populateTags();
}

function moveTagUp(num) {
	tags = document.getElementById('param1').value.split('/');
	tag1 = tags[num];
	tag2 = tags[num-1];
	tags[num] = tag2;
	tags[num-1] = tag1;
	tags = tags.join('/');
	document.getElementById('param1').value = tags;
	populateTags();
}

function addTag() {
	loadPopup('<form onsubmit="doAddTag();return false;"><p>Tag:<br /><input type="text" id="add-tag" /></p><p>Label (optional):<br /><input type="text" id="add-tag-label" /></p><p>Position:<br /><select id="add-tag-position"><option value="top">Top of list</option><option value="bottom">Bottom of list</option></select></p><p><input type="submit" value="Add tag" /></p></form>');
	stylePopup(218,220);
	document.getElementById('add-tag').focus();
}

function doAddTag() {
	toAdd = document.getElementById('add-tag').value;
	if (document.getElementById('add-tag-label').value != '') toAdd += '###' + document.getElementById('add-tag-label').value;
	tags = document.getElementById('param1').value.split('/');
	if (document.getElementById('add-tag-position').value == 'top') {
		tags.unshift(toAdd);
	} else if (document.getElementById('add-tag-position').value == 'bottom') {
		tags.push(toAdd);
	}
	if (tags[0] == '') tags.splice(0,1);
	tags = tags.join('/');
	document.getElementById('param1').value = tags;
	populateTags();
	closePopup();
}



function submitForm(formid) {
	theFormId = formid;
	if (typeof(document.getElementById('postcode_lookup')) != 'undefined') {
		els = document.getElementById('form'+formid).elements;
		for (i=0;i<els.length;i++) {
			if (els[i].name == 'field' + document.getElementById('postcode_lookup').value) {
				pc = els[i].value;
			}
		}
		lookupPostcode(pc,'formConstituencyReceived');
	} else {
		doSubmitForm();
	}
}

function formConstituencyReceived(r) {
	document.getElementById('postcode_lookup').value = r.name;
	doSubmitForm();
}

function doSubmitForm() {
	formid = theFormId;
	createAjax("/calls/module.php?x=form");
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
			if (xmlHttp.responseText == 'security') {
				alert('Sorry, you filled the security form out incorrectly. Please check your answer and try again.');
			} else {
				thisForm.innerHTML = xmlHttp.responseText;
			}
		}
	};
	thisForm = document.getElementById('form'+formid);
	els = thisForm.elements;
	fields = [];
	for (i=0;i<els.length;i++) {
		if (els[i].name != 'postcode_lookup') {
			if (els[i].type == 'checkbox' || els[i].type == 'radio') {
				if (els[i].checked) {
					existed = false;
					for (j=0;j<fields.length;j++) {
						if (fields[j][0] == els[i].name) {
							value = fields[j][1];
							value = value.slice(0,(value.length-2)); 
							value += ',' + els[i].value + '}}';
							fields[j][1] = value;
							existed = true;
						}
					}
					if (!existed) {
						fields.push([els[i].name,'{{'+els[i].value+'}}']);
					}
				}
			} else {
				fields.push([els[i].name,els[i].value]);
			}
		}
	}
	vars = '';
	for (i=0;i<fields.length;i++) {
		vars += fields[i][0] + '=' + fields[i][1] + '&';
	}
	if (typeof(document.getElementById('postcode_lookup')) != 'undefined') {
		vars += 'postcode_lookup=' + document.getElementById('postcode_lookup').value + '&';
	}
	vars = vars.slice(0,(vars.length-1)); 
	xmlHttp.send(vars);
}

function renameField(fieldName,fieldId) {
	loadPopup('<form onsubmit="doRenameField(\'' + fieldId + '\');return false;"><p>Rename field <strong>' + fieldName + '</strong>:</p><p><input type="text" value="' + fieldName + '" id="rename-field" /></p><p><input type="submit" value="Rename field" /></p></form>');
	stylePopup(220,123);
	document.getElementById('rename-field').select();
}

function doRenameField(fieldId) {
	newName = document.getElementById('rename-field').value;
	if (newName != null) {
		loadPopup('<p id="loading"><img src="http://files.politicsweb.co.uk/loading.gif" /></p>');
		stylePopup(50,50);
		createAjax("/calls/module.php?x=form");
		xmlHttp.onreadystatechange = function() {
			if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
				closePopup();
				window.location.reload();
			}
		};
		xmlHttp.send('rename-field=' + newName + '&field=' + fieldId);
	}
}

function editOptions(fieldId,fieldName,options) {
	loadPopup('<form onsubmit="doEditOptions(\'' + fieldId + '\');return false;"><p>Edit options for <strong>' + fieldName + '</strong> (put each option on a new line):</p><p><textarea id="edit-options" style="width:350px;height:200px;">' + options.replace(/,/g,'\n') + '</textarea></p><p><input type="submit" value="Update" /></p></form>');
	stylePopup(390,300);
	document.getElementById('edit-options').focus();
}

function doEditOptions(fieldId) {
	newOptions = document.getElementById('edit-options').value;
	loadPopup('<p id="loading"><img src="http://files.politicsweb.co.uk/loading.gif" /></p>');
	stylePopup(50,50);
	createAjax("/calls/module.php?x=form");
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
			closePopup();
			window.location.reload();
		}
	};
	xmlHttp.send('edit-options=' + newOptions + '&field=' + fieldId);
}

//Settings

userEmailAuthentication = false;
userPostcodeLookup = true;