/**Dog editor
 * @author danyastuff
 * @version 1.0 (since 27 sep 2009)
 */

var DogEditor = function (onChange) {
    
    this.onChange = onChange ? onChange : function () {};
    
	var self = this;
	String.prototype.replaceAll = function (from, to) {
		var str = this;
		while (str.indexOf(from) != -1) str = str.replace(from, to);
		return str;
	}
	String.prototype.toURI = function () { return this.toLowerCase().replaceAll(' ', '_') }
	this.imgDir = 'http://'+StaticServer.replace('http://', '')+'/i/services/dogs/';
	this.sameBreeds = $('#same-breeds');
	this.alikeBreeds = $('#alike-breeds DIV > DIV');
	this.alikeBreeds.parent = $('#alike-breeds > DIV');
	this.alikeHeader = $('#alike-breeds DIV > H2');
	this.desc = $('#dog-desc');
	this.embed = {
		visible : false,
		body: $('#result-links'),
		inpHref: $('#result-links INPUT.href'),
		inpA: $('#result-links INPUT.a'),
		inp : $('#result-links INPUT.div'),
		prev: $('#result-links > DIV.prev'),
		show: $('#result-links LABEL A')
	}
	this.inp = {
		snout : {
			form 	  : $('.snout-form'),
			surface   : $('.snout-surface'),
			hairstyle : $('INPUT[name = "snout-hairstyle"]')
		},
		ear : {
			form : $('.ear-form')
		},
		body : {
			weight 	  : $('.body-weight'),
			hairstyle : $('INPUT[name = "body-hairstyle"]')
		},
		legs : {
			length 	  : $('.legs-length'),
			hairstyle : $('INPUT[name = "legs-hairstyle"]')
		},
		tile : {
			form : $('.tile-form'),
			hairstyle : $('INPUT[name = "tile-hairstyle"]')
		}
	}//desc

//radio	
	this.inp.snout.form.click(getRadio);
	this.inp.snout.surface.click(getRadio);
	this.inp.body.weight.click(getRadio);
	this.inp.legs.length.click(getRadio);
	this.inp.ear.form.click(getRadio);
//select	
	this.inp.tile.form.change(getList);
//checkbox
	this.inp.snout.hairstyle.click(getCheckbox);
	this.inp.body.hairstyle.click(getCheckbox);
	this.inp.legs.hairstyle.click(getCheckbox);
	this.inp.tile.hairstyle.click(getCheckbox);
	
	function getRadio() {
		var ind = $(this).attr('name').split('-');
		dog[ind[0]][ind[1]] = this.value;
		self.search();
	}
	function getList() {
		var ind = $(this).attr('name').split('-');
		dog[ind[0]][ind[1]] = $(this).find('option:selected').attr('value');
		self.search();
	}
	function getCheckbox() {
		var ind = $(this).attr('name').split('-');
		dog[ind[0]][ind[1]] = this.checked ? 'hair' : 'skin';
		self.search();
	}
	
	//this.checkHash()
	if (BreedURI) {
		this.searchByName(window.BreedURI);
	} else {
		this.search();
		this.fillInputs();
	}
// Filter input init
	this.breedFilter = $('#breed-filter');
	this.breedFilter.ghostTip(s('Search breed'));
	var search = new ComplexSearch ({
		filter		: self.breedFilter,	
		area		: Breeds,	
		banFields	: ['img', 'desc', 'params'],
		minChars	: 1,
		maxToShow	: 99,
		maxHeight	: '400px',
		onMatch	: function (text, elem, index) {
			var span = $('<SPAN></SPAN>');
				span.attr('breed', elem.en.toLowerCase() )
					.html(text);
			return span;		
		},
		onResult : function (li) {
			self.searchByName(
				li.find('SPAN').attr('breed')
			)
		}
	})
// Embed link init
	this.embed.show.click(function () {
		if (!self.embed.visible) 
			self.embed.prev.slideDown('fast');
		else
			self.embed.prev.slideUp('fast');
		self.embed.visible = !self.embed.visible;  
	})
	var selectFn = function (e) {e.stopPropagation(); $(e.target).select()}
	this.embed.inp.click(selectFn); 
	this.embed.inpA.click(selectFn);
	this.embed.inpHref.click(selectFn); 
}//DogEditor
DogEditor.prototype = {
	checkHash : function () {
		var hash = document.location.hash.replace('#','');
		if (!hash) {
			this.fillInputs();
			this.search();
			return;
		}
		if (hash.indexOf(',') != -1) {
			this.array2Dog(hash.split(','));
			this.fillInputs();
			this.search();
		} else {
			this.searchByName(hash);
		}
	},
	search : function () {
		this.embed.body.hide();
		this.clearBreeds();
		var tpl = this.dog2Array();
		var i, breed;
		for (i in Breeds) {
			breed = Breeds[i];
			if (breed.params) {
				dif = this.differ(tpl, Breeds[i].params);
				if (dif <= 1) 
					this.appendSame(Breeds[i]);
				else 
					if (dif <= 2) this.appendAlike(Breeds[i]);
			} // check for ie & safari
		}
		// scale dog photos
		var img = this.sameBreeds.find('IMG'),
			wid = 200 - 10*img.length;
		if (wid < 70) wid = 70;
		img.attr('width', wid);
			
		this.refreshAlike();
	},
	differ : function (a1, a2) {
		var d   = 0,
			pri = [2,2,0.5, 1, 1,1, 2,0.5, 0.5,1];
		for (i in a1) 
			if (a1[i] != a2[i]) d += pri[i];
		return d;
	},
	appendSame : function (breed) {
		var desc = window.Language == 'ru' ? breed.desc : '';
		this.sameBreeds.append('<div class="breed-desc"><img width="200" src="'+this.imgDir+breed.img+'" align="left" /><h3><a href="/services/dogs/'+breed.en.toURI()+'">'+breed[window.Language]+'</a></h3><p>'+desc+'</p></div>');	
	},
	appendAlike : function (breed) {
		this.alikeBreeds.append('<p><a href="/services/dogs/'+breed.en.toURI()+'">'+breed[window.Language]+'</a></p>');
	},
	refreshAlike : function () {
		var self = this,
			len = this.alikeBreeds.find('P').length,
			title = '';
		if (len > 1)  title = s('Alike breeds')+':';
		if (len == 1) title = s('Alike breed');
		this.alikeHeader.text(title);
		var selectFn = function (e) {
			self.searchByName( $(this).attr('href').replace('#','') );
			e.stopPropagation();
		}
		var alikeA = this.alikeBreeds.find('A'); 
	//	alikeA.click(selectFn)
	//	this.sameBreeds.find('A').click(selectFn)
		
		if (alikeA.length == 0) 
			this.alikeBreeds.parent.hide();
		else
			this.alikeBreeds.parent.show();
		
		this.onChange();
	},
	clearBreeds : function () {
		this.sameBreeds.html('');
		this.alikeBreeds.html('');
	},
	array2Dog : function (a) {
		dog = {
			snout : {form:a[0], surface:a[1], hairstyle:a[2]}, 
			ear	  : {form:a[3]}, 
			body  : {weight:a[4], hairstyle:a[5]}, 
			legs  : {length:a[6], hairstyle:a[7]}, 
			tile  : {form:a[8],   hairstyle:a[9]}
		} 
	},
	dog2Array : function () {
		return [
			dog.snout.form, dog.snout.surface, dog.snout.hairstyle,
			dog.ear.form,
			dog.body.weight, dog.body.hairstyle,
			dog.legs.length, dog.legs.hairstyle,
			dog.tile.form,   dog.tile.hairstyle
		]
	},
	searchByName : function (name) {
		var img;
		this.clearBreeds();
		for (i=0,l=Breeds.length; i < l; i++)
			if (name == Breeds[i].en.toLowerCase()) {
				img = Breeds[i].img;
				this.appendSame(Breeds[i]);
				break;
			}
		var brI = Breeds[i],
			tpl = brI.params;
		this.array2Dog(tpl);
		this.fillInputs();
		var breed;
		for (i in Breeds) {
			breed = Breeds[i];
			if (breed.params) {
				dif = this.differ(tpl, breed.params);
				if (dif <= 1 && breed.en.toLowerCase() != name) this.appendAlike(breed);
			} // check for ie & safari
		}
		this.refreshAlike();
		this.refreshEmbed(brI);
	},
	fillInputs : function () {
		function setRadio(inp, val) { inp.filter('*[value = "'+val+'"]').get(0).checked = true }
		function setList(inp, val)  { inp.find('option[value = "'+val+'"]').get(0).selected = true }
		function setCheckbox(inp, val) { inp.get(0).checked = val == 'hair' ? true : false }
		
		setRadio	(this.inp.snout.form, dog.snout.form);
		setRadio	(this.inp.snout.surface, dog.snout.surface);
		setCheckbox	(this.inp.snout.hairstyle, dog.snout.hairstyle);
		
		setRadio	(this.inp.body.weight, dog.body.weight);
		setCheckbox	(this.inp.body.hairstyle, dog.body.hairstyle);
		setRadio	(this.inp.legs.length, dog.legs.length);
		setCheckbox	(this.inp.legs.hairstyle, dog.legs.hairstyle);
		
		setList		(this.inp.tile.form, dog.tile.form);
		setCheckbox	(this.inp.tile.hairstyle, dog.tile.hairstyle);
		setRadio	(this.inp.ear.form, dog.ear.form);
	},
	refreshEmbed : function (breed) {
		this.embed.body.show();
		this.embed.prev.find('DIV A').attr('href', document.location);
		this.embed.prev.find('DIV IMG').attr('src', this.imgDir + breed.img);
		this.embed.prev.find('DIV SPAN').text(breed[window.Language]);
		this.embed.inp.attr(
			'value', 
			this.embed.prev.html()
		);
		var url = 'http://'+ window.BaseServer + '/services/dogs/' + breed.en.toURI() ;
		this.embed.inpA.attr(
			'value',
			'<a href="'+url+'">' + breed[window.Language] + '</a>' 
		);
		this.embed.inpHref.attr('value',url);
		
	}
}

var dog = {
	snout : {form:'sharp', surface:'slope', hairstyle:'hair'}, 
	ear	  : {form:'bent'}, 
	body  : {weight:'thin', hairstyle:'hair'}, 
	legs  : {length:'long', hairstyle:'hair'}, 
	tile  : {form:'sabre', hairstyle:'hair'}
}
