/*
 * filtering search.
 */
(function($){

	var chachedXml;

	$(window).load(function(){

		// for ie...
		if ($.browser.msie) {
			// because of onchange occurs when loses its focus.
			$('#search :checkbox').click(function(){
				this.blur();
			});
		}

		$('#search')
			// set filtering search.
			.find('form')
				.submit(function(){
					var params = [];

					var hidden = $(this).find('input[type=hidden]');
					params.push($.param(hidden));

					// collect checked item parameters.
					var checked = $(this).find('div.findto :checked');
					if (checked.length > 0) {
						params.push($.param(checked));
					}

					// collect color parameter.
					var selectedColor = $(this).find('div.color li.on');
					if (selectedColor.length > 0) {
						//var colorIndex = $(this).find('div.color li').index(selectedColor);
						var colorIndex = $(this).find('div.color li.on a').attr('rel');
						params.push($.param({ color: colorIndex }));
					}

					// collect slider parameters.
					$(this).find('div.slider').each(function(){
						var v = $(this).slider('option', 'values');
						var o = {};
						if ($(this).hasClass('price')) {
							o = { price_min: v[0], price_max: v[1] };	// price slider.
						}
						else {
							o = { carat_min: v[0], carat_max: v[1] };	// carat slider.
						}
						params.push($.param(o));
					});

					// request products data in xml.
					$.ajax({
						url: $(this).attr('action'),
						type: 'POST',
						dataType: $.browser.msie ? 'text' : 'xml',
						data: params.join('&'),
						/*error: function(xhr, status) {
							alert('error: '+ status);
						},*/
						success: function(data) {
							chachedXml = parseXml(data);
							listUpProducts();
						}
					});
					return false;

					// for ie...
					function parseXml(xml) {
						if ($.browser.msie) {
							var xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
							xmlDoc.loadXML(xml);
							xml = xmlDoc;
						}
						return xml;
					}

				})
			.end()

			// filter change handler.
			.find('div.findto :checkbox')
				.bind('change.findto', function(){
					$('#search form').submit();
				})
			.end()
			.find('div.color li')
				.click(function(){
					$(this).parent('ul').find('li.on').removeClass('on');
					$(this).addClass('on');
					$('#search form').submit();
					return false;
				})
			.end()
			.find('div.findto div.slider')
				.bind('slidechange', function(e){
					// protect multi request by $.trigger();.
					if (e.originalEvent) {
						$('#search form').submit();
					}
				})
			.end()
			.find('div.option p.filter :checkbox')
				.bind('change.filter', function(){
					listUpProducts();
				})
			.end()

			// reset handler.
			.find('div.option p.clear_all a')
				.click(function(){
					resetOptions();
					return false;
				})
			.end()
		;

		// init product list.
		$('#search form').submit();
	});

	function listUpProducts()
	{
		$('#list').fadeOut('fast').empty();

		// filter sold out products if need.
		var xml;
		if ($('#search div.option p.filter :checked').length > 0) {
			// clone xml doc.
			if (chachedXml.importNode) {
				xml = chachedXml.importNode($('root', chachedXml).get(0), true);
			}
			else {
				xml = $(chachedXml).clone();
			}

			$('product', xml).each(function(){
				// remove a product that matches flag == 1.
				if ($(this).find('salesContractFlag').text() == 1) {
					this.parentNode.removeChild(this);
				}
			});
		}
		else {
			xml = chachedXml;
		}

		// build product list from xml.
		var list = ['<div class="group"><div class="group_inner">'];
		$('product', xml).each(function(i){
			var out = [];
			var url = $(this).find('url').text();
			if ((i > 0) && (i % 4 == 0)) {
				list.push('</div></div><div class="group"><div class="group_inner">');
			}
			out.push('<div class="item">');
			out.push('<a href="'+ url +'"><img src="'+ $(this).find('mainListImage').text() +'" alt="" /></a>');
			if ($(this).find('salesContractFlag').text() == 1) {
				out.push('<p class="status">'+ $(this).find('salesContractName').text() +'</p>');
			}
			out.push('<h2 class="name"><a href="'+ url +'">'+ $(this).find('name').text() +'</a></h2>');
			out.push('<p class="price">'+ $(this).find('price').text() +'</p>');
			out.push('</div>');
			list.push(out.join('\n'));
		});
		list.push('</div></div>');

		$('#list').append(list.join('\n')).fadeIn('fast');
		window.scrollTo(0, 0);
	}

	function resetOptions()
	{
		$('#search')
			// reset checked input.
			.find('input:checked')
				.attr('checked', false)
			.end()
			// reset colors.
			.find('div.color li.on')
				.removeClass('on')
			.end()
			// reset slider.
			.find('div.slider')
				.each(function(){
					var vals = [];
					if ($(this).hasClass('price')) {
						vals = [0, 500];	// price slider.
					}
					else {
						vals = [0.0, 20.0];	// carat slider.
					}
					$(this).slider('values', 0, vals[0]);
					$(this).slider('values', 1, vals[1]);
					// fire event.
					$(this).trigger('slide', { handle: $(this).find('a:first'), values: vals });
				})
			.end()
			// reset product list.
			.find('form').submit();
		;
	}

})(jQuery);

