/*******************************************************************************
	Filename		: wizard_newOnlyNS.js

	Created by		: Rick Holmes

	Comments		: all functionality for Phototext wizard, requires jquery and some effects
					Namedspaced to PTC
*******************************************************************************/	

$(document).ready(function() {
	PTC.getInitialLetters();
	PTC.checkSafari();
	PTC.setIEHover();	
	PTC.get_url_terms();
	PTC.setSelectElements();
	PTC.collectSnippets();
	PTC.loadKeymap();
	PTC.checkWholesale();
});

// start "namespace"
PTC = function() {

//////////////////////////////////////////////////////////////////////////////////////////
//	PRIVATE PROPERTIES/METHODS
//////////////////////////////////////////////////////////////////////////////////////////

/********************	PRIVATE DATA OBJECTS AND VARIABLES	********************/

	// data object that holds letter filenames, loaded with AJAX/JSON
	var LettersObj = {};
	
	// holds mat and frame choices, start with defaults
	var choices = {
		text: '',
		matcolor: 'white',
		framestyle: 'narrowpoly',
		framecolor: 'Satin Black',
		letters: [],
		savedurl: '',
		noframe: false,
		filtertype: '',
		filter: '',
		signtype: 'ptcSign'
	};
	
	// hash table for punctuation conversion
	var Hashtable = {
		'.':'_Period',
		"'":'_Apostrophe',
		',':'_Comma',
		'&':'_Ampersand',
		'#':'_Hash',
		'?':'_QuestionMark',
		'!':'_ExclamationPoint',
		//	":":'_Colon'],
		'*':'_Star',
		// mat colors
		/*'white':'#fff',
		'red':'#d32529',
		'pear green':'#abbd7a',
		'navy blue':'#154388',
		'beige':'#e9d4b5',*/
		//'black':'#000',
		'#ffffff':'White',
		'#d32529':'Red',
		'#abbd7a':'Pear Green',
		'#154388':'Navy Blue',
		'#e9d4b5':'Beige'
		//'#000':'Black',
		// frame colors
		//'Satin Black':'#303030'		
	};
	
	var mat_colorchoices = {
		'ptcSign' : ['White','Red','Pear Green','Navy Blue','Beige']
	};

	var frame_stylechoices = {
		/*'ptcSignLong_names' : ['Wide poly', 'Wood'],
		'ptcSignLong_values' : ['widepoly', 'newwood'],
		'ptcSignShort_names' : ['Narrow poly', 'Wide poly', 'Wood'],
		'ptcSignShort_values' : ['narrowpoly', 'widepoly', 'newwood'],*/
		'ptcSignLong_names' : ['2.875" Polystyrene'],
		'ptcSignLong_values' : ['widepoly'],
		'ptcSignShort_names' : ['1.25" Polystyrene', '2.875" Polystyrene'],
		'ptcSignShort_values' : ['narrowpoly', 'widepoly'],
		hash : {
			//newwood : '2.5" Wood',
			narrowpoly : '1.25" Polystyrene',
			widepoly : '2.875" Polystyrene'
		}
	};
		
	var price = {
		'totalprice' : '',
		'combo' : {
			'narrowpoly' : '',
			'widepoly' : '',
			'newwood' : ''
		}
	};
							
	var wiz = {
		'current_pane' : 1,
		'previous_pane' : 1,
		'current_pane_name' : 'wizard_pane_1'
	};
	
	var frame_colorchoices = {
		'new' : 'Satin Black'		
	};

	var snippets = {
		'filterform' : ''
	};
	
	var dlgvars = {
		'pos' : 0,
		'letter' : ''
	};
	
	var filter_choices = [];
	
	var currentpos = 999;
	var dlgopen = false;
	
	var values = '';	// holds LetterObj letters from name
	var selected = '';
	var dlg = '';
	var is_saved = false;
	var is_hidden = false;
	var currentCount = 0;
	var isWholesale = false;

/********************	PRIVATE METHODS	********************/	

	function createCookie(name,value,days) {
		var expires;
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			expires = "; expires="+date.toGMTString();
		} else {
			expires = "";
		}
		document.cookie = name+"="+value+expires+"; path=/";
	}

	function readCookie(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)===' ') {
				c = c.substring(1,c.length);
			}
			if (c.indexOf(nameEQ) === 0) {
				return c.substring(nameEQ.length,c.length);
			}
		}
		return null;
	}

	function eraseCookie(name) {
		this.createCookie(name,"",-1);
	}
	
	// called by this.showBox()
	function getTextin() {
		var texty = document.getElementById('textin').value;
		texty=$.trim(texty).toUpperCase();
		if (texty.length === 0) { // validates that text field has a value		
			document.getElementById('status').innerHTML = 'you must enter your desired text in order to proceed to step two';
			return false;
		} else if (texty.length<3 | texty.length>16) {
			document.getElementById('status').innerHTML = 'you must enter 3 to 16 characters in order to proceed to step two';
			return false;
		} else {
			document.getElementById('status').innerHTML = '';
		}
		return texty;
	}	
	
	// called by this.showBox()
	function stepTwo() {
		$('#headerwrap').animate({height:365},1200); // was height:620, 2000
		var name = getName();
		if (!name) return false;
		if (wiz.previous_pane == 1) refreshLetters();
	}
	
	// called by this.showBox(), stepTwo(), this.setID()
	function refreshLetters()	{
		var output = "";
		var ltr;
		if (!is_saved) {
			for (var i = 0; i < choices.text.length; i++) {
				if (choices.text.charAt(i) !== '') {
					if (choices.text.charAt(i) === ' ') {	// spaces have no border
						output += "<a href=\"javascript:PTC.dlgshow(" + i + ", \'" + choices.text.charAt(i) + "')\">";
						output += "<img height='51' width='35' src='letters/" + choices.letters[i] + "' class='space' />" + "</a>&nbsp;";
					} else {
						ltr = choices.text.charCodeAt(i);
						output += "<a href=\"javascript:PTC.dlgshow(" + i + ",'" + ltr + "')\">";
						output += "<img height='51' width='35' src='letters/" + choices.letters[i] + "' class='txtimg' />" + "</a>&nbsp;";
					}	
				}
			}
		} else {
			for (var j = 0; j < choices.letters.length; j++) {	
				if (choices.letters[j]=='space.gif') {
					output += "<a href=\"javascript:PTC.dlgshow(" + j + ",'" + ' ' + "')\">";
					output += "<img height='51' width='35' src='letters/" + choices.letters[j] + "' class='space' />" + "</a>&nbsp;";
				} else {
					ltr = choices.letters[j].substr(0,1);
					output += "<a href=\"javascript:PTC.dlgshow(" + j + ",'" + ltr + "')\">";
					output += "<img height='51' width='35' src='letters/" + choices.letters[j] + "' class='txtimg' />" + "</a>&nbsp;";
				}	
			}
		}
		$('.letters').html(output);
		setFrameSize();
	}
	
	// called by refreshLetters()
	function setFrameSize() {
		var letterswidth = ($.browser.msie? choices.text.length*44: choices.letters.length*43);
		$('.letters').css('width', letterswidth + 'px');
		$('.mat').css('width', letterswidth + 'px');
		$('.frame').css('width', letterswidth+ 60 + 'px');
	}

	// called by getName()
	function getName() {
		var letter, i;
		if (!(is_saved)) {
			for (i = 0; i < choices.text.length; i++) {
				if (Hashtable[choices.text.charAt(i)]) {
					letter = Hashtable[choices.text.charAt(i)];
				} else {
					letter = '_'+choices.text.charAt(i);
				}
				if (choices.text.charAt(i) == ' ') letter='_space';
				try {
					choices.letters.push(LettersObj[letter][0]);
				} catch (ex) {
					alert("I\'m sorry, there is no image for \'" + choices.text.charAt(i) + "\'.");
					return false;
				}																											
			}
		}      
		return true;
	}

	// called by dlgShow()
	function parseLetter(rawletter) {
		var letter = String.fromCharCode(rawletter);
		if (Hashtable[letter]) {
			letter = Hashtable[letter];
		} else {
			letter = '_'+letter;
		}
		return letter;
	}

	// called by dlgShow()
 	function opacScreen_Open() {
		var loopCounter = 0;
		var do_opacScreen_Open=function(loopCounter) {
			currentCount = loopCounter;
			var opacScreen = document.getElementById('opacScreen');
			opacScreen.style.visibility = 'visible';
			opacScreen.style.opacity = loopCounter/10;
			if (loopCounter < 5) {
				currentCount = loopCounter + 1;
				setTimeout(function(){return do_opacScreen_Open(currentCount);},5000);
			}	
		};
	}

	// called by applyFilter()
	function changedlg() {
		var imagesoutput = '';
		var buttonoutput = '';
		var pagenumoutput = '';
		var bord, totalpages;
		page = 1;
		if (LettersObj[dlgvars.letter].length>0) {
			Tooltip.CANCEL = false;
			totalpages = Math.ceil(LettersObj[dlgvars.letter].length/18);
			pagenumoutput = 'Page 1 of '+totalpages;
			if (LettersObj[dlgvars.letter].length>18) {												
				buttonoutput = '<button type="button" class="smallbutton" onclick="PTC.dlgchange(' + "'" + dlgvars.pos + "','" + dlgvars.letter + "'," + (page+1) + ')">NEXT</button>';
			} 
			// write the dlg_images content
			for (var i = 0; (i < 18 && i < LettersObj[dlgvars.letter].length); i++) {	
				if (selected == (LettersObj[dlgvars.letter][i])) {
					bord = 'style="border-color:red"';
				} else {
					bord = 'style="border-color:white"';
				}			
				imagesoutput += "<a href=\"javascript:PTC.setID(" + dlgvars.pos + ", '" + LettersObj[dlgvars.letter][i] + "', " + page + ")\">";
				imagesoutput += "<img id='" + LettersObj[dlgvars.letter][i] +"' src='letters/"+LettersObj[dlgvars.letter][i] + "' border='1' width='90' height='135'" + bord + "onmouseover='Tooltip.schedule(this,event)' /></a>&nbsp;";
				if ((i+1)%18 === 0) imagesoutput += "<br />";							
			} 
		} else {
			Tooltip.CANCEL = true;
			imagesoutput = 'There are no available images for this letter using the filter you chose. Please try again later or choose a different filter.';
			$('#dlg_images').css('color','#f00');			
		}
		$('#dlg_images').empty();
		$('#dlg_images').html(imagesoutput);
		$('#dlg_prevbutton').remove();
		$('#dlg_nextbutton').empty();
		$('#dlg_nextbutton').html(buttonoutput);
		$('#dlg_pagenum').empty();
		$('#dlg_pagenum').html(pagenumoutput);				
	}
	
	// called by dlgchange, dlgshow
	function setFilterSelects() {
		document.forms.filterform.filtertype.value=choices.filtertype;
		// replace options in filter select
		var filtersel = document.forms.filterform.filter;
		filtersel.length = 0;
		for (var i = 0; i < filter_choices.length; i++) {
			filtersel.options[i]=new Option(filter_choices[i],filter_choices[i].toUpperCase());
		}			
		filtersel.value = choices.filter;
	}

	// called by dlgclose
	function opacScreen_Close() {
		$('#opacScreen').css('visibility','hidden');
	}

	// called by dlgclose
	function hide_box() {
		$('#select_letter').hide();
	}

	// change frame choices depending on number of characters
	function setFrameStyleOptions() {		
		var len=choices.text.length;
		var el_frametype = document.forms['enterFrame'].frametype;	
		var i, j;
		var options = el_frametype.options;
		options.length = 0;
		if (len > 10) {
			for (i = 0; i < frame_stylechoices.ptcSignLong_values.length; i++) {
				options[i] = new Option(frame_stylechoices.ptcSignLong_names[i], frame_stylechoices.ptcSignLong_values[i]);
			}
			for (j = 0; j < frame_stylechoices.ptcSignLong_values.length; j++) {
				if (frame_stylechoices.ptcSignLong_values[j] == choices.framestyle) el_frametype.selectedIndex=j;
			}
		} else {
			for (i = 0; i < frame_stylechoices.ptcSignShort_values.length; i++) {
				options[i] = new Option(frame_stylechoices.ptcSignShort_names[i], frame_stylechoices.ptcSignShort_values[i]);
			}
			for (j = 0; j < frame_stylechoices.ptcSignShort_values.length; j++) {
				try  {
					if (frame_stylechoices.ptcSignShort_values[j] == choices.framestyle) el_frametype.selectedIndex = j;
				} catch (ex) {
					// do nothing
				}
			}
		}
		// match the option to the choice
		for (var k = 0; k < options.length; k++) {
			if (options[k].value==choices.framestyle) document.forms.enterFrame.frametype.selectedIndex = k;
		}
	}

	function changeLink() {
		var linkhref = 'popups/' + choices.framestyle + '.html';
		var linktitle = 'Click to see a larger view of the ' + frame_stylechoices.hash[choices.framestyle] + ' frame.';
		$('#framedetail').attr({title:linktitle, href:linkhref});
	}
	
	// builds a url from a saved sign's data, use for 'save', add to registry, or buy functionality
	// called from saveToUrl(), saveToRegistry(), purchaseIt(), buyWholesale()
	function buildURL(path) {
		// build the url, first the base web address
		var urlloc;
		if (!path) {
			// use only the hostname and pathname in case coming from previously saved url
			urlloc = location.href;			
		} else {
			// passed a filepath
			urlloc = path;
		}
		// add the letter choices
		urlloc += '&letters=';
		for (var i = 0; i < choices.letters.length; i++) {
			urlloc += choices.letters[i]+',';
		}
		// subtract the final comma	
		urlloc = urlloc.slice(0,-1);
		// add the mat choice
		urlloc += '&matcolor='+encodeURIComponent(Hashtable[choices.matcolor]);	
		// check for frame
		if (choices.noframe === false) {
			// add the frame style
			urlloc += '&framestyle=' + choices.framestyle;
			// add the frame color
			urlloc += '&framecolor=' + encodeURIComponent(choices.framecolor);
		} else {
			urlloc += '&noframe=true';
		}		
		// add the completed word(s), encode in case there's a space
		urlloc += '&text='+encodeURIComponent(choices.text);		
		// add the price
		urlloc += '&price='+price.totalprice;		
		return urlloc;
	}

	// show current running price, called by showBox(), changeMat(), changeFrameStyle()
	function showPrice() {
		var noframeprice = 0;
		var frameprice = 0;
		price.totalprice = 0;
		switch (choices.framestyle) {
			case 'narrowpoly':
				price.totalprice = price.combo.narrowpoly;
				break;
			case 'widepoly':
				price.totalprice = price.combo.widepoly;
				break;
			case 'newwood':
				price.totalprice = price.combo.newwood;
				break;
		}
		$('#enterFrame span.pricing').html('Price for this combination is $'+price.totalprice+'.');
		$('#final span.pricing').html('Price for this sign is $'+price.totalprice+'.');
	}

	// parse the prices from the string returned from AJAX call, called by changeFrameStyle()
	function parsePrice(msg) {
		var arr_prices = [0,0,0];
		if (msg.indexOf('comboprice:') != -1) {
			arr_prices = msg.slice(11,-1).split(';'); // remove "comboprice:" and split string
			for (var i = 0; i < arr_prices.length; i++) {
				if (arr_prices[i].indexOf('narrowpoly') != -1) {
					price.combo.narrowpoly=arr_prices[i].slice(11);
				} else if (arr_prices[i].indexOf('widepoly') != -1) {
					price.combo.widepoly=arr_prices[i].slice(9);
				} else if (arr_prices[i].indexOf('newwood') != -1) {
					price.combo.newwood=arr_prices[i].slice(8);
				}
			}
		}
	}

	// called by loadOrderForm on Ajax success
	function addScripts() {
		// have to do manually because of jQuery bug
		var script = document.createElement("script");
		var type = 'text/javascript';
		var src = 'js/dealerform.js';
		script.setAttribute("type", type);
		script.setAttribute("src", src);
		document.body.appendChild(script);
		
		/*script = document.createElement("script");
		type = 'text/javascript';
		src = 'js/validation.js';
		script.setAttribute("type", type);
		script.setAttribute("src", src);
		document.body.appendChild(script);*/
	}

	// called by checkwholesale() onready function
	function loadWSStuff(sid) {
		//document.getElementById('wholesalestuff').style.display='block';
		$('#promotions').css('display','none');
		document.getElementById('whochooses').style.display='block';
		//$("#login p").html("&nbsp;&nbsp;<a href='catalog/logoff.php'>LOGOFF</a>");	// already logged in, don't need "show cart"
		$('.pricing').css('display','none');
		/*$('#savebutton').css('display','none');*/
		$('#registrybutton').css('display','none');
		$('#buybutton').css('display','none');
		$('#wizard_pane_5 p.top_par span').css("display", "none");
		// hide hide button and move back button to where it was
		$('#wizard_pane_5 button.hidebutton').css("display", "none");
		$('#wizard_pane_5 button.backbutton').css({position:"absolute", left:"655px", top:"30px"});
		$('#betweendivs').css("backgroundImage", "url(img/betweendivs2-trans.png)");
		loadOrderForm(sid);
	}

	// called by loadWSStuff
	function loadOrderForm(sid) {
		// splash screen
		$.blockUI('Welcome PhotoTextCatalog Dealer!', { backgroundColor: '#f00', color: '#fff', height: '100px', width: '240px', fontSize: '24px', padding: '20px' });
		$("#featureBox").empty();
		$("#maincontent").empty();
		$.ajax({
			url: "php/wholesalefunctions.php",
			data: "action=getorderform&osCsid=" + sid,
			success: function(msg){				
				$("#maincontent").html(msg);
				addScripts();
				$.unblockUI({ fadeTime:2000 });
				PTC.showForm();				
			}
		});		
	}

	// called by the wizard in step 5 or by showForm()
	function fillDealerForm() {
		// show the form
		$("#imageorigin").css("display", "none");	// don't need that, used wizard
		$("#signimage").css("display", "block");	// but need the image
		$('#headerwrap').animate({height:320}, 2000, function(){$('#orderform').slideDown(2000);});
		
		// fill the form fields from the data objects
		$("#form_text").val(choices.text);
		$("#form_spaces").val(choices.text.length);
		$("#form_images").val(choices.letters);
		var form_matcolor = document.getElementById("form_matcolor");
		for (var i=0; i<form_matcolor.length; i++) {
			if (form_matcolor[i].value == choices.matcolor) {
				form_matcolor.selectedIndex = i;
			}
		}
		var form_framestyle = document.getElementById("form_framestyle");
		for (var j=0; j<form_framestyle.length; j++) {
			if (form_framestyle[j].value == choices.framestyle) {
				form_framestyle.selectedIndex = j;
			}
		}
		$("#form_framestyle").val(choices.framestyle);
		
	}
	// called by wizard in step 5 or by showForm()
	function setDates(){
		var d = new Date();
		var month = d.getMonth() + 1;
		var day = d.getDate();
		var year = "0" + (d.getFullYear() - 2000);
		var today = month + "/" + day + "/" + year;
		$('#orderdate').val(today);
		// 4.5 weeks = 31 days
		var coming = d.getTime() + (31*24*3600*1000);
		var exd = new Date(coming);
		$('#expecteddate').val((exd.getMonth() + 1) + "/" + exd.getDate() + "/" + ("0" + (exd.getFullYear() - 2000)));
	}

	// called by checkWholesale: if logged in, hide data collection form
	function hideDataCollection() {
		$('#datacollection').css('display', 'none');
		$('#registrybutton').removeClass('disabled').removeAttr('disabled');
		$('#buybutton').removeClass('disabled').removeAttr('disabled');
	}
	
	// sends user email [phone] to database on click of purchase or add to registry button then redirects to product page
	// called by respective button handler
	function doPurchase(pid, where) {
		if (readCookie('PTwholesale')) return; // no need to log wholesale users, buying is automatic
		var email = $("#data_email").val();
		var phone = $("#data_phone").val();
		var params = "&pid=" + pid;
		if (email != "") {
			params += "&email=" + email;
		}
		if (phone != "") {
			params += "&phone=" + phone;
		}
		var cookievalue =  readCookie('PTretail');
		if (cookievalue) {
			params += "&cid=" + cookievalue;
		} 
		var url = "php/uservalidation.php";
		$.ajax({
				url: url,
				data: "action=loguserdata" + params,
				success: function(data) {
						if (window.location.hash == "#debug") {
							alert("Data: " + data);
						}
						if (data == 'ok') {
							if (where = 'purchase') {
								return window.location.href = './catalog/product_info.php?products_id=' + pid;
							} else if (where = 'registry') {
								return window.location.href = 'catalog/help_registry_owner.php';			
							}		
						} else {
							alert("Please go to http://www.phototextcatalog.com/catalog/product_info.php?products_id=" + pid);
						}	
					}
			});
	}

	return {
		
//////////////////////////////////////////////////////////////////////////////////////////
//	PUBLIC PROPERTIES/METHODS
//////////////////////////////////////////////////////////////////////////////////////////
	
/********************	ONLOAD & READY EVENTS (need here for scope reasons with jQuery, but shouldn't be public	********************/	
	
	// checks for Safari browser, js doesn't work right so user told
	checkSafari: function() {
		if ($.browser.safari) {
			$("#safarinotice").css("display", "block");
		}
	},
	
	// checks to see if user is dealer
	checkWholesale: function() {
		if (readCookie('PTwholesale')) {
			// get cookie value
			var cookievalue=readCookie('PTwholesale');
			// do Ajax call to check the db to make sure it's a wholesale customer, for double security
			$.ajax({
				url:'php/wholesalefunctions.php?action=checkdealer&osCsid='+cookievalue,
				success:function(msg) {
					if (msg=='iswholesale') {
						// if wholesale customer, show p#wholesalestuff
						isWholesale = true;
						loadWSStuff(cookievalue);
						hideDataCollection();
					}
				}
			});
		} else if (readCookie('PTretail')) {
			hideDataCollection();
		}
	},
	
	// collect snippets into variables and delete from DOM
	collectSnippets: function() {
		// filter html to add to select_letter dialog
		snippets.filterdiv = $('#filterdiv').html();
		$('#filterdiv').remove();
	},

	getInitialLetters: function() {
		$.getJSON(
			'php/datafunctions.php',
			{action: 'getinitialletters'},
			function(json){LettersObj = json;}
		);
	},
				
	// gets available letters' src with Ajax/JSON
	getLetters: function() {		
		$.getJSON(
			'php/datafunctions.php',
			{action: 'getletters'},
			function(json){LettersObj = json;}
		);	
	},
	
	get_url_terms: function() {		
   		var urlquery = location.href.split("?");
		if (urlquery[1]) {	// has something past the basic web address
			if (urlquery[1].indexOf('letters') == -1) {	// user clicked enter
				document.getElementById('status').innerHTML = 'Please use the "START" button to continue designing your sign';	
				return;
			}
			is_saved = true;
			var params = urlquery[1].split('&');
			choices.letters=params[1].slice(8).split(','); // crop 'letters=', param[0] is action
			choices.matcolor=decodeURIComponent(params[2].slice(9)); // crop 'matcolor='
			if (params[2].indexOf('noframe') == -1) {
				choices.framestyle=params[3].slice(11);	// crop 'framestyle='
				choices.framecolor=decodeURIComponent(params[4].slice(11));	// crop 'framecolor=' and decode string
			} else {
				choices.noframe = true;
			}
			choices.text=params[5].slice(5);
			price.totalprice=params[6].slice(6);
			$('#wizard_pane_1').hide();			
			stepTwo();
			showBox('5');
			$('#enterFrame span.pricing').html('Price for this combination is $'+params[6].slice(6)+'.');
			$('#final span.pricing').html('Price for this sign is $'+params[6].slice(6)+'.');
		}
	},

	// loads Keymap object to capture nonprinting keystrokes that might mess up wizard
	loadKeymap: function() {
		map = new Keymap();
		map.install(document);
		// bind the obvious to keyboard
		map.bind('return', function() {
			if (wiz.current_pane < 5) {
				var nextpane = (wiz.current_pane+1).toString();
				return this.showBox(nextpane);
			}
		});
	},
	
	//set hover class for anything (needed for IE6)
	setIEHover: function() {
		$('button').hover(
			function(){$(this).addClass('buttonhover');},
			function(){$(this).removeClass('buttonhover');}
		);
		$('#buybutton').removeClass('buttonhover');
		$('#registrybutton').removeClass('buttonhover');
	},
	
	// set selects to default
	setSelectElements: function() {
		document.getElementById('matcolor').selectedIndex = 0;
		document.getElementById('frametype').selectedIndex = 0;
		document.getElementById('framecolor').selectedIndex = 0;
	},

	
/********************	RUNTIME FUNCTIONS	********************/	

	// clears Input text field on focus, called by textin input
	clearField: function() {
		var element = document.getElementById('textin');
		if (element.value == 'type here') {
			element.value = "";
		}	
	},
	
	// called by continue and back buttons
	showBox: function(pane_number) {
		var priceurl;
		switch (pane_number) {
			case '1':
				// set current and previous panes
				wiz.previous_pane = wiz.current_pane;
				wiz.current_pane = 1;				
				// display pane 1, hide any panes that may be open (if 'hide' button used)
				document.getElementById('wizard_pane_5').style.display = 'none';
				document.getElementById('wizard_pane_4').style.display = 'none';
				document.getElementById('wizard_pane_3').style.display = 'none';
				document.getElementById('wizard_pane_2').style.display = 'none';		
				document.getElementById('wizard_pane_1').style.display = 'block';				
				// do any visual stuff with block								
				$('#headerwrap').animate({height:164},2000);
				$('#headgraphic').css('display','block');				
				// reset choice of letters
				choices.letters = [];				
				break;				
			case '2':
				// set current and previous panes
				wiz.previous_pane = wiz.current_pane;
				wiz.current_pane = 2;
				wiz.current_pane_name = 'wizard_pane_2';				
				// check for input
				if (wiz.previous_pane == 1) {
					choices.text=getTextin();
					if (getTextin() === false) {
						return;
					} else {
						document.getElementById('status').innerHTML = '';
					}
				}				
				// get all the letter image paths via AJAX
				if (wiz.previous_pane == 1) this.getLetters();				
				// display pane 2, hide other panes
				document.getElementById('wizard_pane_1').style.display = 'none';
				document.getElementById('wizard_pane_3').style.display = 'none';
				document.getElementById('wizard_pane_2').style.display = 'block';												
				// display letter images, etc.
				setTimeout(stepTwo, 150);
				//stepTwo();
				$("#safarinotice").css("display", "none");				
				break;				
			case '3':
				// release mat select functionality
				is_saved = false;				
				// set current and previous panes
				wiz.previous_pane = wiz.current_pane;
				wiz.current_pane = 3;
				wiz.current_pane_name = 'wizard_pane_3';				
				// display pane 3, hide either previous pane				
				document.getElementById('wizard_pane_2').style.display = 'none';
				document.getElementById('wizard_pane_4').style.display = 'none';
				document.getElementById('wizard_pane_3').style.display = 'block';				
				// get rid of any frame (there's no frame div in this pane, so no need to hide custom frame)
				$('#mat_wiz3').css('borderWidth','0');
				// set initial matcolor
				//choices.matcolor = $("#matcolor").val();
				this.changeMat();
				$('#headerwrap').animate({height:500},500);
				break;				
			case '4':
				// hide save url div if 'back' button clicked
				document.getElementById('select_letter').style.display = 'none';				
				// set current and previous panes
				wiz.previous_pane = wiz.current_pane;
				wiz.current_pane = 4;
				wiz.current_pane_name = 'wizard_pane_4';				
				// display pane 4, hide either previous pane
				document.getElementById('wizard_pane_3').style.display = 'none';
				document.getElementById('wizard_pane_5').style.display = 'none';
				document.getElementById('wizard_pane_4').style.display = 'block';
				// change frame style options depending on number of characters or choice already made 
     			setFrameStyleOptions();
				// get initial framestyle
				choices.framestyle = $("#frametype").val();
				showPrice();								
				this.changeFrameStyle(); // also calls showPrice()
				$('#headerwrap').animate({height:600},500);
				break;				
			case '5':
				// set current and previous panes
				wiz.previous_pane = wiz.current_pane;
				wiz.current_pane = 5;
				wiz.current_pane_name = 'wizard_pane_5';				
				// display pane 5, hide pane 4
				document.getElementById('wizard_pane_4').style.display = 'none';
				document.getElementById('wizard_pane_5').style.display = 'block';				
				if (is_saved) {
					this.changeMat();
					/*this.setFrameColorOptions();*/
					/*this.changeFrameColor();*/
					this.changeFrameStyle();
					//is_saved=false;					
				}					
				showPrice();
				if (isWholesale === true) {	// fill dealer form fields from the choice object
					fillDealerForm();
					setDates();
					var imagestring = choices.letters.toString();
					$("#form_images").val(imagestring);					
					imagestring = imagestring.replace(/,/g, ", ");
					$("#imagenames").html(imagestring);
					$('#headerwrap').animate({height:300});
				} else {
					$('#headerwrap').animate({height:650});
				}
				
				break;			
		}
	},
	
	// called by hide button
	hideBox: function(pane) {
		if (!is_hidden) {
			$('.letters').hide();
			$('.frame').hide();
			$('.continuebutton').hide();
			$('.backbutton').hide();
			$('.form').hide();
			$('.divider').hide();
			$('#enterMat').hide();
			$('#enterFrame').hide();
			$('#final').hide();
			$('#headerwrap').animate({height:240},2000);
			$('.hidebutton').html('RESUME');
			$('.hidebutton').attr({title: 'Resume creating your custom sign'});
			is_hidden = true;
		} else {
			$('.hidebutton').html('HIDE');
			$('.hidebutton').attr({title: 'Hide this wizard'});
			is_hidden = false;
			$('#headerwrap').animate({height : 620}, 2000, function(){
					PTC.showBox(pane);
					$('.divider').show();
					$('.letters').show();
					$('.frame').show();
					$('#enterMat').show();
					$('#enterFrame').show();
					$('#final').show();
					$('.continuebutton').show();
					$('.backbutton').show();
					$('.form').show();
						});			
		}
	},		
		
	// called by hrefs on letter images
	dlgshow: function(pos, letter) {
		if (wiz.current_pane != 2) return;
		letter=parseLetter(letter);
		if (letter == '_space') return; // move along, nothing to see here
		if (pos == currentpos) return; // user clicked same letter in same position again, so do nothing
		if (dlgopen == true) this.dlgclose();	// user clicked another letter without closing open dialog, so close it
		// 18 per page
		var page = 1; // initial load only
		this.dlgchange(pos, letter, page);
		opacScreen_Open();
		$('#select_letter').css('visibility', 'visible');
		$('#select_letter').Grow(1000);
		setTimeout(this.showBox, 1000);
		currentpos = pos;
		dlgopen = true;
		dlgvars.pos = pos;
		dlgvars.letter = letter;
		setFilterSelects();
	},

	// called by filtertype select
	changeFilter: function() {
		var el_filtertype = document.getElementById('filtertype');
		var filtertype = el_filtertype.value;
		$.ajax({
			url: 'php/filterfunctions.php?action=getcategories&cattoget='+filtertype+'&letter='+selected,
			success: function(msg) {
				// empty the select
				var filtersel = document.forms.filterform.filter;
				filtersel.length = 0;
				// break return string into array
				filter_choices = msg.split(',');
				// replace options
				for (var i = 0; i < filter_choices.length; i++) {
					filter_choices[i] = filter_choices[i].replace(/#/,',');
					filtersel.options[i] = new Option(filter_choices[i], filter_choices[i].toUpperCase());
				}
				PTC.applyFilter();
			}
		});
	},
	
	// called by filter select and changeFilter()
	applyFilter: function() {
		$('.tooltipShadow').css('visibility', 'hidden');
		var filter = document.forms.filterform.filter.value;
		choices.filter = filter;
		var filtertype = document.forms.filterform.filtertype.value;
		choices.filtertype = filtertype;
		$.getJSON(
			'php/filterfunctions.php',
			{action: 'filterimages', filtertype: filtertype, filter: filter},
			function(json){
				LettersObj = json;
				changedlg();
			}
		);
	},
	
	// called by buttons on dlg
	dlgchange: function(pos, letter, page) {
		selected = choices.letters[pos];		
		var totalpages = Math.ceil(LettersObj[letter].length/18);
		var output = '';
		var bord;				
		// write common stuff
		if (LettersObj[letter].length>0) {
			
			output = '<p id="dlg_default">Please select a new image: <button type="button" class="smallbutton" onclick="PTC.dlgclose()">CLOSE</button>';
			
			if (page > 1) {				
				output += '<button type="button" id="dlg_prevbutton" class="smallbutton" onclick="PTC.dlgchange(' + "'" + pos + "','" + letter + "'," + (page-1) + ')">PREV</button>';
			}
			if (page < totalpages) {
				output += '<span id="dlg_nextbutton"><button type="button" class="smallbutton" onclick="PTC.dlgchange(' + "'" + pos + "','" + letter + "'," + (page+1) + ')">NEXT</button>';
			}
			output += '&nbsp;&nbsp;</span><span id="dlg_pagenum">Page '+page+' of '+totalpages+'</span>';
			output += '</p>';	
			//18 per page
			var start = (page-1) * 18;
			var finish = start + 18;
			// add selects
			output += snippets.filterdiv;
			// put in photos
			output += '<p id="dlg_images">';
			for (var i = start; (i < finish && i < LettersObj[letter].length); i++) {	
				if (selected == (LettersObj[letter][i])) {
					bord = 'style="border-color:red"';
				} else {
					bord = 'style="border-color:white"';
				}			
				output += "<a href=\"javascript:PTC.setID(" + pos + ", '" + LettersObj[letter][i] + "', " + page + ")\">";
				output += "<img id='" + LettersObj[letter][i] +"' src='letters/"+LettersObj[letter][i] + "' border='1' width='90' height='135'" + bord + "onmouseover='Tooltip.schedule(this,event)' /></a>&nbsp;";							
			}
			output += '</p><p id="dlg_defaultclose"><button type="button" class="smallbutton" onclick="PTC.dlgclose()">CLOSE</button></p>';
		} else {
			output = '<p id="noimages">There are no available images for this letter using the filter you chose. Please try again later or choose a different filter. <button type="button" class="smallbutton" onclick="PTC.dlgclose()">CLOSE</button></p>';
			output += snippets.filterdiv;
		}
		document.getElementById("select_letter").innerHTML = output;
		setFilterSelects();
	},
	
	// called by hrefs on images
	setID: function(pos,id,page) {
		document.getElementById(id).style.borderColor = "red";
		choices.letters[pos] = id;
		refreshLetters();	
		this.dlgclose();
	},
	
	// called by buttons
	dlgclose: function() {
		opacScreen_Close();
		$('#select_letter').Shrink(1000);
		setTimeout('this.hide_box',1000);
		dlgopen = false;
		currentpos = 999;
		$('.frame').show('slow');
		// show hide button
		$('hidebutton').css('display','block');
		// show back button
		$('.backbutton').css('display','block');
		// continue button moves for some reason, move it back to where it was
		$('.continuebutton').css({top: "-20px", left: "664px"});
	},
	
	// called from select id='matcolor'
	changeMat: function() {
		if (!is_saved) {
			// get the mat color from the select
			var matcolor = $("#matcolor").val();
			choices.matcolor = matcolor;
		}
		//$('.mat').css('backgroundColor', Hashtable[choices.matcolor]);	// if not using hex values
		$('.mat').css('backgroundColor', choices.matcolor);		
		// set border color around photos, depending on mat color
		var border_color = (choices.matcolor == '#ffffff' ? '#000' : '#ffffff');
		$('.txtimg').css('borderColor', border_color);		
	},
	
	// called from select 'frametype' on wizard_pane_4 and 'onload' of pane 5
	changeFrameStyle: function() {
		if (wiz.current_pane == '4') {
			choices.framestyle = document.getElementById('frametype').value;
		}
		if (price.combo.narrowpoly == '') { // prices not called yet
			$.ajax({
				url: 'php/runningprice.php?action=comboprices&length=' + choices.text.length,
				success: parsePrice
			});
		} 
		var type = choices.framestyle;
		$('.mat').css('borderStyle', 'solid');
		$('.frame').css('borderWidth', '0');
		$('.frame').css('padding', '24px');		
		try {
			switch (type) {
				case 'narrowpoly':
					choices.noframe=false;
					/*this.setFrameColorOptions('narrowpoly');*/
					$('.mat').css('borderWidth','12px');
					$('.mat').css('borderColor','#303030');	// only 1 choice
					$('.frame').css('backgroundImage','none');
					$('.frameright').css('backgroundImage','none');
					$('.frame').css('marginTop','0px');
					$('.frame').css('marginLeft','0px');
					document.getElementById('framecolor').disabled = false;
					break;
				case 'widepoly':
					choices.noframe = false;
					/*this.setFrameColorOptions('narrowpoly');*/
					$('.mat').css('borderWidth', '29px');
					$('.mat').css('borderColor', '#303030');	// only 1 choice
					$('.frame').css('backgroundImage', 'none');
					$('.frameright').css('backgroundImage', 'none');
					$('.frame').css('marginTop', '0px');
					$('.frame').css('marginLeft', '0px');
					document.getElementById('framecolor').disabled = false;
					break;
				case 'newwood':
					choices.noframe = false;
					/*this.setFrameColorOptions('narrowpoly');*/
					$('.mat').css('borderWidth', '25px');
					$('.mat').css('borderColor', '#303030');	// only 1 choice
					$('.frame').css('backgroundImage', 'none');
					$('.frameright').css('backgroundImage', 'none');
					$('.frame').css('marginTop', '0px');
					$('.frame').css('marginLeft', '0px');
					document.getElementById('framecolor').disabled = false;
					break;
			}
		} catch (ex9) {
			// in case coming to a panel without specified elements
		}
		if (!is_saved) setTimeout(showPrice, 150);
		is_saved = false;
		changeLink();		
	},
	
	// no longer needed: only one frame color
	/*setFrameColorOptions:function(style) {
		if (!style) var style=choices.framestyle;
		var el_framecolor=document.forms.enterFrame.framecolor;
		el_framecolor.options.length=0;
		switch (style) {
			case 'narrowpoly':
			case 'widepoly':
			case 'newwood':
				el_framecolor.options[0]=new Option('Satin Black','Satin Black');
				choices.framecolor='Satin Black';
				break;
		}
		for (var i=0; i<el_framecolor.options.length; i++) {
			if (el_framecolor.options[i].value==choices.framecolor) el_framecolor.selectedIndex=i;
		}
	},*/
	
	newWindow: function(winURL) {
		if (winURL.indexOf('wood_') != -1 || winURL.indexOf('wide-black') != -1) {
			var newwin = window.open(winURL,'Detail','width=330,height=570,left=250,top=75'); //340
		} else if (winURL.indexOf('black-wood') != -1) {
			var newwin = window.open(winURL, 'Detail','width=450,height=400,left=250,top=75');
		} else {
			var newwin = window.open(winURL, 'Detail','width=540, height=400,left=250,top=75');
		}
		return false;
	},


	
	// called from button
	saveToUrl: function()	{
		// hide hide button
		$('.hidebutton').css('display', 'none');
		// hide back button
		$('.backbutton').css('display', 'none');
		var baseurl = location.href + '?action=saveURL';	//
		var urlloc = buildURL(baseurl);		
				var output = "Please click <a href='"+urlloc+"'>HERE</a> and bookmark the resulting page for your records.  Bookmarking this page in your Favorites/Bookmark list will enable you to look at this layout again later. We suggest giving this layout a special title in your Bookmarks list, for example: <em>PhotoText- Custom Sign</em>.  <br />&bull; For Firefox users, your <strong>Bookmarks</strong> menu is located at the top of your screen.  Select <em>Bookmark This Page</em>.  <br />&bull; Internet Explorer users, your <strong>Favorites</strong> menu is located at the top of your screen.  Select <em>Add to Favorites</em>.&nbsp;&nbsp;<a href='javascript:PTC.dlgclose()'>[CLOSE]</a>";
		document.getElementById("select_letter").innerHTML = output;
		this.opacScreen_Open();
		$('.frame').hide();
		$('#select_letter').Grow();
		document.getElementById("select_letter").style.visibility = "visible";
	},
	
	purchaseIt: function() {
		if (this.checkEmail() === false) {
			alert("Please check your email address.");
			return;
		}
		var baseurl = 'php/custom_product_new.php?action=add_custom_product_new';
		// build the rest of the url
		var url = buildURL(baseurl);
		// redirect using returned product id
		$.ajax({
			url: url,
			success: function(msg){
							//logUserData(msg);
							if (window.location.hash == "#debug") {
								alert("pid: " + msg);
							}
							if (!isNaN(parseInt(msg))) {
								//return window.location.href = './catalog/product_info.php?products_id=' + msg;
								return doPurchase(msg, 'purchase'); // "container" function that includes above
							} else {
								alert("There has been a problem.");
							}
								
							//return window.location.href = './catalog/product_info.php?products_id=' + msg;
							//return doPurchase(msg, 'purchase'); // "container" function that includes above
							//alert(msg);
						}
		});
	},

	saveToRegistry: function() {
		if (this.checkEmail() === false) {
			alert("Please check your email address.");
			return;
		}

		var baseurl = 'php/custom_product_new.php?action=add_custom_product_new';
		// build the rest of the url
		var url = buildURL(baseurl);
		// redirect using returned product id
		$.ajax({
			url: url,
			success: function(msg) {
						return window.location.href = 'catalog/help_registry_owner.php';
						//return doPurchase(msg, 'registry');
					}
		});
	},
	
	// temporary function to develop wholesale buying direct with no cart, etc in osC
	// same as purchaseIt() with different redirect
	buyWholesale: function() {
		var baseurl = 'php/custom_product_new.php?action=add_custom_product_new&taxclass=0';
		// build the rest of the url
		var url = buildURL(baseurl);
		// check for rush charge
		var el = document.getElementById('addrush');
		var addrush = (el.checked ? true : false);
		// redirect using returned product id
		$.ajax({
			url: url,
			success: function(msg){
				//return window.location.href='catalog/checkout_success.php'; // redirects to shopping_cart.php 'cause cart empty
				return window.location.href = 'catalog/checkout_wholesale.php?products_id=' + msg + '&addrush=' + addrush.toString();
				//alert(msg);
			}
		});		
	},

	// does dealer want to use wizard or just fill in form?
	showForm: function(obj) {
		if (!obj) {
			if (document.getElementById('wechoose').checked == true) {
				obj = document.getElementById('wechoose');
			} else {
				obj = document.getElementById('usewizard');
			} 
		}
		if (obj.value == 'wechoose') { // first radio button
			//document.getElementById('orderform').style.display = 'block';
			$("#signimage").css("display", "none");	// sign image fieldset NA
			$("#orderform").slideDown(2000);
			document.getElementById("textin").disabled = true;
			document.getElementById("startbutton").disabled = true;
			document.getElementById("startbutton").style.backgroundPosition = "0 0";
			//$("#startbutton").css("color", "#77f");
			setDates();
			$("#imagechoicemethod").val("wechoose");
			$(obj).parent().addClass('selected');
			$('#usewizard').parent().removeClass('selected');
		} else if (obj.value == 'usewizard') {
			$("#orderform").slideUp(2000);
			document.getElementById("textin").disabled = false;
			document.getElementById("startbutton").disabled = false;
			document.getElementById("startbutton").style.backgroundPosition = "0 -30";
			//$("#startbutton").css("color", "#000");
			$("#imagechoicemethod").val("usewizard");
			$(obj).parent().addClass('selected');
			$('#wechoose').parent().removeClass('selected');
		}				
	},
	
	checkEmail: function() {
		var address = $('#data_email').val();
		/* var url = "php/uservalidation.php";
		var retval = $.ajax({
						url: url,
						data: "action=checkemail&address=" + address,
						success: function(data) {
									if (data == 'valid') {
										$('#buybutton').removeClass('disabled').addClass('buttonhover');
										$('#registrybutton').removeClass('disabled').addClass('buttonhover');
										return true;										
									} else {
										//alert("Please check your email address");
										return false;										
									}
								}
				}) */
		//var pattern = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/;
		var pattern = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)*(\.[a-zA-Z]{2,3})$/;
		var valid = pattern.test(address);
		if (valid) {
			$('#buybutton').removeClass('disabled').addClass('buttonhover');
			$('#registrybutton').removeClass('disabled').addClass('buttonhover');
			setTimeout(function(){
						$('#buybutton').removeClass('buttonhover');
						$('#registrybutton').removeClass('buttonhover');
						}, 625);
		}
		return valid;
	}
	

	}	// end return
}();
	
										
