// Javascript functions for Pedlars 2.0
// Jquery and it's plugins must be loaded before this file
// originally this wasn't going to require a JS library, but client requested some features
// be added that were best achieved with jquery, so parts of this are standard JS, parts are jquery. 

// some globals
// swatches folder
var swatchdir = '/swatches/';
// for shopping kart
var theForm = 0; 
var useAsync = 1;

// sets up some stuff on every page, called from document.ready via skin
function pedLoader()
{
	if(document.getElementById('searchKeys'))
	{
		document.getElementById('searchKeys').value='Search our stuff';
		document.getElementById('searchKeys').onfocus=function () {document.getElementById('searchKeys').value='';};
	}
	if(document.getElementById('muser2') && document.getElementById('mcountry'))
	{// hide US state selector from non US users on billing/register forms
		var index = document.getElementById('mcountry').selectedIndex;
		USDisplay(document.getElementById('mcountry')[index]);
	}
	preloadAllImages();
	printMyAccount();
	printKartSummary();
	$('ul#megadd').find('.mddli').removeClass('mddli');
	$('ul#megadd').superfish({ 
	    hoverClass:    'sfHover',
	    pathClass:     'overideThisToUse',
	    pathLevels:    1,
	    delay:         400,
	    animation:     {opacity:'show'},
	    speed:         'fast',
	    autoArrows:    false,
	    dropShadows:   false,
	    disableHI:     false
	});
	// load homepage javascript if on homepage...
	if(document.getElementById('Carousel'))
	{
		pedHomeLoader();
	}
	if(document.getElementById('orderTrack'))
	{
		orderTrackLoader();
	}
	if(document.getElementById('pe_karttable'))
	{
		kartLoader();
	}
	$('.submitLink').each(function(e){	
		var html = $(this).html();
		var a = $('<a href="#"></a>');
		a.html(html);
		var classes = $(this).attr('class').split(/\s+/);
		for(var i in classes)
		{
			if(classes[i] != 'submitLink')
			{
				a.addClass(classes[i]);
			}
		}
		a.click(function(e){
			e.preventDefault();
			$(this).parents('form:first').submit();
		});
		var p = $('<p></p>').append(a)
		$(this).replaceWith(p);
	});
	$('.pedlarslink').click(trackedOutLink);
}

function kartLoader()
{
	
	$('.deletebutton').each(function(){
		$(this).css({
			'position': 'static'
			,'top':0
		});
		$(this).click(function(e){
			e.preventDefault();
			$(this).parents('tr').find('input[name*=olnum]').val('0');
			kartRecalc();
		});
	});
	$('.pe_kartcol5').css({
		'visibility' : 'visible'
	});
	$('.oluser1').click(olgifthandler);
	var recalcs = new Array();
	recalcs.push($('input[name*=olnum]'));
	recalcs.push($('input[name=offercode]'));
	recalcs.push($('#oshipm'));
	$(recalcs).each(function(){
		$(this).change(function(){
			kartRecalc();
		});
	});
	$('.recalc').css({
		'visibility': 'hidden',
		'height': '1px'
	});
}
// this is such a bad idea...
function kartRecalc()
{
	$('#kartcalc').click();
	$('#waiting').modal({
		containerId: "modalLoading"
	});
}
function olgifthandler(e) 
{
	var thecheckbox = $(this);
	if(! thecheckbox.is(':checked'))
	{
		kartRecalc();
		return true;
	}
	var hiddentext = thecheckbox.parents('td').eq(0).find('input[name*=_TEXT]');
	
	var popform = $('<form></form>');
	var popta = $('<textarea name="themessage"></textarea>');
	popta.val(hiddentext.val());
	var sbt = $('<input type="image" alt="Attach this message to your gift." value="Add Message" src="/images/btns/addmessage.png" />');
	sbt.click(function(e){
		e.preventDefault();
		var txt = $(this).parents('form').eq(0).find('textarea[name=themessage]').val();
		hiddentext.val(txt);
		$(this).attr('disabled', 'disabled');
		hidePopup('modalOLG');
		kartRecalc();
	});
	var sbt_p = $('<p class="rocnt addmessage"></p>');
	sbt_p.append(sbt);
	popform.append(popta);
	popform.append(sbt_p);
	var closebtn = $('<a href="#" title="Close" class="olgclose">x</a>');
	closebtn.click(function(){
		thecheckbox.attr('checked',false);
		$.modal.close();
	});
	var popupcontents = $('<div></div>').append(closebtn).append('<h3>Add a personal message to this item to make this present even more special</h3>').append(popform);
	var theoffset = new Object();
	theoffset.left = -315;
	theoffset.top = -65;
	showPopup({
		modalID: 'modalOLG'
		,contents: popupcontents
		,callerelt: thecheckbox
		,offset: theoffset
		,fastclose: true
		,opencallback: function(){
			$('#modalOLG').find('textarea').focus();
		}
	});
}
// sets up some stuff on the product page, called from document.ready via skin
function prodLoader()
{
	// This sets the correct price/picture and shows/hides some elements on product pages
	if(document.getElementById('key_f'))
	{// multiple products on this page
		changeProduct(document.getElementById('key_f').value);
		if(document.getElementById('Prod_js_hide'))
		{
			document.getElementById('Prod_js_hide').className='invisible';
		}
		if(document.getElementById('ProdPrice'))
		{
			document.getElementById('ProdPrice').className='';
		}
		if(document.getElementById('ProdRRP'))
		{
			document.getElementById('ProdRRP').className='';
		}		
	}
	else if(document.getElementById('key_s'))
	{// one product on this page
		if(document.getElementById('alternateHolder'))
		{
			var alternates = document.getElementById('alternateHolder').getElementsByTagName('a');
			for(var i in alternates)
			{
				alternates[i].onclick=new Function("return viewAlternate('"+i+"')");
			}
		}
	}
	if(enableZoom == 1)
	{// product zoom
		var options = {
				     zoomWidth: 377,
				    zoomHeight: 547,
				         outTop: 43,
				       outRight: 30,
				      outBottom: 72,
				        outLeft: 20,
			            xOffset: 10,
			            yOffset: -36,
			   showEffect: 'fadein',
			           title: false,
			    fadeinSpeed: 'fast',
			  hideEffect: 'fadeout',
			 fadeoutSpeed: 'medium',
			    showPreload: 'true',
			   zoomType: 'standard',
			       position: "right" 
		};		
		$('.bigimg').jqzoom(options);
		// hack to stop wrongly positioned zoom on window resize
		$(window).bind('resize', function () {
			$('.bigimg').unbind();
			$('.bigimg').jqzoom(options);
		});
	}
}
function pedHomeLoader() {
	if($('#Carousel').length > 0) {
		if($('#Carousel').find('.module1').length > 0)
		{
			var ccount = 1;
			$('#Carousel').find('.module1').eq(0).css({
				'z-index': 5
			});
			$('#Carousel').find('.module').css({
				'position':'absolute'
				,'top': 0
				,'left': 0
				,'display': 'none'
			});
			$('#Carousel').find('.module1').eq(0).css({
				'z-index': 5
				,'display': 'block'
			});
			setInterval(function() {ccount = nextCarousel(ccount)},4000);
		}
		$('#Carousel').find('a').click(function(e){trackedIntLink(e,$(this),'carousel')});
	}
//	
//	var scroller = $('#Carousel').find('.scroller').eq(0);
//	scroller.css({
//		'position': 'absolute'
//		, 'left': 0
//		, 'top': 0
//		, 'z-index': 1
//	});
//	// duplicate last image to beginning of "scroller" so we can make the thing 
//	// always go left...
//	var lastmod = $('#Carousel').find('.module:last').clone(1);
//	lastmod.prependTo(scroller);
//	var scrollpos = new Array();
//	var i = 0;
//	scroller.find('.module').each(function() {
//		var pos = parseInt($(this).position().left);
//		scrollpos[i++] = -1 * pos;
//	});
//	scroller.css({
//		left: scrollpos[1] + 'px'
//	});	
//	
//	var idx = 1;
//	setInterval(function() {
//		if(++idx > (scrollpos.length - 1))
//		{
//			scroller.css({
//				left: scrollpos[0]
//			});
//			idx = 1;
//		}
//		var newpos = scrollpos[idx];
//		scroller.animate({
//			left: newpos+'px'
//		},1500);
//	},6000);
}

function nextCarousel(ccount) {
	var currentmodule = $('#Carousel').find('.module'+ccount).eq(0);
	var totalcount = $('#Carousel').find('.module').length;
	if(++ccount > totalcount)
	{
		ccount = 1;
	}
	var nextmodule = $('#Carousel').find('.module'+ccount).eq(0);
	currentmodule.css({
		'z-index':5
	});
	nextmodule.css({
		'display':'block'
		,'z-index':1
	});
	currentmodule.fadeOut(700,function() {
		currentmodule.css({
			'display':'none'
			,'z-index':1
		});
	});
	return ccount;
}

// set up the relevant onclick events for the async shopping kart
function asyncBasketLoader()
{
	$('form#prodform').submit(asyncBasket);
	$("form[name='buyform']").submit(asyncBasket);
}
// fills the relevant divs with greeting and links to my account/logout 
function printMyAccount() 
{
	if(getCookie('log'))
	{// logged in (or pretending to be for obtuse reasons)
		var username = 'Pedlars Customer';
		if(getCookie('member'))
		{
			username = getCookie('member');
		}
		$('#nameHolder').append('Welcome<br />'+username);
		$('#nameHolder').show();
		$('#signInLinks').removeClass('signInLinks');
		$('#signInLinks').addClass('signInLinks2');
		var signout = $('<a href="#">Logout</a>').click(logout);
		$('#register').replaceWith(signout);
	}
	else
	{
		$('#signIn').text('Login');
	}
//	if (document.getElementById('signInHolder'))
//	{
//		// create new stuff
//		// first welcome $username
//		var welcome = document.createElement("p");
//		welcome.className = 'welcomep';
//		var username = 'Pedlars Customer';
//		if(getCookie('member'))
//		{
//			username = getCookie('member');
//		}
//		var text = document.createTextNode('Welcome '+username);
//		welcome.appendChild(text);
//		// then create my account text with link to member page and logout
//		// memberpagelink is set in the skin. Yes there are probably better ways. Sue me. 
//		var memlink = 'http://www.pedlars.co.uk/cgi-bin/ped/pprint.pl?efile=login&mode=s';
//		if(memberpagelink)
//		{
//			memlink = memberpagelink;
//		}
//		var memanchor = document.createElement("a");
//		memanchor.setAttribute('href',memlink);
//		memanchor.appendChild(document.createTextNode('My account'));
//		var logoutanchor = document.createElement("a");
//		logoutanchor.setAttribute('href','javascript:logout()');
//		logoutanchor.appendChild(document.createTextNode('Log out'));
//		var myaccount = document.createElement("p");
//		myaccount.id="signIn";
//		// append new elements
//		myaccount.appendChild(welcome);
//		myaccount.appendChild(memanchor);
//		myaccount.appendChild(document.createElement("br"));
//		myaccount.appendChild(logoutanchor);
//		// get signin holder, remove sign in text, replace with new div, append anything else in there that's not sign in text
//		var sih = document.getElementById('signInHolder');
//		sih.removeChild(document.getElementById('signIn'));
//		// stick our new div in the sign in holder
//		if(sih.hasChildNodes())
//		{
//			sih.insertBefore(myaccount,sih.firstChild);
//		}
//		else
//		{
//			sih.appendChild(myaccount);
//		}
//	}
}
// prints shopping kart summary info
function printKartSummary() 
{
	if(document.getElementById('shoppingTotal'))
	{
		var kartsummary = getCookie('kartsummary');
		var ptotal = document.getElementById('shoppingTotal');
		var aitems = document.getElementById('shoppingBag');
		var Items = '0';
		var Money = '&pound;00.00';
		if(kartsummary !='')
		{
			var dashpos = kartsummary.indexOf('-');
			var Items = kartsummary.substring(0,dashpos);
			var Money = kartsummary.substring((dashpos+1),kartsummary.length);
		}
		ptotal.innerHTML = '<span class="space10px">Total</span>'+Money;
		aitems.innerHTML = Items + '<span class="items">Items</span>';
	}

}
// switches out product image and prices on product page
function changeProduct(key_f)
{
	if(document.getElementById('BigImageLink') && SKZoom[key_f] != undefined && SKZoom[key_f][0])
	{
		document.getElementById('BigImageLink').href=swatchdir+SKZoom[key_f][0];
		showZoom = 1;
	}
	else if (document.getElementById('BigImageLink'))
	{
		document.getElementById('BigImageLink').href='';
		showZoom = 0;
	}
	if(document.getElementById('BigImage') && SKImg[key_f] != undefined && SKImg[key_f][0])
	{
		document.getElementById('BigImage').src=swatchdir+SKImg[key_f][0];
	}
	if(document.getElementById('key_f'))
	{
		var myoptions = document.getElementById('key_f').options;
		// create an array mapping option position to sk_keyf
		var products = new Array();
		for(var i=0; i <myoptions.length;i++)
		{
			var optkey = myoptions[i].value;
			products[optkey] = i;
		}
		if(products[key_f] !=undefined)
		{
			document.getElementById('key_f').selectedIndex=products[key_f];
		}
	}
	if(document.getElementById('ProdPrice'))
	{
		var pp = document.getElementById('ProdPrice');
		while(pp.hasChildNodes())
		{
			pp.removeChild(pp.firstChild);
		}
		pp.appendChild(document.createTextNode('Price: '));
		var span = document.createElement('span');
		span.appendChild(document.createTextNode("\u00A3"+SKPrice[key_f]));
		pp.appendChild(span);
	}
	if(document.getElementById('ProdRRP'))
	{
		var pp = document.getElementById('ProdRRP');
		while(pp.hasChildNodes())
		{
			pp.removeChild(pp.firstChild);
		}
		if(SKPPrice[key_f])
		{
			pp.appendChild(document.createTextNode('Was: '));
			var span = document.createElement('span');
			//\u00A3 = pound sign in unicode
			span.appendChild(document.createTextNode("\u00A3"+SKPPrice[key_f]));
			pp.appendChild(span);
		}
	}
	if(document.getElementById('alternateHolder'))
	{
		var ah = document.getElementById('alternateHolder');
		var txt = getText(document.getElementById('alternateHolderText'));
		while(ah.hasChildNodes())
		{
			ah.removeChild(ah.firstChild);
		}
		if(SKTiny[key_f] && SKTiny[key_f].length > 1)
		{
			for (var i in SKTiny[key_f])
			{
				var newa = document.createElement("a");
				newa.setAttribute('href','#');
				newa.onclick=new Function("return viewAlternate('"+i+"')");
				newa.className='alternateThumb';
				var newimg = document.createElement("img");
				newimg.src = swatchdir+SKTiny[key_f][i];
				newa.appendChild(newimg);
				ah.appendChild(newa);				
			}
		}
		var ap = document.createElement("p");
		ap.id="alternateHolderText";
		ap.appendChild(document.createTextNode(txt));
		if(SKTiny[key_f] == undefined || SKTiny[key_f].length <= 1)
		{
			// hide alternateHolderText if there are no images, it still needs to be present
			// or subsequent calls to this function will fail
			ap.className="invisible";
		}
		ah.appendChild(ap);
	}
	return false;
}
function viewAlternate(i)
{
	var key;
	if(document.getElementById('key_f'))
	{
		key = document.getElementById('key_f').value;
	}
	else if(document.getElementById('key_s'))
	{
		key = document.getElementById('key_s').value;
	}
	else
	{
		return true;
	}
	if(document.getElementById('BigImageLink') && SKZoom[key][i])
	{
		document.getElementById('BigImageLink').href=swatchdir+SKZoom[key][i];
		showZoom = 1;
	}
	else if(document.getElementById('BigImageLink'))
	{
		document.getElementById('BigImageLink').href='';
		showZoom = 0;
	}
	if(document.getElementById('BigImage') && SKImg[key][i])
	{
		document.getElementById('BigImage').src=swatchdir+SKImg[key][i];
	}
	return false;
}
function getCookie(cook)
{
	if (document.cookie.length>0)
	{
		var startpos = document.cookie.indexOf(cook + '=');
		if (startpos !=-1)
		{
		    startpos=startpos + cook.length + 1;
		    var endpos =document.cookie.indexOf(';' ,startpos);
		    if (endpos==-1) endpos=document.cookie.length;
		    return unescape(document.cookie.substring(startpos,endpos));
		}
	}
	return '';
}
function setCookie(cname,value)
{
	document.cookie=cname+ "=" +escape(value);
}
function zapcook(cook)
{
	var temp=new Date();
	temp.setFullYear(temp.getFullYear()-1);
	document.cookie=cook+"=; path=/; expires="+temp.toGMTString();
}
function logout()
{
	zapcook('log');
	zapcook('member');
	zapcook('cryptpass');
	zapcook('orderno');
	zapcook('kartsummary');
	zapcook('lognew');
	alert('You are logged out.  Please wait while we reload the page. ');
	window.location.href='/';
}


// async shopping kart.
function asyncBasket()
{
	// useAsync initialised to 1 in skin. We set it to false if we want the user to retry without AJAX
	if(!useAsync)
	{
		return true;
	}
	var formvars = new Array();
	// this is needed for the shopping kart to work
	setCookie("cookieswork", "Y");
	// theForm is initialised at the top of this file so it's global and we can use it 
	// in asyncSuccess and asyncError
	theForm = $(this);
	// find SKU key
	formvars['key'] = 0;
	
	if(theForm.find('#key_f').attr("value"))
	{// select on product page
		formvars['key'] = theForm.find('#key_f').attr("value");
	}
	else if(theForm.find("input[name='key']").attr("value"))
	{// standard hidden input
		formvars['key'] = theForm.find("input[name='key']").attr("value");
	}
	else
	{
		return true;
	}
	// get remaining needed form values for ajax submission
	var elems = ["backto","mode","ID","quantity"];
	for (var i in elems)
	{
		if(! theForm.find('input[name='+elems[i]+']').attr("value"))
		{
			return true;
		}
		formvars[elems[i]] =  theForm.find('input[name='+elems[i]+']').attr("value");
	}
	
	// bring up "loading..." animation
	// note that the contents of these dialogs are set in the skin 
	// to allow preloading of images. 
	$('#waiting').modal({
		containerId: "modalLoading"
	});
	//window.scroll(0,0);
	// AJAX request. Note karturl is set in skin
	karturl = karturl.replace(/^https?\:/,window.location.protocol);
	$.ajax({
		type: "GET"
		,url: karturl
		,data: { 
			'key': formvars['key']
			,'backto': formvars['backto']
			,'mode':formvars['mode']
			,'ID':formvars['ID']
			,'quantity':formvars['quantity']
			,'async':'Y'
		}
		,success: asyncSuccess
		,error: asyncError
		
	});
	return false; 		
}
// process return from AJAX shopping kart
function asyncSuccess(data, textStatus)
{
	if(textStatus == 'success')
	{// page sucessfully loaded.
		if($(data).find('SUCCESS').text() == 1)
		{ // Kart Success
			var msg = $(data).find('MESSAGE').text();
			printKartSummary();
			// close loading modal
			$.modal.close();
			// show success message
			$('#success').modal({
				containerId: "modalBag"
				,closeHTML: "<a href='#' title='Close' class='modal-close'>x</a>"
				,onOpen: function (dialog) {
					dialog.overlay.show();
					dialog.container.slideDown('normal');
					dialog.data.show();
				}
				,onClose: function (dialog) {
					dialog.overlay.fadeOut('normal',function() {$.modal.close();});
					dialog.container.slideUp('normal');
					dialog.data.slideUp('normal');
				}
			});
			// show link to shopping kart when product added
			if($('#kartLink:hidden').css("display") == "none")
			{
				$('#kartLink').show('slow');
			}
			setTimeout(function(){$.modal.close();},2000);
			
		}
		else
		{ // Kart Problem
			// show error message in modal
			var msg = $(data).find('MESSAGE').text();
			$.modal.close();
			$.modal('<p>'+msg+'</p>',{
				containerId: "modalErr"
				,closeHTML: "<a href='#' title='Close' class='modal-close'>x</a>"
				,onOpen: function (dialog) {
					dialog.overlay.show();
					dialog.container.slideDown('normal');
					dialog.data.show();
				}
				,onClose: function (dialog) {
					dialog.overlay.fadeOut('normal',function() {$.modal.close();});
					dialog.container.slideUp('normal');
					dialog.data.slideUp('normal');
				}
			});
			useAsync = 0;
		}		
	}
	else
	{
		// unknown error, retry without AJAX
		return asyncError(0, 0, 0);
	}
}
function asyncError(XMLHttpRequest, textStatus, errorThrown) 
{// ajax fail. Try without! Probably Stupid, But Try Anyway
	$.modal.close();
	$('#error').modal({
		containerId: "modalErr"
		,closeHTML: "<a href='#' title='Close' class='modal-close'>x</a>"
		,onOpen: function (dialog) {
			dialog.overlay.show();
			dialog.container.slideDown('normal');
			dialog.data.show();
		}
	});
	useAsync = 0;
	setTimeout(function(){
		if(theForm.find("input[type='submit']").length)
		{
			theForm.find("input[type='submit']").click();
		}
		else if(theForm.find("input[type='image']").length)
		{
			theForm.find("input[type='image']").click();
		}
	},1200);
}
// Make sure all hidden css background images and images with display:none are loaded. 
function preloadAllImages()
{
	var loaded = new Array();
	$('*').each(function(i,elm)
	{
		if($(this).css("background-image") != "none" && $(this).is(":hidden"))
		{
			var loc = $(this).css("background-image");
			loc = loc.match(/[^\("]+\.(gif|jpg|jpeg|png)/g);         
			if( $.inArray(String(loc),loaded) == -1 )
			{
				//alert(loc);
				var img = new Image();
				img.src = loc;
				loaded.push(String(loc));
			}
		}
	});
	$('img').each(function(i,elm) 
	{
		if($(this).is(":hidden"))
		{
			if( $.inArray(String(loc),loaded) == -1 )
			{
				//alert($(this).attr("src"));
				var loc = $(this).attr("src");
				var img = new Image();
				img.src = loc;
				loaded.push(String(loc));
			}
		}
	});
}
function orderTrackLoader()
{
	$('#orderTrack').empty();
	$('#orderTrack').append('<img src="/images/ajax-loader.gif" width="100" height="100" alt="Please wait... Loading" class="loadgif" />');
	var ordernum = parseInt(getUrlEncodedKey('ordernum'));
	$('#orderTrack').load('order_status_xml.pl',{'ordernum': ordernum});
}
function getUrlEncodedKey(key, query) {
    if (!query)
        query = window.location.search;    
    var re = new RegExp("[?|&]" + key + "=(.*?)&");
    var matches = re.exec(query + "&");
    if (!matches || matches.length < 2)
        return "";
    return decodeURIComponent(matches[1].replace("+", " "));
}
function checkoutLoader()
{
	changeCountry();
	$('.jqhide').hide();
}
function changeCountry()
{
	// add/delFinder are in ped_postcode.js
	if(document.getElementById('mcountry'))
	{
		var index = document.getElementById('mcountry').selectedIndex;
		if(document.getElementById('mcountry')[index].value == 'GB')
		{
			addFinder('mzip');
		}
		else
		{
			delFinder('mzip');
		}
	}
	if(document.getElementById('mdcountry'))
	{
		var index = document.getElementById('mdcountry').selectedIndex;
		if(document.getElementById('mdcountry')[index].value == 'GB')
		{
			addFinder('mdzip');
		}
		else
		{
			delFinder('mdzip');
		}
	}
	USDisplay();
}
// For checkout/registration forms. Displays a US state dropdown when the user selects USA from the list of countries. 
function USDisplay()
{
	var ussids = {'mcountry':'muser2','mdcountry':'muser3'};
	for (var i in ussids)
	{
		var countryselect = $('#'+i);
		if(countryselect.length)
		{
			var display='none';
			if(countryselect.val() == 'US')
			{
				display='block';
			}
			var ussselect = $('#'+ussids[i])
			if(ussselect.length)
			{
				ussselect.parents('.usstates').css({'display':display});
			}
		}
	}
}
// Get the text of an element
function getText (el) 
{
	if(!el) { return ''; }
	if (el.textContent) {return el.textContent;}
	if (el.innerText) {return el.innerText;}
	if (typeof el.innerHTML == 'string') {
		return el.innerHTML.replace(/<[^<>]+>/g,'');
	}
}

// inline modal popup for various purposes (kart and postcode)
function showPopup(params)
{
	if(!params.modalID)
	{
		return false;
	}
	if($('#'+params.modalID).length < 1)
	{// no popup active, open one
		// get position, using voodoo.
		var pos=[0,0];
		if(params.callerelt)
		{
			var callerpos = params.callerelt.offset();
			var pl = parseInt(callerpos.left) + params.offset.left;
			var pt = parseInt(callerpos.top) + params.offset.top;
			pos = [pt,pl];
		}
		var modaldiv = $('<div></div>').attr('id',params.modalID+'inner');
		//modaldiv.append($('<img src="/images/ajax-loader.gif" alt="Please Wait..." width="100" height="100" class="waiting" />'));
		// allow parameter specifying callback when dialog opened
		if(typeof(params.opencallback) != "function")
		{
			params.opencallback = function(){return true;};
		}
		if(typeof(params.closecallback) != "function")
		{
			params.closecallback = function(){return true;};
		}
		var opts = {
			containerId: params.modalID
			,closeHTML: "<a href='#' title='Close' class='modal-close'>x</a>"
			,onOpen: function (dialog) {
				dialog.overlay.show();
				dialog.container.slideDown('normal',params.opencallback);
				dialog.data.show();
				fillPopup(params.modalID,params.contents);
			}
			,position: pos
			,nofixiepos: 1
		}
		if(! params.fastclose)
		{
			opts.onClose = function (dialog) {
				dialog.overlay.fadeOut('normal',function() {$.modal.close();params.closecallback();});
				dialog.container.slideUp('normal');
				dialog.data.slideUp('normal');
			};
		}
		$.modal(modaldiv,opts);
	}
	else
	{
		fillPopup(params.modalID,params.contents);
	}
	return false;
}

function fillPopup(popupid,contents)
{
	if(typeof(contents) == 'string')
	{
		var p = $('<p></p>');
		p.text(contents);
		contents = p;
	}
	if($('#'+popupid).length)
	{
		$('#'+popupid+'inner').find('*').remove();
		$('#'+popupid+'inner').scrollTop(0);
		$('#'+popupid+'inner').append(contents);
	}
	return false;
}
function hidePopup(popupid)
{
	if($('#'+popupid).length)
	{
		$('#'+popupid+' > #'+popupid+'inner > *').remove();
		$.modal.close();
	}
	return false;
}
function trackedOutLink(e)
{
	var href = $(this).attr('href');
	href=href.replace(/^http\:\/\//i,'');
	href='/exit/'+href;
	// sanity check. this needs to have been initialised. 
	if(typeof(_gaq) == 'object')
	{
		_gaq.push(['_trackPageview', href]);
	}
	return true;
}
function trackedIntLink(e,passedThis,addToFakeURL)
{
	var href = passedThis.attr('href');
	// detect external links
	var siteurls = ['ped.dev.textor.com','pedlars.co.uk'];
	var parts;
	if( (parts = href.match(/^http\:\/\/(www\.)?([^/]+)/i)) )
	{
		if(parts[2])
		{
			if($.inArray(parts[2],siteurls) == -1)
			{
				alert('external');
				return true;
			}
		}
	}
	// call _trackpageview on internal links
	href=href.replace(/^http\:\/\/[^/]+(\/)?/i,'');
	if(addToFakeURL)
	{
		addToFakeURL = '/'+addToFakeURL;
	}
	href='/internal-links'+addToFakeURL+'/'+href;
	// sanity check. this needs to have been initialised. 
	if(typeof(_gaq) == 'object')
	{
		_gaq.push(['_trackPageview', href]);
	}
	return true;
}
