/**
 * handle errors from flash upload
 * @param event
 * @param queueID
 * @param fileObj
 * @param errorObj
 * @return
 */
function errorHandler(event, queueID, fileObj, errorObj) {
	switch (errorObj.type) {
		case 'File Size':
			var size = (errorObj.info / 1024)/1000;
			alert('You cannot upload an image that is more than '+ size.toFixed(2) +'Mb in size');
			break;
		default:
			alert('An Error occured when trying to upload the image. If the problem persists them please contact Whamoosh to report the problem');
			break;
	}
	$.unblockUI();
}

/**
 * build and submit card
 * @return
 */
function submitCard(){
	
	// empty submission form
	$("#submit_card").empty();
	
	// set validation to true
	var valid = true;
	
	// process each editable text area (front face_
	$('.editable_textarea').each( function(){			
		var input = document.createElement('input');
		var uid = document.createElement('input');
		var thez = $(this).css('z-index') - 5;
		var theclass = $(this).attr('class').split(" ");
		var info = theclass[0].split('_');			
		var thename = "card["+info[0]+"][" + thez + "]";
		
		$(uid).attr('type', 'hidden')
			.attr('value', info[1]) 
			.attr('name', thename+"[uid]");
		
		// get the value from the related text area
		var thevalue = $('#textarea_' + theclass[0]).val();
		$(input).attr('type', 'hidden')
			.attr('value',thevalue)
			.attr('name', thename+"[text]");

		$("#submit_card").prepend(input).prepend(uid);		
		
	});
	
	// process inside text areas
	$('textarea[id^=area_]').each(function() {
		// create elements to pass to postback
		var text = document.createElement('input');
		var uid = document.createElement('input');
		var font = document.createElement('input');
		var size = document.createElement('input');
		var align = document.createElement('input');
		var gravity = document.createElement('input');
		var color = document.createElement('input');
		
		// create prefix for element names
		var z = $(this).css('z-index') - 5;
		var id = $(this).attr('id').replace(/^area_/, "");
		var info = id.split('_');	// info[0] = face , info[0] = area uid
		var prefix = "card["+info[0]+"][" + z + "]";
		
		// set uid
		$(uid).attr('type', 'hidden').attr('value', info[1]).attr('name', prefix+"[uid]");
	
		// set value
		$(text).attr('type', 'hidden').attr('value',$(this).val()).attr('name', prefix+"[text]");
	
		// set font
		$(font).attr('type', 'hidden') .attr('value',$(this).css('font-family')).attr('name', prefix+"[font]");
		
		// set size
		$(size).attr('type', 'hidden').attr('value',$(this).css('font-size')).attr('name', prefix+"[size]");
		
		// set alignment
		$(align).attr('type', 'hidden').attr('value',$(this).css('text-align')).attr('name', prefix+"[align]");
		
		// set gravity
		$(gravity).attr('type', 'hidden').attr('value',$(this).parent('td').css('vertical-align')).attr('name', prefix+"[gravity]");
		
		// set color
		$(color).attr('type', 'hidden').attr('value',$(this).css('color')).attr('name', prefix+"[color]");
		
		
		$("#submit_card").prepend(text)
									.prepend(uid)
									.prepend(font)
									.prepend(size)
									.prepend(align)
									.prepend(gravity)
									.prepend(color);		
		
	});
	
	var uneditedImages = 0;
	// process editable images
	$('.editable_images').each( function(){
		var inputUid = document.createElement('input');
		var inputVal = document.createElement('input');
		var inputX = document.createElement('input');
		var inputY = document.createElement('input');
		var inputW = document.createElement('input');
		var inputH = document.createElement('input');
		var thez = $(this).css('z-index') - 1;
		var theclass = $(this).attr('class').split(" ");
		var info = theclass[0].split('_');			
		var thename = "card["+info[0]+"][" + thez + "]";
		
		$(inputUid).attr('type', 'hidden')
			.attr('name', thename+"[uid]")
			.attr('value', info[1]);

		var theimg = $(this).find('div > img');
		// test for images to validate
		if (!theimg.length) {
			uneditedImages += 1;
		}
		$(inputVal).attr('type', 'hidden')
			.attr('name', thename+"[src]")
			.attr('value', theimg.attr('src'));			
		$(inputX).attr('type', 'hidden')
			.attr('name', thename+"[left]")
			.attr('value', theimg.css('left'));
		$(inputY).attr('type', 'hidden')
			.attr('name', thename+"[top]")
			.attr('value', theimg.css('top'));
		$(inputW).attr('type', 'hidden')
			.attr('name', thename+"[width]")
			.attr('value', theimg.width());
		$(inputH).attr('type', 'hidden')
			.attr('name', thename+"[height]")
			.attr('value', theimg.height());
		
		$("#submit_card").prepend(inputVal).prepend(inputX).prepend(inputY).prepend(inputW).prepend(inputH).prepend(inputUid);						

	});
	
	// process keyword fields
	$(".keyword").each( function(){
		var keyid = $(this).attr('class').replace(' keyword','').split("_");
		var keyword = document.createElement('input');
		$(keyword).attr('type', 'hidden')
				  .attr('name', "keywords["+keyid[1]+"]")
				  .attr('value', $(this).html().replace(/<(.*?)>/ig,""));
		$("#submit_card").prepend(keyword);                  
	}); 

	
	var prod = document.createElement('input');
	$(prod).attr('type', 'hidden').attr('name', 'productId').attr('value', window.prod);
	var card = document.createElement('input');
	$(card).attr('type', 'hidden').attr('name', 'cardId').attr('value', window.card);
	
	// check if card is facetec card
	if (window.isFacetec) {
		var crdImg = $("#card_image").attr('src');
		// test images present
		if (( uneditedImages > 0) || (crdImg.match(/^\/images\/cards\/backgrounds/)) ) {
			if (!confirm("You have not uploaded an image for this card.\n Click OK if you are happy to continue?")) {
				$("#submit_card").html('');
				return false;
			}
		}
		// test images present
	} else if ( uneditedImages > 0 ) {
			if (!confirm("You have not uploaded an image for this card.\n Click OK if you are happy to continue?")) {
				$("#submit_card").html('');
				return false;
			}
		}
	
	// store faceit data
	var faceit = document.createElement('input');
	$(faceit).attr('type', 'hidden').attr('name', 'faceIt').attr('value', $("#card_image").attr('src'));
	
	// store previous url
	var prevurl = document.createElement('input');
	$(prevurl).attr('type', 'hidden').attr('name', 'prevurl').attr('value', window.thisurl);
	
	// store selected purchase size
	var size = document.createElement('input');
	$(size).attr('type', 'hidden').attr('name', 'size').attr('value', $('.cardSize:checked').val());
	
	// add values to form for submission
	$("#submit_card").prepend(prod).prepend(card).prepend(faceit).prepend(prevurl).prepend(size);

	// postback card data for processing
	$.post('/mall/product/previewpostback',
			$("#submit_card").serialize(), // serialize form
			function (data, textStatus) {
				if ('success' == textStatus) {
					if ('success' == data.result) {
						// go to preview
						window.location.href = '/preview';
					} else {
						alert('There was a problem building your preview');
					}
				} else {
					alert('There was a problem building your preview');
				}
			}, 'json');
	
}
	

function getMoveID(classname){
	var theid_split = classname.split(' ');
	return theid_split[1].substr(3);
}
	

function zoom(area, movement)
{
	
}

function editCardArea(file, editID){
	
	currentImage = file;
	currentResize = editID;
	var timestamp = new Date().getTime();
	var img = new Image();
	$(img).load(function() {
		$('#resize_holder').html(img);
		jcropApi = $.Jcrop(img);
		
	}).attr('class', 'editableImage_'+editID)
	  .attr('src', '/mall/ajax/editimage/file/'+file+'/type/cardarea/?'+timestamp);
	
	return false;
}

function addCropGuides() {
	window.jcropApi.setOptions({
		minSize: [0,0]
	});
	window.jcropApi.setSelect([10, 10, 100, 100]);
}

function cropImage() {
	showBlockUI($("#resize_faceit"));
	var ords = jcropApi.tellSelect();
	var timestamp = new Date().getTime();
		// ords defines image as cropped
		if (ords['x']) {
			var cropurl = '/mall/ajax/cropimage/file/'+currentImage+'/type/cardarea/crop/true/store/true';
		} else {
			var cropurl = '/mall/ajax/cropimage/file/'+currentImage+'/type/cardarea/crop/false/store/true';
		}
		$.post(cropurl, 
			ords, 
			function (data, textStatus) {
				if ('success' == textStatus) {
					if ('success' == data.result) {
						useImage();
					} else {					
						alert(data.msg);
						unblockElement|('#resize_holder');
					}
				} else {
					alert('There was a problem trying to crop your image');
					unblockElement|('#resize_holder');
				}
			}, 'json');	
	//} else {
	//	useImage();
	//}
}

function rotateImage(degrees) {
	blockElement("#resize_holder");
	var timestamp = new Date().getTime();	
	if (isLibraryImage) {
		var type = 'library';
	} else {
		var type = '';
	}
	//if (jcropApi != undefined){ jcropApi.destroy(); }
	$.post('/mall/ajax/rotateImage',
		{ file: currentImage, degrees: degrees, type: type},
		function(data, textStatus) {
			if ('success' == textStatus) {
				jcropApi.destroy();
				$('.editableImage_'+currentResize).remove();
				var img = new Image();
				var url = '/mall/ajax/editimage/file/'+currentImage+'/';
				if (isLibraryImage) {
					url += 'type/library/';
				} else {
					url += 'type/cardarea/';
				}
				$(img).load( function(){
					$("#resize_holder").html(img);
					jcropApi = $.Jcrop(img);
					unblockElement("#resize_holder");
				}).error(function() {
					alert('There was a problem loading ' + this.src);
					unblockElement("#resize_holder");
				}).addClass('editableImage_'+currentResize)
				  .attr('src', url + '?'+timestamp);
			}else {
				alert('Could not rotate your image');
				unblockElement("#resize_holder");
			}
		});
}

function useImage(type, loadImage){
	
	var timestamp = new Date().getTime();
	
	if (loadImage) {
		currentImage = loadImage;
	}
	
	switch (type) {
		case 'customer':
			var url = '/mall/ajax/showcustomerimage/file/' + filename + '/?' + timestamp;
			break;
		case 'upload':
		default:
			var url = '/mall/ajax/showcardarea/file/' + currentImage + '/?' + timestamp;
			break;
	}
	
	
	var thedata;
	var w = parseInt($('.'+currentResize).css('width'));
	var h = parseInt($('.'+currentResize).css('height'));
	
	var image = new Image();
	$(image).load(function() {
		if (w > h) {
			// apply width restriction
			var multiplier = image.width/w;
			var percent = image.width/100;
			var sliderValue = Math.round(w/percent);
			$(image).css('width', w);
			$(image).css('height', image.height/multiplier);
		} else {
			// apply height restriction
			var multiplier = image.height/h;
			var percent = image.height/100;
			var sliderValue = h/percent;
			$(image).css('height', h);
			$(image).css('width', image.width/multiplier);
		}
		
		var input = document.createElement('input');						
		var input2 = document.createElement('input');
		var input3 = document.createElement('input');
		$(input).attr('type', 'hidden')
				.attr('id', 'initw_'+currentResize)
				.attr('value', parseInt($(image).css('width')));
		$(input2).attr('type', 'hidden')
				.attr('id', 'inith_'+currentResize)
				.attr('value', parseInt($(image).css('height')));
		$(input3).attr('type', 'hidden')
				.attr('id', 'inits_'+currentResize)
				.attr('value', sliderValue);
		var imgholder = document.createElement('div');
		imgholder.appendChild(image);
		imgholder.appendChild(input);				
		imgholder.appendChild(input2);	
		imgholder.appendChild(input3);
		$('.'+currentResize).html(imgholder);
		
		$('#imgcontrols_'+currentResize).css({ display: 'block' });
		$('#mv_'+currentResize).slider('option', 'value', sliderValue);

		$("#resize_dialog").dialog('close');
		
		currentImage = null;
		currentResize = null;
		hideBlockUI();
		$("#resize_holder").html('');
		
	}).attr('src', url)
	  .addClass('upload_'+ currentResize)
	  .addClass('moveable_image');
	hideBlockUI();
	$("#resize_holder").html('');
}

function showLoader(){
	$("#resize_loader").show();
	$("#resize_holder").hide();
}
function hideLoader(){
	$("#resize_loader").hide();
	$("#resize_holder").show();
}

function showBlockUI(elm, extra){	
	/*if(elm){
		elm.dialog('close');
	}*/
	var themessage = '<img src="/images/design/animations/ajax-logoanimation.gif" />';
	if(extra != undefined){
	    themessage += extra;
	}
	$.blockUI({ 
		message: themessage,
		css: { 
	    	border: '3px solid #999', 
	    	padding: '15px', 
	    	backgroundColor: '#FFF', 
	    	'-webkit-border-radius': '10px', 
	    	'-moz-border-radius': '10px', 
	    	opacity: .8, 
	    	color: '#000000'
		},
		baseZ: 2000
	}); 
}

function blockElement(element) {
	$(element).block({ 
		message: '<img src="/images/design/animations/ajax-logoanimation.gif" />',
		css: { 
	    	border: '3px solid #999', 
	    	padding: '15px', 
	    	backgroundColor: '#FFF', 
	    	'-webkit-border-radius': '10px', 
	    	'-moz-border-radius': '10px', 
	    	opacity: .8, 
	    	color: '#F2F2F2'
		}
	});
}

function unblockElement(element) {
	$(element).unblock();
}

function hideBlockUI(elm){
	$.unblockUI();
	/*if(elm){
		elm.dialog('open');
	}*/
}

function newPhoto() {
	$("#resize_dialog").dialog('close');
	$("#resize_holder").html('');
	$("#uploaddiag_"+currentResize).dialog('open');
}

var facebookUploadCallbackCheck = null;

function loadPhotoFacebookImages(areaId) {
	window.facebookUploadCallbackCheck = areaId; 
	window.currentResize = areaId;
	$('#faceitFacebookDialog').dialog('open');
}

var flickrUploadCallbackCheck = null;

function loadPhotoFlickrImages(areaId) {
	window.flickrUploadCallbackCheck = areaId; 
	window.currentResize = areaId;
	$('#faceitFlickrDialog').dialog('open');
}

$(document).ready( function(){

	$('.didntwork_tooltip').tooltip({ 
	    delay: 0, 
	    track: false,
	    showURL: false, 
	    extraClass: "didntwork_text", 
	    positionLeft: true,
	    top: -20,
	    left: -1,
	    bodyHandler: function() { 
	        return "If your uploaded image has failed or if you want to try another image click on the upload face button again."; 
	    }
		
	});
	$('.editable_test_tooltip').tooltip({ 
	    delay: 0, 
	    track: false,
	    showURL: false,
	    extraClass: "editable_text", 
	    top: -20,
	    bodyHandler: function() { 
	        return "Can't see all of your text? Don't worry, when you select preview you will see all the text sized to the area."; 
	    } 
		
	});
	
	
	$(".heading_text").focus( function(e){	
		$(this).children('.textarea_val').focus();
	})
	$(".textarea_val").focus( function(e){		
		var theid = $(this).attr('id');
		var theid_split = theid.split("_");		
		$("."+theid_split[1]+"_"+theid_split[2]).addClass('editable_textarea_highlight');
		$("."+theid_split[1]+"_"+theid_split[2]).parent('.text_outer_container').children('.editable_test_tooltip').addClass('editable_test_tooltip_visible');
		
	}).blur( function(e){		
		var theid = $(this).attr('id');
		var theid_split = theid.split("_");		
		$("."+theid_split[1]+"_"+theid_split[2]).removeClass('editable_textarea_highlight');
		$("."+theid_split[1]+"_"+theid_split[2]).parent('.text_outer_container').children('.editable_test_tooltip').removeClass('editable_test_tooltip_visible');
		
	}).elastic().trigger('change');
	
	$(".textarea_val").keyup( function(e){		
		var theid = $(this).attr('id');
		var theid_split = theid.split("_");		
		
		$("."+theid_split[1]+"_"+theid_split[2]).html($(this).val().replace(/\n/g,'<br>').replace(/\s/gim, '&nbsp;'));
		Cufon.replace("."+theid_split[1]+"_"+theid_split[2], {fontFamily: window.fonts[theid_split[2]]}).now();
	});
	
	$("#info_reset").click( function(){		
		for(t in original_text) {
			$(".text_front_"+t).html(original_text[t]);
			$(".front_"+t).html(original_text[t]);
			if ($(".front_"+t).parent().length) {
				var parent_id = $(".front_"+t).parent().attr("class").split(" ");
				var parent_split = parent_id[0].split("_");
				Cufon.replace("."+parent_id[0], {fontFamily: window.fonts[parent_split[1]]}).now();
			}
		}
		for(ta in original_textarea) {
			$(".textarea_front_"+ta).html(original_textarea[ta]);
			$(".front_"+ta).html(original_textarea[ta]);
			Cufon.replace(".front_"+ta, {fontFamily: window.fonts[ta]}).now();
		}
	});
	
	/* FUNCTIONS TO CONTROL IMAGE UPLOADS */
	$('.move_up').click( function(){
		var theid = getMoveID($(this).attr('class'));
		var newpos = ($('.upload_' +theid).position().top - 5);		
		$('.upload_' +theid).css({ top : (newpos) });
	});
	$('.move_down').click( function(){
		var theid = getMoveID($(this).attr('class'));
		var newpos = ($('.upload_' +theid).position().top + 5);
		$('.upload_' +theid).css({ top : (newpos) });
	});
	$('.move_left').click( function(){
		var theid = getMoveID($(this).attr('class'));
		var newpos = ($('.upload_' +theid).position().left - 5);
		$('.upload_' +theid).css({ left : (newpos) });
	});
	$('.move_right').click( function(){
		var theid = getMoveID($(this).attr('class'));
		var newpos = ($('.upload_' +theid).position().left + 5);
		$('.upload_' +theid).css({ left : (newpos) });
	});
	$('.move_reset').click( function(){
		var theid = getMoveID($(this).attr('class'));		
		$('.upload_' +theid)
			.css('left', 0)
			.css('top', 0)
			.css("width", $("#initw_"+theid).val()+'px')
			.css("height", $("#inith_"+theid).val()+'px');
		$("#mv_"+theid).slider('option', 'value', $('#inits_'+theid).val());
	});
	
	$(".move_slider").slider({	
		max		: 200,
		value	: 100,
		slide	: function(event, ui){
			var theid = $(this).attr("id").substr(3);
			var decw = (($("#initw_"+theid).val() / 100) * ui.value);
			var dech = (($("#inith_"+theid).val() / 100) * ui.value);
			$(".upload_"+theid).css("width", decw);
			$(".upload_"+theid).css("height", dech);
		}
	});
	
	$("#preview_card").click( function(){
		submitCard();
	});
	
	$(".customer_select").click( function(){
		
		var parentdiv = $(this).parent().parent().get(0);
		var theid = $(parentdiv).attr('id').replace('cust_', '');
		var filename = $(this).attr('alt');
		var w = parseInt($('.'+theid).css('width'));
		var h = parseInt($('.'+theid).css('height'));
		
		showBlockUI($("#uploaddiag_"+theid));
				
		$("#customer_loader_"+theid).css('display','block');
		$("#customer_notice_"+theid).css('display','block').html('Generating Image...');
		
		var imgholder = document.createElement('div');
		var img = new Image;
		var thedata;
		$(img).load(function() {
			if (w > h) {
				// apply width restriction
				var multiplier = img.width/w;
				var percent = img.width/100;
				var sliderValue = Math.round(w/percent)*2;
				$(img).css('width', w);
				$(img).css('height', parseInt(img.height/multiplier));
			} else {
				// apply height restriction
				var multiplier = img.height/h;
				var percent = img.height/100;
				var sliderValue = Math.round(h/percent)*2;
				$(img).css('height', h);
				$(img).css('width', parseInt(img.width/multiplier));
			}
			
			var input = document.createElement('input');						
			var input2 = document.createElement('input');
			var input3 = document.createElement('input');
			$(input).attr('type', 'hidden')
					.attr('id', 'initw_'+theid)
					.attr('value', parseInt($(img).css('width')));
			$(input2).attr('type', 'hidden')
				.attr('id', 'inith_'+theid)
				.attr('value', parseInt($(img).css('height')));
			$(input3).attr('type', 'hidden')
				.attr('id', 'inits_'+theid)
				.attr('value', sliderValue);
			var imgholder = document.createElement('div');
			imgholder.appendChild(img);
			imgholder.appendChild(input);				
			imgholder.appendChild(input2);
			imgholder.appendChild(input3);
			$('.'+theid).html(imgholder);
			
			$('#imgcontrols_'+theid).css({ display: 'block' });
			$('#mv_'+theid).slider('option', 'value', sliderValue)
			$("#customer_loader_"+theid).css('display','none');
			$("#customer_notice_"+theid).html('Image used successfully!');
			$("#uploaddiag_"+theid).dialog('close');
			
			hideBlockUI();
			
		}).attr('src', '/mall/ajax/showcustomerimage/file/' + filename)
		  .addClass('upload_'+ theid)
		  .addClass('moveable_image');
		
	}).css('cursor', 'pointer');
	
	$('#resize_dialog').dialog({
		autoOpen	: false,
		modal		: true,
		height		: 'auto',
		position	: 'top',
		width		: 640,
		title	: '<img src="/images/design/upload-stage-2-a.png" />',
    	close	: function(event, ui) {
			if (undefined != window['jcropApi']) { jcropApi.destroy(); }	
			$('#fileInputQueue').html('');
	    }
    });
	
	$('#cardSizeDialog').dialog({
		autoOpen	: false,
		modal		: true,
		height		: 'auto',
		width		: 500
    });
	

	$("#resize_loader").css('display','none');

	$("#faceitFacebookDialog").dialog({
		modal	: true,
		width	: '985px',
		height	: 600,
		autoOpen: false,	
		resizable: false,
		position : 'top',
		stack	: true,
    	open	: function(event, ui) {
			var iframe = document.createElement('iframe');
			$(iframe).attr('src', '/facebook')
					 .css('width', '100%')
					 .css('height', '100%')
					 .css('margin', 0)
					 .css('padding', 0)
					 .css('border', 0)
					 .css('background-color', '#F3F3F4')
					 .attr('border', 0)
					 .attr('marginWidth', 0)
					 .attr('marginHeight', 0)
					 .attr('frameborder', 0);
			
			$(this).html(iframe);
	    },
	    close	: function(event, ui) {
	    }
	});
	
	$("#faceitFlickrDialog").dialog({
		modal	: true,
		width	: '985px',
		height	: 600,
		autoOpen: false,	
		resizable: false,
		position : 'top',
		stack	: true,
    	open	: function(event, ui) {
			var iframe = document.createElement('iframe');
			$(iframe).attr('src', '/flickr')
					 .css('width', '100%')
					 .css('height', '100%')
					 .css('margin', 0)
					 .css('padding', 0)
					 .css('border', 0)
					 .css('background-color', '#F3F3F4')
					 .attr('border', 0)
					 .attr('marginWidth', 0)
					 .attr('marginHeight', 0)
					 .attr('frameborder', 0);
			
			$(this).html(iframe);
	    },
	    close	: function(event, ui) {
	    }
	});
	
	$("#failedDialog").dialog({
		modal	: true,
		width	: '400px',
		height	: 'auto',
		autoOpen: false,	
		resizable: false,
		stack	: true
	});
	
});



// HtmlDecode http://lab.msdn.microsoft.com/annotations/htmldecode.js
//client side version of the useful Server.HtmlDecode method
//takes one string (encoded) and returns another (decoded)
function HtmlDecode(s)
{
	var out = "";
	if (s==null) return;
	var l = s.length;
	for (var i=0; i<l; i++){
	var ch = s.charAt(i);
		if (ch == '&'){
			var semicolonIndex = s.indexOf(';', i+1);
			if (semicolonIndex > 0){
				var entity = s.substring(i + 1, semicolonIndex);
				if (entity.length > 1 && entity.charAt(0) == '#'){
					if (entity.charAt(1) == 'x' || entity.charAt(1) == 'X')
						ch = String.fromCharCode(eval('0'+entity.substring(1)));
					else
						ch = String.fromCharCode(eval(entity.substring(1)));
				} else {
					switch (entity)	{
						case 'quot': ch = String.fromCharCode(0x0022); break;
						case 'amp': ch = String.fromCharCode(0x0026); break;
                        case 'lt': ch = String.fromCharCode(0x003c); break;
                        case 'gt': ch = String.fromCharCode(0x003e); break;
                        case 'nbsp': ch = String.fromCharCode(0x00a0); break;
                        case 'iexcl': ch = String.fromCharCode(0x00a1); break;
                               case 'cent': ch = String.fromCharCode(0x00a2); break;
                               case 'pound': ch = String.fromCharCode(0x00a3); break;
                               case 'curren': ch = String.fromCharCode(0x00a4); break;
                               case 'yen': ch = String.fromCharCode(0x00a5); break;
                               case 'brvbar': ch = String.fromCharCode(0x00a6); break;
                               case 'sect': ch = String.fromCharCode(0x00a7); break;
                               case 'uml': ch = String.fromCharCode(0x00a8); break;
                               case 'copy': ch = String.fromCharCode(0x00a9); break;
                               case 'ordf': ch = String.fromCharCode(0x00aa); break;
                               case 'laquo': ch = String.fromCharCode(0x00ab); break;
                               case 'not': ch = String.fromCharCode(0x00ac); break;
                               case 'shy': ch = String.fromCharCode(0x00ad); break;
                               case 'reg': ch = String.fromCharCode(0x00ae); break;
                               case 'macr': ch = String.fromCharCode(0x00af); break;
                               case 'deg': ch = String.fromCharCode(0x00b0); break;
                               case 'plusmn': ch = String.fromCharCode(0x00b1); break;
                               case 'sup2': ch = String.fromCharCode(0x00b2); break;
                               case 'sup3': ch = String.fromCharCode(0x00b3); break;
                               case 'acute': ch = String.fromCharCode(0x00b4); break;
                               case 'micro': ch = String.fromCharCode(0x00b5); break;
                               case 'para': ch = String.fromCharCode(0x00b6); break;
                               case 'middot': ch = String.fromCharCode(0x00b7); break;
                               case 'cedil': ch = String.fromCharCode(0x00b8); break;
                               case 'sup1': ch = String.fromCharCode(0x00b9); break;
                               case 'ordm': ch = String.fromCharCode(0x00ba); break;
                               case 'raquo': ch = String.fromCharCode(0x00bb); break;
                               case 'frac14': ch = String.fromCharCode(0x00bc); break;
                               case 'frac12': ch = String.fromCharCode(0x00bd); break;
                               case 'frac34': ch = String.fromCharCode(0x00be); break;
                               case 'iquest': ch = String.fromCharCode(0x00bf); break;
                               case 'Agrave': ch = String.fromCharCode(0x00c0); break;
                               case 'Aacute': ch = String.fromCharCode(0x00c1); break;
                               case 'Acirc': ch = String.fromCharCode(0x00c2); break;
                               case 'Atilde': ch = String.fromCharCode(0x00c3); break;
                               case 'Auml': ch = String.fromCharCode(0x00c4); break;
                               case 'Aring': ch = String.fromCharCode(0x00c5); break;
                               case 'AElig': ch = String.fromCharCode(0x00c6); break;
                               case 'Ccedil': ch = String.fromCharCode(0x00c7); break;
                               case 'Egrave': ch = String.fromCharCode(0x00c8); break;
                               case 'Eacute': ch = String.fromCharCode(0x00c9); break;
                               case 'Ecirc': ch = String.fromCharCode(0x00ca); break;
                               case 'Euml': ch = String.fromCharCode(0x00cb); break;
                               case 'Igrave': ch = String.fromCharCode(0x00cc); break;
                               case 'Iacute': ch = String.fromCharCode(0x00cd); break;
                               case 'Icirc': ch = String.fromCharCode(0x00ce ); break;
                               case 'Iuml': ch = String.fromCharCode(0x00cf); break;
                               case 'ETH': ch = String.fromCharCode(0x00d0); break;
                               case 'Ntilde': ch = String.fromCharCode(0x00d1); break;
                               case 'Ograve': ch = String.fromCharCode(0x00d2); break;
                               case 'Oacute': ch = String.fromCharCode(0x00d3); break;
                               case 'Ocirc': ch = String.fromCharCode(0x00d4); break;
                               case 'Otilde': ch = String.fromCharCode(0x00d5); break;
                               case 'Ouml': ch = String.fromCharCode(0x00d6); break;
                               case 'times': ch = String.fromCharCode(0x00d7); break;
                               case 'Oslash': ch = String.fromCharCode(0x00d8); break;
                               case 'Ugrave': ch = String.fromCharCode(0x00d9); break;
                               case 'Uacute': ch = String.fromCharCode(0x00da); break;
                               case 'Ucirc': ch = String.fromCharCode(0x00db); break;
                               case 'Uuml': ch = String.fromCharCode(0x00dc); break;
                               case 'Yacute': ch = String.fromCharCode(0x00dd); break;
                               case 'THORN': ch = String.fromCharCode(0x00de); break;
                               case 'szlig': ch = String.fromCharCode(0x00df); break;
                               case 'agrave': ch = String.fromCharCode(0x00e0); break;
                               case 'aacute': ch = String.fromCharCode(0x00e1); break;
                               case 'acirc': ch = String.fromCharCode(0x00e2); break;
                               case 'atilde': ch = String.fromCharCode(0x00e3); break;
                               case 'auml': ch = String.fromCharCode(0x00e4); break;
                               case 'aring': ch = String.fromCharCode(0x00e5); break;
                               case 'aelig': ch = String.fromCharCode(0x00e6); break;
                               case 'ccedil': ch = String.fromCharCode(0x00e7); break;
                               case 'egrave': ch = String.fromCharCode(0x00e8); break;
                               case 'eacute': ch = String.fromCharCode(0x00e9); break;
                               case 'ecirc': ch = String.fromCharCode(0x00ea); break;
                               case 'euml': ch = String.fromCharCode(0x00eb); break;
                               case 'igrave': ch = String.fromCharCode(0x00ec); break;
                               case 'iacute': ch = String.fromCharCode(0x00ed); break;
                               case 'icirc': ch = String.fromCharCode(0x00ee); break;
                               case 'iuml': ch = String.fromCharCode(0x00ef); break;
                               case 'eth': ch = String.fromCharCode(0x00f0); break;
                               case 'ntilde': ch = String.fromCharCode(0x00f1); break;
                               case 'ograve': ch = String.fromCharCode(0x00f2); break;
                               case 'oacute': ch = String.fromCharCode(0x00f3); break;
                               case 'ocirc': ch = String.fromCharCode(0x00f4); break;
                               case 'otilde': ch = String.fromCharCode(0x00f5); break;
                               case 'ouml': ch = String.fromCharCode(0x00f6); break;
                               case 'divide': ch = String.fromCharCode(0x00f7); break;
                               case 'oslash': ch = String.fromCharCode(0x00f8); break;
                               case 'ugrave': ch = String.fromCharCode(0x00f9); break;
                               case 'uacute': ch = String.fromCharCode(0x00fa); break;
                               case 'ucirc': ch = String.fromCharCode(0x00fb); break;
                               case 'uuml': ch = String.fromCharCode(0x00fc); break;
                               case 'yacute': ch = String.fromCharCode(0x00fd); break;
                               case 'thorn': ch = String.fromCharCode(0x00fe); break;
                               case 'yuml': ch = String.fromCharCode(0x00ff); break;
                               case 'OElig': ch = String.fromCharCode(0x0152); break;
                               case 'oelig': ch = String.fromCharCode(0x0153); break;
                               case 'Scaron': ch = String.fromCharCode(0x0160); break;
                               case 'scaron': ch = String.fromCharCode(0x0161); break;
                               case 'Yuml': ch = String.fromCharCode(0x0178); break;
                               case 'fnof': ch = String.fromCharCode(0x0192); break;
                               case 'circ': ch = String.fromCharCode(0x02c6); break;
                               case 'tilde': ch = String.fromCharCode(0x02dc); break;
                               case 'Alpha': ch = String.fromCharCode(0x0391); break;
                               case 'Beta': ch = String.fromCharCode(0x0392); break;
                               case 'Gamma': ch = String.fromCharCode(0x0393); break;
                               case 'Delta': ch = String.fromCharCode(0x0394); break;
                               case 'Epsilon': ch = String.fromCharCode(0x0395); break;
                               case 'Zeta': ch = String.fromCharCode(0x0396); break;
                               case 'Eta': ch = String.fromCharCode(0x0397); break;
                               case 'Theta': ch = String.fromCharCode(0x0398); break;
                               case 'Iota': ch = String.fromCharCode(0x0399); break;
                               case 'Kappa': ch = String.fromCharCode(0x039a); break;
                               case 'Lambda': ch = String.fromCharCode(0x039b); break;
                               case 'Mu': ch = String.fromCharCode(0x039c); break;
                               case 'Nu': ch = String.fromCharCode(0x039d); break;
                               case 'Xi': ch = String.fromCharCode(0x039e); break;
                               case 'Omicron': ch = String.fromCharCode(0x039f); break;
                               case 'Pi': ch = String.fromCharCode(0x03a0); break;
                               case ' Rho ': ch = String.fromCharCode(0x03a1); break;
                               case 'Sigma': ch = String.fromCharCode(0x03a3); break;
                               case 'Tau': ch = String.fromCharCode(0x03a4); break;
                               case 'Upsilon': ch = String.fromCharCode(0x03a5); break;
                               case 'Phi': ch = String.fromCharCode(0x03a6); break;
                               case 'Chi': ch = String.fromCharCode(0x03a7); break;
                               case 'Psi': ch = String.fromCharCode(0x03a8); break;
                               case 'Omega': ch = String.fromCharCode(0x03a9); break;
                               case 'alpha': ch = String.fromCharCode(0x03b1); break;
                               case 'beta': ch = String.fromCharCode(0x03b2); break;
                               case 'gamma': ch = String.fromCharCode(0x03b3); break;
                               case 'delta': ch = String.fromCharCode(0x03b4); break;
                               case 'epsilon': ch = String.fromCharCode(0x03b5); break;
                               case 'zeta': ch = String.fromCharCode(0x03b6); break;
                               case 'eta': ch = String.fromCharCode(0x03b7); break;
                               case 'theta': ch = String.fromCharCode(0x03b8); break;
                               case 'iota': ch = String.fromCharCode(0x03b9); break;
                               case 'kappa': ch = String.fromCharCode(0x03ba); break;
                               case 'lambda': ch = String.fromCharCode(0x03bb); break;
                               case 'mu': ch = String.fromCharCode(0x03bc); break;
                               case 'nu': ch = String.fromCharCode(0x03bd); break;
                               case 'xi': ch = String.fromCharCode(0x03be); break;
                               case 'omicron': ch = String.fromCharCode(0x03bf); break;
                               case 'pi': ch = String.fromCharCode(0x03c0); break;
                               case 'rho': ch = String.fromCharCode(0x03c1); break;
                               case 'sigmaf': ch = String.fromCharCode(0x03c2); break;
                               case 'sigma': ch = String.fromCharCode(0x03c3); break;
                               case 'tau': ch = String.fromCharCode(0x03c4); break;
                               case 'upsilon': ch = String.fromCharCode(0x03c5); break;
                               case 'phi': ch = String.fromCharCode(0x03c6); break;
                               case 'chi': ch = String.fromCharCode(0x03c7); break;
                               case 'psi': ch = String.fromCharCode(0x03c8); break;
                               case 'omega': ch = String.fromCharCode(0x03c9); break;
                               case 'thetasym': ch = String.fromCharCode(0x03d1); break;
                               case 'upsih': ch = String.fromCharCode(0x03d2); break;
                               case 'piv': ch = String.fromCharCode(0x03d6); break;
                               case 'ensp': ch = String.fromCharCode(0x2002); break;
                               case 'emsp': ch = String.fromCharCode(0x2003); break;
                               case 'thinsp': ch = String.fromCharCode(0x2009); break;
                               case 'zwnj': ch = String.fromCharCode(0x200c); break;
                               case 'zwj': ch = String.fromCharCode(0x200d); break;
                               case 'lrm': ch = String.fromCharCode(0x200e); break;
                               case 'rlm': ch = String.fromCharCode(0x200f); break;
                               case 'ndash': ch = String.fromCharCode(0x2013); break;
                               case 'mdash': ch = String.fromCharCode(0x2014); break;
                               case 'lsquo': ch = String.fromCharCode(0x2018); break;
                               case 'rsquo': ch = String.fromCharCode(0x2019); break;
                               case 'sbquo': ch = String.fromCharCode(0x201a); break;
                               case 'ldquo': ch = String.fromCharCode(0x201c); break;
                               case 'rdquo': ch = String.fromCharCode(0x201d); break;
                               case 'bdquo': ch = String.fromCharCode(0x201e); break;
                               case 'dagger': ch = String.fromCharCode(0x2020); break;
                               case 'Dagger': ch = String.fromCharCode(0x2021); break;
                               case 'bull': ch = String.fromCharCode(0x2022); break;
                               case 'hellip': ch = String.fromCharCode(0x2026); break;
                               case 'permil': ch = String.fromCharCode(0x2030); break;
                               case 'prime': ch = String.fromCharCode(0x2032); break;
                               case 'Prime': ch = String.fromCharCode(0x2033); break;
                               case 'lsaquo': ch = String.fromCharCode(0x2039); break;
                               case 'rsaquo': ch = String.fromCharCode(0x203a); break;
                               case 'oline': ch = String.fromCharCode(0x203e); break;
                               case 'frasl': ch = String.fromCharCode(0x2044); break;
                               case 'euro': ch = String.fromCharCode(0x20ac); break;
                               case 'image': ch = String.fromCharCode(0x2111); break;
                               case 'weierp': ch = String.fromCharCode(0x2118); break;
                               case 'real': ch = String.fromCharCode(0x211c); break;
                               case 'trade': ch = String.fromCharCode(0x2122); break;
                               case 'alefsym': ch = String.fromCharCode(0x2135); break;
                               case 'larr': ch = String.fromCharCode(0x2190); break;
                               case 'uarr': ch = String.fromCharCode(0x2191); break;
                               case 'rarr': ch = String.fromCharCode(0x2192); break;
                               case 'darr': ch = String.fromCharCode(0x2193); break;
                               case 'harr': ch = String.fromCharCode(0x2194); break;
                               case 'crarr': ch = String.fromCharCode(0x21b5); break;
                               case 'lArr': ch = String.fromCharCode(0x21d0); break;
                               case 'uArr': ch = String.fromCharCode(0x21d1); break;
                               case 'rArr': ch = String.fromCharCode(0x21d2); break;
                               case 'dArr': ch = String.fromCharCode(0x21d3); break;
                               case 'hArr': ch = String.fromCharCode(0x21d4); break;
                               case 'forall': ch = String.fromCharCode(0x2200); break;
                               case 'part': ch = String.fromCharCode(0x2202); break;
                               case 'exist': ch = String.fromCharCode(0x2203); break;
                               case 'empty': ch = String.fromCharCode(0x2205); break;
                               case 'nabla': ch = String.fromCharCode(0x2207); break;
                               case 'isin': ch = String.fromCharCode(0x2208); break;
                               case 'notin': ch = String.fromCharCode(0x2209); break;
                               case 'ni': ch = String.fromCharCode(0x220b); break;
                               case 'prod': ch = String.fromCharCode(0x220f); break;
                               case 'sum': ch = String.fromCharCode(0x2211); break;
                               case 'minus': ch = String.fromCharCode(0x2212); break;
                               case 'lowast': ch = String.fromCharCode(0x2217); break;
                               case 'radic': ch = String.fromCharCode(0x221a); break;
                               case 'prop': ch = String.fromCharCode(0x221d); break;
                               case 'infin': ch = String.fromCharCode(0x221e); break;
                               case 'ang': ch = String.fromCharCode(0x2220); break;
                               case 'and': ch = String.fromCharCode(0x2227); break;
                               case 'or': ch = String.fromCharCode(0x2228); break;
                               case 'cap': ch = String.fromCharCode(0x2229); break;
                               case 'cup': ch = String.fromCharCode(0x222a); break;
                               case 'int': ch = String.fromCharCode(0x222b); break;
                               case 'there4': ch = String.fromCharCode(0x2234); break;
                               case 'sim': ch = String.fromCharCode(0x223c); break;
                               case 'cong': ch = String.fromCharCode(0x2245); break;
                               case 'asymp': ch = String.fromCharCode(0x2248); break;
                               case 'ne': ch = String.fromCharCode(0x2260); break;
                               case 'equiv': ch = String.fromCharCode(0x2261); break;
                               case 'le': ch = String.fromCharCode(0x2264); break;
                               case 'ge': ch = String.fromCharCode(0x2265); break;
                               case 'sub': ch = String.fromCharCode(0x2282); break;
                               case 'sup': ch = String.fromCharCode(0x2283); break;
                               case 'nsub': ch = String.fromCharCode(0x2284); break;
                               case 'sube': ch = String.fromCharCode(0x2286); break;
                               case 'supe': ch = String.fromCharCode(0x2287); break;
                               case 'oplus': ch = String.fromCharCode(0x2295); break;
                               case 'otimes': ch = String.fromCharCode(0x2297); break;
                               case 'perp': ch = String.fromCharCode(0x22a5); break;
                               case 'sdot': ch = String.fromCharCode(0x22c5); break;
                               case 'lceil': ch = String.fromCharCode(0x2308); break;
                               case 'rceil': ch = String.fromCharCode(0x2309); break;
                               case 'lfloor': ch = String.fromCharCode(0x230a); break;
                               case 'rfloor': ch = String.fromCharCode(0x230b); break;
                               case 'lang': ch = String.fromCharCode(0x2329); break;
                               case 'rang': ch = String.fromCharCode(0x232a); break;
                               case 'loz': ch = String.fromCharCode(0x25ca); break;
                               case 'spades': ch = String.fromCharCode(0x2660); break;
                               case 'clubs': ch = String.fromCharCode(0x2663); break;
                               case 'hearts': ch = String.fromCharCode(0x2665); break;
                               case 'diams': ch = String.fromCharCode(0x2666); break;
                               default: ch = ''; break;
						}
					}
                   i = semicolonIndex;
             }
       }
       out += ch;
 }
 return out;
}
