function CustomerWatch(options) {
	//options
	this.options = $.extend({
		plugin  : null,
		session : null
	}, options);
}

$.extend(CustomerWatch.prototype, {

	watchOpen : false,
	saveStatus : false,
	modifyWatchId : null,
	options	: {},
	initialize : function(options) {
		var self = this;

		//initialize modal container
		$('#defaultModal').jqm({
			modal : true
		});

		//add customer watch
		$("body").delegate('.save-customerwatch', 'click', function() {
			self.openAddDialogue();
		});

		//modify customer watch
		$("body").delegate('.modify-customerwatch', 'click', function() {
			self.openModifyDialogue();
		});
	},

	openAddDialogue : function() {
		var self = this;

		if (this.watchOpen) {
			return;
		}
		this.watchOpen = true;

		//get params
		Loader.load('/search/properties/getsearchparameters/', {
			namespace : 'properties-' + this.options.plugin,
			plugin	  : this.options.plugin
		}, function(json) {
			if (json.status == 1) {
				JSTemplate.get('customer-watch-add', function(template) {
					var additionalParameters = [];
					if (json.data.parameters.booleanFields) {
						if (json.data.parameters.booleanFields.garage) {
							additionalParameters.push('autotalli');
						}
						if (json.data.parameters.booleanFields.lift) {
							additionalParameters.push('hissi');
						}
						if (json.data.parameters.booleanFields.balconyy) {
							additionalParameters.push('parveke');
						}
					}
					if (json.data.parameters.sauna) {
						switch(json.data.parameters.sauna) {
							case 'oma':
								additionalParameters.push('oma sauna');
								break;
							//todo other cases
						}
					}
					if (json.data.parameters.onlyShow) {
						additionalParameters.push('vain esittelyssä olevat kohteet');
					}
					if (json.data.parameters.onlyNew) {
						additionalParameters.push('vain uudiskohteet');
					}
					json.data.parameters.additionalParameters = additionalParameters;
					
					$('#defaultModal .content').html(JSTemplate.populate(template, json.data.parameters));

					//want contact
					$('.customer-watch input[name="contact"]').bind('click', function() {
						$('.customer-watch .want-contact').slideToggle();
					});

					//close watch
					$('.customer-watch .jqmClose').bind('click', function() {
						self.watchOpen = false;
						self.saveStatus = false;
					});

					//save customer watch
					$('.customer-watch .save').bind('click', function() {
						self.save();
					});

					$('#defaultModal').jqmShow();
					$('html, body').animate({
						scrollTop: $("body").offset().top
					}, 0);

				});
			}
			Loader.decreaseCallCount();
		}, 'json', this.options.session);
	},

	save : function() {
		var self = this;
		if (this.saveStatus) {
			return;
		}
		this.saveStatus = true;
		var watchData = {
			plugin		: this.options.plugin,
			namespace 	: 'properties-' + this.options.plugin,
			email		: $('.customer-watch input[name="email"]').val(),
			phone		: $('.customer-watch input[name="phone"]').val(),
			firstname	: $('.customer-watch input[name="firstname"]').val(),
			lastname	: $('.customer-watch input[name="lastname"]').val(),
			notice		: ($('.customer-watch input[name="notice"]').is(':checked')) ? 1 : 0,
			contact		: ($('.customer-watch input[name="contact"]').is(':checked')) ? 1 : 0
		};

		var validated = this.filterAndValidate(watchData);
		if (!validated.isValid) {
			alert(validated.errors.join('\n'));
			this.saveStatus = false;
			return;
		}

		Loader.load('/search/customerwatch/add/', validated.data, function(json) {
			if (json.status == 0) {
				alert('Vahtipalvelun lisääminen epäonnistui. Voit kokeilla yrittää uudelleen hetken kuluttua.');
				this.saveStatus = false;
				Loader.decreaseCallCount();
				return;
			}
			validated.data.resultsUrl = json.data.resultsUrl;

			JSTemplate.get('customer-watch-added', function(template) {
				$('#defaultModal .content').html(JSTemplate.populate(template, validated.data));

				//close watch
				$('.customer-watch .jqmClose').bind('click', function() {
					self.watchOpen = false;
					$('#defaultModal').jqmHide();
				});
				self.saveStatus = false;
			});
			Loader.decreaseCallCount();
		});
	},

	openModifyDialogue : function() {
		this.modifyWatchId = $('a.modify-customerwatch').attr('id').substr(6);
		var self = this;
		if (this.watchOpen) {
			return;
		}
		this.watchOpen = true;

		//get watch information
		Loader.load('/search/customerwatch/getmodifydata/', {
			id : this.modifyWatchId,
			namespace : 'properties-' + this.options.plugin,
			plugin	  : this.options.plugin
		}, function(json) {
			if (json.status == 0) {
				alert('Vahtipalvelun muokkaus epäonnistui. Voit kokeilla yrittää uudelleen hetken kuluttua.');
				return;
			}
			JSTemplate.get('customer-watch-modify', function(template) {
				$('#defaultModal .content').html(JSTemplate.populate(template, json.data.params));

				//close watch
				$('.customer-watch .jqmClose').bind('click', function() {
					self.watchOpen = false;
					self.saveStatus = false;
				});

				//save customer watch
				$('.customer-watch .save').bind('click', function() {
					self.modify();
				});

				$('#defaultModal').jqmShow();
				$('html, body').animate({
					scrollTop: $("body").offset().top
				}, 0);

			});
			Loader.decreaseCallCount();
		}, 'json', self.options.session);
	},

	modify : function() {
		var self = this;
		if (this.saveStatus) {
			return;
		}
		this.saveStatus = true;
		var watchData = {
			watchId		: self.modifyWatchId,
			plugin		: this.options.plugin,
			namespace 	: 'properties-' + this.options.plugin
			//notice		: ($('.customer-watch input[name="notice"]').is(':checked')) ? 1 : 0
		};

		Loader.load('/search/customerwatch/modify/', watchData, function(json) {
			if (json.status == 0) {
				alert('Vahtipalvelun muokkaaminen epäonnistui. Voit kokeilla yrittää uudelleen hetken kuluttua.');
				this.saveStatus = false;
				Loader.decreaseCallCount();
				return;
			}

			JSTemplate.get('customer-watch-modified', function(template) {
				$('#defaultModal .content').html(JSTemplate.populate(template, {}));

				//close watch
				$('.customer-watch .jqmClose').bind('click', function() {
					self.watchOpen = false;
					$('#defaultModal').jqmHide();
				});
				self.saveStatus = false;
			});
			Loader.decreaseCallCount();
		});
	},

	filterAndValidate : function(data) {
		//validate data
		var errors = [];
		if (typeof(data.email) !== "undefined") {
			data.email = jQuery.trim(data.email);
			var emailRegexp = /^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i;
			if (!emailRegexp.test(data.email)) {
				errors.push('Sähköpostiosoite virheellinen');
			}
		}
		if (typeof(data.phone) !== "undefined") {
			data.phone = jQuery.trim(data.phone);
			if (data.phone.length > 20) {
				errors.push('Puhelinnumero ei voi olla yli 20 merkkiä pitkä.');
			}
		}

		if (typeof(data.firstname) !== "undefined") {
			data.name = jQuery.trim(data.firstname);
			if (data.firstname.length > 50) {
				errors.push('Etunimi ei voi olla yli 50 merkkiä pitkä.');
			}
		}

		if (typeof(data.lastname) !== "undefined") {
			data.name = jQuery.trim(data.lastname);
			if (data.lastname.length > 50) {
				errors.push('Sukunimi ei voi olla yli 50 merkkiä pitkä.');
			}
		}

		return {
			'data' : data,
			'errors' : errors,
			'isValid' : (errors.length === 0)
		};
	}
});

