/**
 * A map that translates between Fina's subcodes and human readable text.
 */
function MCFinaSolrConversion(){
	this.data=null;
	this.selectedValues=null;
	this.unselectedValues=null;
	this.translationMap=null;
	this.SOLR_CONVERSION_CONSTANTS={
			metals:{
			A:"Alternate",
			G:"Gold",
			GS:"Gold/Silver",
			N:"Stainless",
			P:"Platinum",
			PD:"Palladium",
			PG:"Platinum/Gold",
			PL:"Platinum",
			S:"Silver",
			ST:"Silver Plated",
			T:"Titanium",
			TP:"Titanium/Platinum",
			TS:"Titanium/Steel"
		},
		stones:{
			AM:"Amethyst",
			AQ:"Aquamarine",
			BE:"Beryl",
			CI:"Citrine",
			DI:"Diamond",
			EM:"Emerald",
			GA:"Garnet",
			MS:"Moonstone",
			ON:"Onyx",
			PE:"Pearl",
			PG:"Peridot",
			QU:"Quartz",
			O:"n/a",
			OP:"n/a",
			RB:"Rubelite",
			RU:"Ruby",
			SA:"Sapphire",
			SM:"Strand Multi Color Sapphire",
			SP:"Spinel",
			TO:"Tourmaline",
			TS:"Tsavorite ",
			TU:"Turquoise",
			TZ:"Topaz"
		},
		home:{
			byRoom:{
				BARR:"Bar",
				BARO:"Bathroom",
				BEDR:"Bedroom",
				DIRO:"Dining Room",
				GOUR:"Kitchen",
				LIBR:"Library",
				NURS:"Nursery"
			},
			byCategory:{
				ARGL:"Art Glass",
				BABY:"Baby",
				BARW:"Barware",
				BOWL:"Bowls",
				LITE:"Candles and Lighting",
				FIGU:"Figurines",
				FRAM:"Frames",
				GOUR:"Gourmet",
				MONO:"Personalized",
				VASE:"Vases",
				WINE:"Wine Tasting"
			},
			byStyle:{
				ANTI:"Antique",
				ASIA:"Chinoiserie",
				CLASS:"Classic",
				CONT:"Modern",
				FRCO:"French Country",
				ITAL:"Italian",
				SCAN:"Scandinavian",
				TRAD:"Traditional",
				TREN:"Trendy"
			}
		},
		gifts:{
			byRecipient:{
				BABY:"Baby",
				BRID:"Bride",
				BRMA:"Bridesmaid",
				DADS:"Dad",
				FOHE:"For Her",
				FOHI:"For Him",
				GIBU:"Business Associate",
				GRME:"Groomsmen",
				GROO:"Groom",
				HOWA:"Hostess",
				MOMS:"Mom"
			},
			byOccasion:{
				ANNI:"Anniversary",
				BASH:"Baby Shower",
				BDAY:"Birthday",
				SHOW:"Bridal Shower",
				GIBU:"Business",
				RELI:"Christening/Baptism/Communion",
				XMAS:"Chrismas",
				CONG:"Congratulations",
				ENGA:"Engagement",
				DADS:"Father's Day",
				GRAD:"Graduation",
				HOWA:"Housewarming",
				JUDA:"Jewish Holiday",
				JUST:"Just Because",
				MOMS:"Mother's Day",
				BABY:"New Baby",
				TOFL:"New Year's Eve",
				NEYE:"New Year's Eve",
				THYO:"Thank You",
				VDAY:"Valentine's Day",
				WEDD:"Wedding"
			},
			byCategory:{
				ARGL:"Art Glass",
				BABY:"Baby",
				BARW:"Barware",
				BOWL:"Bowls",
				BRAC:"Bracelets",
				CAND:"Candles",
				CLOC:"Clocks",
				COLL:"Antiques and Collectibles",
				CUFF:"Cufflinks",
				DESK:"Desk",
				EARR:"Earrings",
				FIGU:"Figurines",
				FRAG:"Home Fragrance",
				FRAM:"Frames",
				GOUR:"Gourmet",
				LIGI:"Linens",
				LITE:"Lighting",
				MONO:"Personalized",
				NECK:"Necklaces",
				PENS:"Pens",
				PETS:"Pets",
				VASE:"Vases",
				WINE:"Wine Tasting",
				WISP:"Wine Tasting",
				ZODI:"Zodiac"
			},
			byStyle:{
				ANTI:"Antique",
				CLAS:"Classic",
				MODE:"Modern",
				TRAD:"Traditional",
				TREN:"Trendy"
			}
		},
		rings:{
			byType:{
				ADOR:"Adoration",
				ANNI:"Anniversary",
				ASCE:"Ascend",
				ENGA:"Engagement",
				ENRI:"Enrichment",
				ETER:"Eternity",
				IDMI:"Identity Milgrain",
				LUXU:"Luxury",
				MUDR:"Multiplicity Dream",
				RESE:"Repertoire Select",
				RIME:"Anniversary",
				RISM:"Engagement Ring",
				SIBR:"Simple Bridal",
				WEDD:"Wedding",
				WERL:"Wedding Band"
			},
			byStyle:{
				ANTI:"Antique",
				CLAS:"Classic",
				ORNA:"Ornate",
				TRAD:"Traditional",
				RS01:"Absolute Opluence",
				RS02:"Bohemian Chic",
				RS03:"Cosmopolitan",
				RS04:"Eclectic",
				RS05:"Effortlessly Elegant",
				RS06:"J'adore Moderne",
				RS07:"Posh Fashionista",
				RS08:"Quintessentially Classic",
				RS09:"Utterly Ornate"
			}
		},
		jewelry:{
			byStyle:{
				NEYO:"New York",
				WHIM:"Whimsical",
				VINT:"Vintage",
				TRAV:"Travel",
				SPOR:"Sport",
				RELI:"Religious",
				PROF:"Professions",
				CONT:"Contemporary",
				CLAS:"Classic",
				TRAD:"Traditional"
			},
			byCollection:{
				_2SWI:"2 Swirl",
				ANCH:"Anchor",
				APCO:"Aphrodite",
				BABR:"Bangle Bracelets",
				BOCO:"Boutique",
				BRCO:"Bracelet",
				CHAR:"Charm",
				CHNE:"Charm Necklaces",
				CICO:"Circle",
				CLAS:"Classic",
				CLOV:"Clover",
				CUCO:"Cufflink",
				DIHE:"Diamond Hearts",
				DODI:"Downtown Diamonds",
				DUTC:"Dutchess",
				EACH:"Earring Charm",
				FAEA:"Fashion Earrings",
				FANE:"Fashion Necklaces",
				FC08:"Flower",
				FLOR:"Florence",
				FLOW:"Flower",
				FORE:"Forever",
				HACO:"Hammered",
				HOCO:"Hoops",
				HUGG:"Huggie",
				INCO:"Infinity",
				JESS:"Jessica Alba",
				JOUR:"Journey",
				KRCO:"Keyring",
				MAMA:"Mary Marquee",
				MAND:"Madarin",
				NOVE:"Novelty",
				PAGO:"Pagoda",
				PROM:"Promise",
				QUIL:"Quilted",
				RDCO:"Radiant",
				RICO:"Ring",
				ROCH:"Round Charms",
				SAMB:"Samba",
				SHAY:"Shayne",
				SIGN:"Signature",
				SNOW:"Snow White",
				SPCO:"Sphere",
				SUCO:"Sugarcube",
				TACU:"Tapered",
				TRIN:"Trinity",
				TROP:"Tropical",
				WIWA:"Wire Wrap"
			}
		}
	};
	
	this.dropDownCollections={
		manufacturer:["pricing"],
		site:["designers","pricing"],
		standard:["designers","type","pricing"],
		standardFooter:["designers","type","pricing","brandsAsCollection"],

		engagementWeddingDesigner:["event"],
		engagementWeddingBand:["designers","productClass","metals","pricing"],
		engagementWeddingBandFooter:["designers","productClass","metals","pricing"],
			
		homeDecor:["designers","room","catalog","style","pricing"],
		homeDecorByDesigner:["room","catalog","style","pricing"],
		homeDecorByRoom:["designers","catalog","style","pricing"],
		homeDecorByCategory:["designers","room","style","pricing"],
		homeDecorByStyle:["designers","room","catalog","pricing"],

		gifts:["designers","type","occasion","recipient","pricing"],
		giftsFooter:["designers","type","style","occasion","recipient","pricing"],
		giftsByType:["type"],
		giftsByOccasion:["designers","type","style","recipient","pricing"],
		giftsByRecipient:["designers","type","style","occasion","pricing"],
		giftsByCategory:["designers","occasion","recipient","pricing"],
		giftsByStyle:["designers","type","occasion","recipient","pricing"],
		  	
		jewelryFooter:["designers","type","metals","stones","pricing","collections"],
		jewelry:["designers","type","metals","stones","collections","pricing"],
		jewelryDesigner:["type","collections"],
		jewelryForBabyAndChild:["brands","collections"],

		tablewareAndEntertainingDesigner:["type"],
		tablewareAndEntertaining:["designers","pricing"],
			
		bath:["designers","pricing"],
		bathDesigner:["type","pricing"]			
	};
}

MCFinaSolrConversion.prototype.defaultTranslator=function(value,dropDown){
	return value;
}

MCFinaSolrConversion.prototype.translateByMap=function(value,dropDown){
	var translation=null;
	if (varUtils.isDef(dropDown.xlateData) && varUtils.isDef(dropDown.xlateData[value])){
		translation=dropDown.xlateData[value];
	}

	return translation;
}

MCFinaSolrConversion.prototype.init=function(searchResponse, selectedValues, unselectedValues, translationMap){
	this.selectedValues=selectedValues;
	this.unselectedValues=unselectedValues;
	this.translationMap=translationMap;
	
	if (!varUtils.isDef(translationMap.filter_by_category)){
		var filterByCategory=new Object();
		for(var i in translationMap){
			for(var j in translationMap[i]){
				filterByCategory[j]=translationMap[i][j];
			}	
		}
		
		this.translationMap.filter_by_category=filterByCategory;
	}
	
	var json=searchResponse;
	if (varUtils.isDef(searchResponse)){
		if (typeof(searchResponse) == "string"){
			json=searchResponse.evalJSON();
		}
		this.data=new Object();
		this.data.facets=new Object();
		this.data.facets.price=json.facet_counts.facet_queries;
		this.data.facets.fields=json.facet_counts.facet_fields;
		/*if (!varUtils.isDef(this.data['searchFailed']) || !this.data['searchFailed']){ 
			initializeData(data);
		}*/
	}
}

MCFinaSolrConversion.prototype.makeDesignersDropDown=function(values,selected){
	var dropDown=solrFilterUtils.makeDropDown("Designer","All Designers","filter_by_brand",2,solrFilterUtils.renderHandlers.renderByValue,values,selected);
	dropDown.selectedValue=this.selectedValues.manufacturer;
	return dropDown;
}

MCFinaSolrConversion.prototype.makePricingDropDown=function(values,selected){
	var dropDown=solrFilterUtils.makeDropDown("Price Range","Any Price","filter_by_price",1,solrFilterUtils.renderHandlers.renderPrice,values,selected);
	dropDown.selectedValue=this.selectedValues.price;
	return dropDown;
}

MCFinaSolrConversion.prototype.makeCategoryDropDown=function(values,selected){
	var dropDown=solrFilterUtils.makeDropDown("Categories","All Categories","filter_by_category",2,solrFilterUtils.renderHandlers.renderByValue,values,selected);
	dropDown.xlateData=this.translationMap["filter_by_category"];
	dropDown.translator=MCFinaSolrConversion.prototype.translateByMap;
	dropDown.selectedValue=this.selectedValues.catalog;
	return dropDown;
}

MCFinaSolrConversion.prototype.makeTypeDropDown=function(values,selected){
	var dropDown=solrFilterUtils.makeDropDown("Type","All Types","filter_by_category",2,solrFilterUtils.renderHandlers.renderByValue,values,selected);
	dropDown.xlateData=this.translationMap["filter_by_category"];
	dropDown.translator=MCFinaSolrConversion.prototype.translateByMap;
	dropDown.selectedValue=this.selectedValues.catalog;
	return dropDown;
}

MCFinaSolrConversion.prototype.makeStonesDropDown=function(values,selected){
	var dropDown=solrFilterUtils.makeDropDown("Gemstones","All Gemstones","filter_by_stone",2,solrFilterUtils.renderHandlers.renderByValue,values,selected);
	dropDown.xlateData=this.SOLR_CONVERSION_CONSTANTS.stones;
	dropDown.translator=MCFinaSolrConversion.prototype.translateByMap;
	dropDown.selectedValue=this.selectedValues.stone;
	return dropDown;
}

MCFinaSolrConversion.prototype.makeMetalsDropDown=function(values,selected){
	var dropDown=solrFilterUtils.makeDropDown("Metals","All Metals","filter_by_metal",2,solrFilterUtils.renderHandlers.renderByValue,values,selected);
	dropDown.xlateData=this.SOLR_CONVERSION_CONSTANTS.metals;
	dropDown.translator=MCFinaSolrConversion.prototype.translateByMap;
	dropDown.selectedValue=this.selectedValues.metal;
	return dropDown;
}

MCFinaSolrConversion.prototype.makeEventDropDown=function(values,selected){
	var dropDown=solrFilterUtils.makeDropDown("Events","Engagement & Wedding Bands","filter_by_category",2,solrFilterUtils.renderHandlers.renderByValue,values,selected);
	dropDown.xlateData=this.translationMap["filter_by_event"];
	dropDown.translator=MCFinaSolrConversion.prototype.translateByMap;
	dropDown.selectedValue=this.selectedValues.catalog;
	dropDown.unselectedValue=this.unselectedValues.event;
	return dropDown;
}

MCFinaSolrConversion.prototype.makeOccasionDropDown=function(values,selected){
	var dropDown=solrFilterUtils.makeDropDown("Occasion","All Occasions","filter_by_occasion",2,solrFilterUtils.renderHandlers.renderByValue,values,selected);
	dropDown.xlateData=this.translationMap["filter_by_occasion"];
	dropDown.translator=MCFinaSolrConversion.prototype.translateByMap;
	dropDown.selectedValue=this.selectedValues.occasion;
	return dropDown;
}

MCFinaSolrConversion.prototype.makeRecipientDropDown=function(values,selected){
	var dropDown=solrFilterUtils.makeDropDown("Recipient","All Recipients","filter_by_recipient",2,solrFilterUtils.renderHandlers.renderByValue,values,selected);
	dropDown.xlateData=this.translationMap["filter_by_recipient"];
	dropDown.translator=MCFinaSolrConversion.prototype.translateByMap;
	dropDown.selectedValue=this.selectedValues.recipient;
	return dropDown;
}

MCFinaSolrConversion.prototype.makeRoomDropDown=function(values,selected){
	var dropDown=solrFilterUtils.makeDropDown("Room","All Rooms","filter_by_room",2,solrFilterUtils.renderHandlers.renderByValue,values,selected);
	dropDown.xlateData=this.translationMap["filter_by_room"];
	dropDown.translator=MCFinaSolrConversion.prototype.translateByMap;
	dropDown.selectedValue=this.selectedValues.room;
	return dropDown;
}

MCFinaSolrConversion.prototype.makeStyleDropDown=function(values,selected){
	var dropDown=solrFilterUtils.makeDropDown("Style","All Styles","filter_by_style",2,solrFilterUtils.renderHandlers.renderByValue,values,selected);
	dropDown.xlateData=this.translationMap['filter_by_style'];
	dropDown.translator=MCFinaSolrConversion.prototype.translateByMap;
	dropDown.selectedValue=this.selectedValues.style;
	return dropDown;
}

MCFinaSolrConversion.prototype.makeProductClassDropDown=function(values,selected){
	var dropDown=solrFilterUtils.makeDropDown("Style","All Styles","filter_by_class",2,solrFilterUtils.renderHandlers.renderByValue,values,selected);
	dropDown.xlateData=this.SOLR_CONVERSION_CONSTANTS.rings.byType;
	dropDown.translator=MCFinaSolrConversion.prototype.translateByMap;
	dropDown.selectedValue=this.selectedValues.subclasses;
	return dropDown;
}

MCFinaSolrConversion.prototype.makeJewelryCollectionDropDown=function(values,selected){
	var dropDown=solrFilterUtils.makeDropDown("Collection","All Collections","filter_by_class",2,solrFilterUtils.renderHandlers.renderByValue,values,selected);
	dropDown.xlateData=this.SOLR_CONVERSION_CONSTANTS.jewelry.byCollection;
	dropDown.translator=MCFinaSolrConversion.prototype.translateByMap;
	dropDown.selectedValue=this.selectedValues.subclasses;
	return dropDown;
}

MCFinaSolrConversion.prototype.makeCollectionDropDown=function(values,selected){
	var dropDown=solrFilterUtils.makeDropDown("Collection","All Collections","filter_by_collection",2,solrFilterUtils.renderHandlers.renderByValue,values,selected);
	dropDown.selectedValue=this.selectedValues.collection;
	return dropDown;
}

MCFinaSolrConversion.prototype.makeDesignerAsCollectionDropDown=function(values,selected){
	var dropDown=this.makeCollectionDropDown(values, selected);
	
	dropDown.translator=MCFinaSolrConversion.prototype.translateByMap;
	dropDown.selectedValue=this.selectedValues.manufacturer;
	return dropDown;
}

MCFinaSolrConversion.prototype.buildDropDowns=function(collection){
	var dropDowns=null;
	if (varUtils.isDef(this.data) && varUtils.isDef(this.data.facets)){
		if (varUtils.isDef(this.data.facets.fields) && varUtils.isDef(collection)){
			var collections=this.dropDownCollections[collection];
			dropDowns=new Array();
			for (var i=0;i<collections.length;++i){
				if (collections[i]=="designers"){
					dropDowns.push(this.makeDesignersDropDown(this.data.facets.fields.facet_brand));
				} else if (collections[i]=="catalog"){
					dropDowns.push(this.makeCategoryDropDown(this.data.facets.fields.category_id));
				} else if (collections[i]=="type"){
					dropDowns.push(this.makeTypeDropDown(this.data.facets.fields.category_id));
				} else if (collections[i]=="style"){
					dropDowns.push(this.makeStyleDropDown(this.data.facets.fields.category_id));
				} else if (collections[i]=="metals"){
					dropDowns.push(this.makeMetalsDropDown(this.data.facets.fields.facet_metal_type_attribute));
				} else if (collections[i]=="stones"){
					dropDowns.push(this.makeStonesDropDown(this.data.facets.fields.facet_stone_type_attribute));
				} else if (collections[i]=="pricing"){
					dropDowns.push(this.makePricingDropDown(this.data.facets.price));
				} else if (collections[i]=="collections"){
					dropDowns.push(this.makeCollectionDropDown(this.data.facets.fields.facet_parent_name_attribute));
				} else if (collections[i]=="brandsAsCollection"){
					dropDowns.push(this.makeDesignerAsCollectionDropDown(this.data.facets.fields.facet_parent_name_attribute));
				} else if (collections[i]=="event"){
					dropDowns.push(this.makeEventDropDown(this.data.facets.fields.category_id));
				} else if (collections[i]=="productClass"){
					dropDowns.push(this.makeProductClassDropDown(this.data.facets.fields.facet_subclass_attribute));
				} else if (collections[i]=="room"){
					dropDowns.push(this.makeRoomDropDown(this.data.facets.fields.category_id));
				} else if (collections[i]=="occasion"){
					dropDowns.push(this.makeOccasionDropDown(this.data.facets.fields.category_id));
				} else if (collections[i]=="recipient"){
					dropDowns.push(this.makeRecipientDropDown(this.data.facets.fields.category_id));
				}
			}
		}
	}
	
	return dropDowns;
}


/**
 * Fina custom implementation of suggestion rendering routine.
 */
MCFinaSolrConversion.prototype.spellSuggestionRenderer=function(container,term,suggestions,params){
	var item="<li>SUGGESTION</li>";
	for (var i=0;i<suggestions.length;++i){
		var term="<a href='SEARCHACTION'>SUGGESTION</a>".replace(/SUGGESTION/,suggestions[i])
			.replace(/SEARCHACTION/,params.searchAction+"?search_type="+params.searchType+"&search_term="+suggestions[i]);
		jQuery(item.replace(/SUGGESTION/,term)).appendTo(container);
	}
}


function MCFinaPaginationUtils(solrResultPaginator){
	this.solrResultPaginator=solrResultPaginator;
}

MCFinaPaginationUtils.prototype.setResultPaginator=function(resultPaginator){
	this.solrResultPaginator=resultPaginator;
}

MCFinaPaginationUtils.prototype.renderPagination=function(paginationContainer,resultCount){
	this.solrResultPaginator.renderPagination(paginationContainer,resultCount);
}

MCFinaPaginationUtils.prototype.renderProducts=function(products,imageSize,linkType){
	var imageUtils=new ImageUtils(contextPath,staticImgPath,fluidBaseItemURL);
    if (varUtils.isDef(products)){
	    for(var x = 0; x < products.length; x++){
		    var link=products[x][linkType].replace(/^null/,contextPath);
		    var unformatted=parseInt(products[x].price * 100);
		    var price=varUtils.formatCurrency(convert_to_dollars(parseInt(products[x].price * 100)));
		    jQuery("<li><a href='/"+link+"' title='"+products[x].name+" By: " + products[x].brand+"'\>"
				    	+imageUtils.getProductImgTag(products[x].sku,imageSize,products[x].name,false,(!varUtils.isDef(products[x].image_url) || (products[x].pattern && products[x].image_url=="images/placeholder100x100.jpg")),false)
				    	+"<br/>"+products[x].name+ "<br/>"
				    	+"By: " + products[x].brand + "</a><br/>"
				    	+((unformatted+0)>0?"$" + price:"") + "<br/></li>").appendTo("#prodlist");
	    }
    }
}

