/* Relaxin API version 1.0.0 */
// recreates some things to make scripts with firebug debugging functions   
// work in other browsers (especially Opera)   
// (just a quick'n'dirty drop-in approach; could perhaps be used as a user javascript)   
if (!window.console || !window.console.firebug) {
	var names = [ "dir", "dirxml", "group", "groupEnd", "trace", "profile", "profileEnd" ];
	var logFx = [ "log", "debug", "info", "warn", "error" ];
	window.console = {};
	// no more javascript errors in non-firefox browsers
	for (i in names) {
		window.console[names[i]] = function() {
		};
	}
	for (i in logFx) {
		if (window.opera) {
			// simple replacement of the console.log() etc methods of firebug   
			window.console[logFx[i]] = ( function(logtype) {
				// using scope to remember the instances of the local variables   
				// save function name for later use (logtype === logFx[i])
				// see http://www.howtocreate.co.uk/referencedvariables.html
				return function() {
					if (typeof arguments === "undefined") { // no arguments at all   
						return null;
					}
					if (arguments.length === 1) { // single argument provided   
						opera.postError(logtype + ': ' + arguments[0]);
						return logtype + ': ' + arguments[0];
					}
					var string = arguments[0];
					var regexp = new RegExp(/%([sdifo])/g); // string
															// substitution
															// patterns of
															// firebug console
					var count = 0;
					var match = null;
					// replace found matches with given arguments
					while (match = regexp.exec(string)) {
						string = string.replace(match[0],
								String(arguments[++count]));
					}
					// display log messages   
					var len = arguments.length;
					while (len > count++) {
						if (arguments[count]) {
							string += ' ';
							string += String(arguments[count]);
						}
					}
					opera.postError(logtype + ': ' + string);
				};
			})(logFx[i]);
		} else {
			window.console[logFx[i]] = function() {
			};
		}
	}
	if (window.opera) {
		// most simple assertion method with parameters: fn(expected, message)   
		window.console['assert'] = function() {
			if (arguments.length !== 2) {
				throw new Exception(
						'Please specify an assertion and a message.');
			}
			if (!arguments[0]) {
				opera.postError('Assertion failed: ' + arguments[1]);
			}
		}
		// not a good exchange for the firebug version, as this is dependant of   
		// the used counter name and displays a log message for every execution
		window.console['count'] = function(arg) {
			var title = arg || 'defaultCounter';
			if (!window.opera['FireBugEquivalent']) {
				window.opera['FireBugEquivalent'] = [];
			}
			if (!window.opera['FireBugEquivalent'][title]) {
				window.opera['FireBugEquivalent'][title] = 0;
			}
			window.opera['FireBugEquivalent'][title] = window.opera['FireBugEquivalent'][title] + 1;
			opera.postError('Counter "' + title + '" '
					+ window.opera['FireBugEquivalent'][title] + 'x called.');
		};
		// start a timer specified by a name
		window.console['time'] = function(arg) {
			var timerName = arg || 'defaultTimer';
			if (!window.opera['FireBugEquivalent']) {
				window.opera['FireBugEquivalent'] = [];
			}
			window.opera['FireBugEquivalent'][timerName] = new Date().getTime();
		};
		// stops a timer specified by name
		window.console['timeEnd'] = function(arg) {
			var timerName = arg || 'default';
			if (window.opera['FireBugEquivalent']) {
				var startTime = window.opera['FireBugEquivalent'][timerName];
				if (startTime) {
					var stopTime = new Date().getTime();
					var elapsed = (stopTime - startTime);
					opera.postError('Timer "' + timerName + '" took ' + elapsed
							+ ' millisecond' + ((elapsed == 1) ? '' : 's'));
					delete window.opera['FireBugTimerEquivalent'][timerName];
				} else { // no start timer found   
					opera
							.postError('No start timer defined - check timer name or call console.time("timerName").');
				}
			} else { // no timers at all   
				opera.postError('No previously stored timers found.');
			}
		};
	}
}
function RelaxinEngine() {
	if (!jQuery) {
		alert('Relaxin: jQuery object not available');
		return false;
	}
	if (!jQuery.address) {
		alert('Relaxin: jQuery Address plugin not available');
		return false;
	}
}

// Initiation
RelaxinEngine.prototype.initialized = false;

RelaxinEngine.prototype.instanceId = '';

RelaxinEngine.prototype.logged = null;

RelaxinEngine.prototype.partnership = 'partner';

RelaxinEngine.prototype.console = function(message) {
//	alert(message);
}

RelaxinEngine.prototype.initialize = function(id) {
	// include CSS
	this.includeCSS(this.partnership + '.css');
	
	// initialize console
	// safari?
	if (typeof(window.console) != 'undefined' && typeof(window.console.log) == 'function') {
		this.console = window.console.log;
		this.console('Relaxin: window.console initialized');
	// firebug?
	} else if (typeof(console) != 'undefined' && typeof(console.log) == 'function') {
		this.console = console.log;
		this.console('Relaxin: console.log initialized');
	}
	
	if ( id == null )
	{
		this.instanceId = this.generateInstanceId();
	}
	else
	{
		this.instanceId = id;
	}

	// initialize namespaces
	var i = 0;
	for ( var i = 0; i < RelaxinEngine.registeredNamespaces.length; i++) {
		var namespace = eval('this.' + RelaxinEngine.registeredNamespaces[i]);
		namespace.parent = namespace.relaxin = this;
		namespace.console = this.console;
		namespace.initialize();
	}

	var dhis = this;
	
	RelaxinInstanceManager.registerInstance( this.getInstanceId(), this );
	
	this.Events.addListener( this.Events.events.relaxinInitialized, jQuery( this.onready ) );
	
	this.Auth.validateSession();
}

RelaxinEngine.prototype.isInitialized = function() {
	return this.initialized;
}

// Including styles
RelaxinEngine.prototype.includeCSS = function(path) {
	// check for relative path
	if (path.substr(0,4) != 'http')
		path = 'http://www.relaxin.pl//api/api/1.0.0/files/themes/default/' + path; 
	jQuery('head').append('<link rel="stylesheet" href="' + path + '" type="text/css" />');
}

// Including script
RelaxinEngine.prototype.includeScript = function(path) {
	// check for relative path
	if (path.substr(0,4) != 'http')
		path = 'http://www.relaxin.pl//api/pub/js/' + path;
//	jQuery('head').append('<script type="text/javascript" src="' + path + '"></script>');
}

// Namespaces
// Registering namespaces
RelaxinEngine.registeredNamespaces = new Array;
RelaxinEngine.registerNamespace = function(namespace) {
	this.registeredNamespaces[this.registeredNamespaces.length] = namespace;
}
// Namespace class
RelaxinEngine.Namespace = new Function;
RelaxinEngine.Namespace.prototype.parent = null; 
RelaxinEngine.Namespace.prototype.relaxin = null; 
RelaxinEngine.Namespace.prototype.console = null; 
RelaxinEngine.Namespace.prototype.htmlTemplates = new Object; 
RelaxinEngine.Namespace.prototype.initialized = false;
RelaxinEngine.Namespace.prototype.initialize = function() {
	this.initialized = true;
}
RelaxinEngine.Namespace.prototype.isInitialized = function() {
	return this.initialized;
}

RelaxinEngine.prototype.generateInstanceId = function()
{
	return new String( Math.random() ).replace( '\.', '' );
}

RelaxinEngine.prototype.getElementClass = function( name )
{
	return 'relaxin' + name;
}

RelaxinEngine.prototype.getInstanceClass = function()
{
	return 'relaxinInstance-' + this.instanceId;
}

RelaxinEngine.prototype.getElements = function( name )
{
	return jQuery('.' + this.getElementClass(name) );
}

RelaxinEngine.prototype.getInstanceId = function()
{
	return this.instanceId;
}

RelaxinEngine.prototype.cloneObject = function(o) {
    if(!o || 'object' !== typeof o) {
        return o;
    }
    var c = '[object Array]' === Object.prototype.toString.call(o) ? [] : {};
    var p, v;
    for(p in o) {
        if(o.hasOwnProperty(p)) {
            v = o[p];
            if(v && 'object' === typeof v) {
                c[p] = this.cloneObject(v);
            }
            else {
                c[p] = v;
            }
        }
    }
    return c;
}


RelaxinEngine.registerNamespace('Address');
RelaxinEngine.prototype.Address = new RelaxinEngine.Namespace;

RelaxinEngine.prototype.Address.oldPathNames		= new Array();
RelaxinEngine.prototype.Address.oldParameters		= new Object();
RelaxinEngine.prototype.Address.currentPathNames	= new Array();
RelaxinEngine.prototype.Address.currentParameters	= new Object();
RelaxinEngine.prototype.Address.states				= new Object();
RelaxinEngine.prototype.Address.addressStock		= new Array();

RelaxinEngine.prototype.Address.setState = function(id, state) {
	this.states[id] = state;
}

RelaxinEngine.prototype.Address.getState = function(id) {
	if (!this.states[id])
		return {};
	return this.states[id];
}

RelaxinEngine.prototype.Address.processor = function(event) {
	// backup current data
	this.oldPathNames	= this.currentPathNames;
	this.oldParameters	= new Object();
	for (var parameter in this.currentParameters) {
		this.oldParameters[parameter] = this.currentParameters[parameter];
	}
	// save current path names
	this.currentPathNames = jQuery.address.pathNames();
	// parse current parameters
	var parameters = $.address.parameterNames();
	this.currentParameters	= new Object();
	for (var i = 0; i < parameters.length; i++) {
		this.currentParameters[parameters[i]] = jQuery.address.parameter(parameters[i]);
	}
	if (event.event == 'addressInitialize')
		this.initialized = true;
	else
		RelaxinInstanceManager.dispatchEvent('addressChanged');
}

RelaxinEngine.prototype.Address.initialize = function() {
	var addressProcessor = function(event) {
		event.relaxin.Address.processor(event);
	}
	this.relaxin.Events.addListener('addressInitialize', addressProcessor);
	this.relaxin.Events.addListener('addressBeforeChange', addressProcessor);
}

RelaxinEngine.prototype.Address.setStockAndSetAddress = function(address, params) {
	
	var currAddress = "";
	for (path in this.currentPathNames) {
		currAddress += "/" + this.currentPathNames[path];
	}
	var addr = {
		'address' 	: currAddress,
		'params'	: this.currentParameters
	};
	this.addressStock.push(addr);
	this.setAddress(address, params);
}

RelaxinEngine.prototype.Address.getStockAndSetAddress = function() {
	var addr = null;
	if (this.addressStock.length > 0) {
		addr = this.addressStock.pop();
		if (addr.address != '/Logout'){
			this.setAddress(addr.address, addr.params);
			return true;
		} else 
			return false;
	} else {
		return false;
	}
}

RelaxinEngine.prototype.Address.setAddress = function(address, params, options) {
	if (typeof(options) == 'undefined')
		options = {};
	if (typeof(options.redirect) == 'undefined')
		options.redirect = false;
	if (address.substr(0, 1) == '#' && !options.redirect)
		address = address.substr(1, address.length - 1);
	var parameters = "";
	for (param in params) {
		parameters += param + "=" + params[param] + "&";
	}
	if (parameters != "") {
		parameters = "?"+parameters;
		parameters = parameters.substring(0, parameters.length-1);
	}
	if (options.redirect)
		document.location.href = address+parameters;
	else
		jQuery.address.value(address+parameters);
}

if (jQuery.address) {
	jQuery.address.init(function() {
		RelaxinInstanceManager.dispatchEvent('addressInitialize');
	});
	jQuery.address.change(function() {
		RelaxinInstanceManager.dispatchEvent('addressBeforeChange');
	});
}
RelaxinEngine.registerNamespace('Auth');
RelaxinEngine.prototype.Auth = new RelaxinEngine.Namespace;

RelaxinEngine.prototype.Auth.userData	= new Object();
RelaxinEngine.prototype.Auth.userRights	= new Object();
RelaxinEngine.prototype.Auth.userLogged	= false;

RelaxinEngine.prototype.Auth.parseData = function(event) {
	var relaxin = RelaxinInstanceManager.getInstance(event.instance);
	if (event.result == 'ok') {
		relaxin.Auth.userData	= event.data;
		relaxin.Auth.userRights	= new Object();
		relaxin.Auth.userLogged = true;
//		relaxin.Events.dispatchEvent('messageBroadcast', {event: 'loaded', message: 'Zalogowano pomyślnie.'});
	} else {
		relaxin.Auth.userData	= new Object();
		relaxin.Auth.userRights	= new Object();
		relaxin.Auth.userLogged = false;
//		relaxin.Events.dispatchEvent('messageBroadcast', {event: 'error', message: 'Wystąpił błąd.'});
	}
	relaxin.Events.dispatchEvent('userStatusChanged');
}

RelaxinEngine.prototype.Auth.userLogin = function(login, passw, callback) {
//	this.relaxin.Remote.loginUser({
//		'login'		: login,
//		'password'	: passw
//	}, this.parseData);
	this.relaxin.console('Auth: Callback: ', callback);
//	console.
	this.relaxin.Remote.loginUser({'login' : login, 'password' : passw}, function(event) {
		var relaxin = RelaxinInstanceManager.getInstance(event.instance);
//		relaxin.console('Remote Callback: ', callback);
		if (event.result == 'ok') {
//			relaxin.console('event', event.data);
			relaxin.Auth.userData	= event.data;
			relaxin.Auth.userRights	= new Object();
			relaxin.Auth.userLogged = true;
			relaxin.Events.dispatchEvent('messageBroadcast', {event: 'loaded', message: 'Zalogowano pomyślnie.'});
			relaxin.Events.dispatchEvent('userStatusChanged');
//			if (event.data.user_kind != null && event.data.user_kind == true) {
//   				if (!relaxin.Address.getStockAndSetAddress()) 
   					relaxin.Address.setAddress('#/Welcome');
//			} else {
//   				if (!event.relaxin.Address.getStockAndSetAddress()) 
//				relaxin.Address.setAddress('#/ChooseRole');
//			}
		} else {
			relaxin.Auth.userData	= new Object();
			relaxin.Auth.userRights	= new Object();
			relaxin.Auth.userLogged = false;
			relaxin.Events.dispatchEvent('messageBroadcast', {event: 'error', message: event.data});
		}
		if (typeof(callback) == 'function')
			callback(event);
	});
}

RelaxinEngine.prototype.Auth.validateSession = function() {
	this.relaxin.Remote.isLogged(null, this.parseData);
}

RelaxinEngine.prototype.Auth.userLogout = function() {
	this.relaxin.Remote.logoutUser(function(event) {
		var relaxin = RelaxinInstanceManager.getInstance(event.instance);
		relaxin.Auth.userLogged = false;
		relaxin.Events.dispatchEvent('userStatusChanged');
	});
}

RelaxinEngine.prototype.Auth.isUserLogged = function() {
	return this.userLogged;
}
RelaxinEngine.registerNamespace('Events');
RelaxinEngine.prototype.Events = new RelaxinEngine.Namespace;

RelaxinEngine.prototype.Events.listeners = {};

RelaxinEngine.prototype.Events.registerEvent = function(event) {
	this.events = event;
}

RelaxinEngine.prototype.Events.removeListener = function(event, id) {
	if (typeof this.listeners[event] != 'undefined') {
		delete this.listeners[event][id];
	}
}

/**
 * event - nazwa eventa
 * listener - listener
 * 
 * format listenera:
 * 
 * function( e )
 * 
 * gdzie o:
 * { 
 * 	event 			: nazwa eventa,
 *  instance 		: instancja relaxina,
 *  data 			: dane dodatkowe,
 *  instanceName 	: nazwa instancji,
 *  eventManager	: manager eventow, ktory go wywolal
 * }
 */
RelaxinEngine.prototype.Events.addListener = function(event, listener, id) {
	//		alert('listener added: ' + event + '  ' + listener);

	if (typeof listener != 'function') {
		return null;
	}

	if (id == null) {
		id = new String(Math.random()).replace('\.', '');
		;
	}

	if (typeof this.listeners[event] == 'undefined') {
		this.listeners[event] = {};
	}

	this.listeners[event][id] = listener;

	return id;
}

/**
 * event - nazwa eventa
 * data - dodatkowe dane
 */
RelaxinEngine.prototype.Events.dispatchEvent = function(event, data) {
	if (typeof this.listeners[event] == 'undefined')
		return;
	for ( var listenerId in this.listeners[event]) {
		var listener = this.listeners[event][listenerId];
		if (typeof listener == 'function')
			listener(this.createEventHash(event, data, listenerId));
	}
	this.console(event);
}

RelaxinEngine.prototype.Events.createEventHash = function(event, data,
		listenerId) {
	return {
		'event' : event,
		'relaxin' : this.relaxin,
		'data' : data,
		'eventManager' : this,
		'listenerId' : listenerId
	};
}

RelaxinEngine.prototype.Events.events = {
	userStatusChanged : 'userStatusChanged',
	relaxinInitialized : 'relaxinInitialized'
}
RelaxinEngine.registerNamespace('Interface');
RelaxinEngine.prototype.Interface = new RelaxinEngine.Namespace;

RelaxinEngine.prototype.Interface.htmlTemplates.paths = {
	"photo_temp":		{"path": "http://www.relaxin.pl//api/pub/temp/%photo-id%-%photo-suffix%.jpg"},
	"photo_AddObject":	{"path": "http://www.relaxin.pl//api/pub/upload/%object-id%/img/%photo-id%-%photo-suffix%.jpg"},
	"photo_AddRoom":	{"path": "http://www.relaxin.pl//api/pub/upload/%object-id%/%room-id%/img/%photo-id%-%photo-suffix%.jpg"}
}
;

RelaxinEngine.prototype.Interface.embedLogin = function(items) {
	// draw base tag
	this.drawBaseTag(items, 'Login');
	if (this.isInitialized() && jQuery) {
		this.formSketcher('Login', this.htmlTemplates.embedLogin.data.fields, {}, {}, ['objects', 'sites', 'reservations'], function(formData) {
			if (formData.validation) {
				formData.relaxin.Events.dispatchEvent('messageBroadcast', {event: 'loading', message: 'Trwa logowanie...'});
				formData.relaxin.Auth.userLogin(formData.fields.login.value, formData.fields.password.value);
			}
		});
	}
}
RelaxinEngine.prototype.Interface.htmlTemplates.embedLogin = {
	data: {
	"fields": [{
		"name": "Logowanie",
		"fields":	{
			"login":	{"type": "text", "name": "E-mail", "needed": true, "format": "email"},
			"password":	{"type": "password", "name": "Hasło", "needed": true, "format": "text"},
			"errmsg":	{"type": "plain", "name": "", "value": "Jeżeli masz problem z zalogowaniem się, upewnij się, że podajesz prawidłowy adres e-mail oraz hasło. Możesz skorzystać także z funkcji <a href='#/Login/RemindPassword'>przypominania hasła</a>.<br />Jeśli nie masz konta, <a href='#/Register'>zarejestruj się</a>.", "cssclass": "wide"},
			"info":		{"type": "plain", "name": "", "value": "<br />Korzystając z portalu relaxin.pl akceptujesz aktualny <a href='http://www.relaxin.pl/regulamin/' target='_blank'>regulamin</a>.<br /><br />"},
	       	"submit":	{"type": "submit", "name": "", "value": "Zaloguj się", "cssclass": "wide"}
		}
	},{
		"name": "Zapomniałeś hasła?",
		"fields":	{
			"remind":	{"type": "button", "name": "", "value": "Przypomnij hasło", "link": "#/Login/RemindPassword", "cssclass": "wide"}
		}
	}]
}

}

/**
 * Returns HTML for component base tag
 */
RelaxinEngine.prototype.Interface.getBaseTag = function(name, tag) {
	if (tag == null)
		tag = 'div';
	return '<' + tag + ' class="' + this.relaxin.getElementClass(name) + '"></' + tag + '>';
}

/**
 * Appends components base tags to items
 */
RelaxinEngine.prototype.Interface.drawBaseTag = function(items, name, tag) {
	if (jQuery) {
		if (typeof(items) != 'array')
			items = [items];
		for (var i = 0; i < items.length; i++) {
			var container = jQuery(items[i]);
			if (container.length > 0) {
				container.append(this.getBaseTag(name, tag));
			}
		}
	}
}

/**
 * Embeds user Panel
 */
RelaxinEngine.prototype.Interface.embedUserInfo = function(items) {
	// draw base tag
	this.drawBaseTag(items, 'UserInfo');
	// skecher
	var sketcher = function(event) {
		var userName = '';
		if (event.relaxin.Auth.userData.firstname || event.relaxin.Auth.userData.surname) {
			if (event.relaxin.Auth.userData.firstname)
				userName += event.relaxin.Auth.userData.firstname;
			if (event.relaxin.Auth.userData.firstname && event.relaxin.Auth.userData.surname)
				userName += ' ';
			if (event.relaxin.Auth.userData.surname)
				userName += event.relaxin.Auth.userData.surname;
		} else {
			userName += event.relaxin.Auth.userData.email;
		}
		var componentHTML = event.relaxin.Interface.getTemplate('UserInfo', {name: userName},
			!event.relaxin.Auth.isUserLogged() ? 'notlogged' : 'logged');
		event.relaxin.Interface.fillBaseTagWithHtml('UserInfo', componentHTML);
	}
	if (this.relaxin.isInitialized())
		sketcher(this.relaxin.Events.createEventHash('relaxinInitialized'));
	else
		this.relaxin.Events.addListener('relaxinInitialized', sketcher);
	this.relaxin.Events.addListener('userStatusChanged', sketcher);

}
RelaxinEngine.prototype.Interface.htmlTemplates.embedUserInfo = {
	logged		: 'Witaj, <strong>%name%</strong>!',
	notlogged	: ''
}

RelaxinEngine.prototype.Interface.formSketcher = function(basetag, fields, values, variables, functions, callback) {
	var fieldsHTML = '';
	var fieldsArray = new Object();
	var fieldsUploaders = new Array();
	var fieldsDatepickers = new Array();
	var formats = {
	"nonumbers":	{"regexp": "/^\\D+$/i"},
	"numbers":		{"regexp": "/^[0-9]{1,16}$/", "suggestion": "W tym polu dozwolone są tylko cyfry."},
	"price":		{"regexp": "/^[0-9]{1,16}(,[0-9]{1,2})?$/", "suggestion": "Podaj wartość w formacie 'liczba' lub 'liczba,liczba'."},
	"email":		{"regexp": "/^[a-zA-Z0-9\\.\\-\\_]+\\@[a-zA-Z0-9\\.\\-\\_]+\\.[a-z]{2,4}$/i"},
	"www":			{"regexp": "/^(http:\\/\\/)?[a-zA-Z0-9\\.\\-\\_]+\\.[a-z]{2,4}$/i"},
	"phone":		{"regexp": "/^((\\+\\d{1,3}[\\s\\-]*)?(\\d{3})[\\s\\-]*(\\d{3})[\\s\\-]*(\\d{3}))$|^((\\+\\d{1,3}[\\s\\-]*)?(\\d{2})[\\s\\-]*(\\d{3})[\\s\\-]*(\\d{2})[\\s\\-]*(\\d{2}))$|^((0)[\\s\\-]*(\\d{2})[\\s\\-]*(\\d{3})[\\s\\-]*(\\d{2})[\\s\\-]*(\\d{2}))$/", "suggestion": "Podaj numer w formacie +XX XXX XXX XXX lub 0 XX XXX XX XX"},
	"bankaccount":	{"regexp": "/^(\\d{2})\\s*(\\d{4})\\s*(\\d{4})\\s*(\\d{4})\\s*(\\d{4})\\s*(\\d{4})\\s*(\\d{4})$/", "suggestion": "Podaj numer konta w formacie NRB (26 cyfr)"},
	"postcode":		{"regexp": "/^\\d{2}\\-\\d{3}$/"},
	"date_dmY":		{"regexp": "/^\\d{2}[\\-\\.]\\d{2}[\\-\\.]\\d{4}$/", "suggestion": "Podaj wartość w formacie 'dd-mm-yyyy' lub 'dd.mm.yyyy'."}
};
	
	fields = this.relaxin.cloneObject(fields);
	values = this.relaxin.cloneObject(values);
	variables = this.relaxin.cloneObject(variables);
	
	if (typeof(fields) != 'null') {
		// generate html
		var id = new String('RelaxinForm' + Math.random()).replace('\.', '');
		fieldsHTML += '<form class="%_CLASS_%" id="' + id + '">';
		var textParser = function(template, item) {
			for (property in item)
				template = template.replace('%' + property + '%', item[property]);
			return template;
		}
		for (var i = 0; i < fields.length; i++) {
			var cssclass = ""; 
			if (fields[i].cssclass)
				cssclass = (cssclass.length > 0 ? ' ' : '') + fields[i].cssclass;
			if (fields[i].collapsible)
				cssclass = (cssclass.length > 0 ? ' ' : '') + 'collapsible' + (fields[i].collapsed ? ' collapsed' : '');
			fieldsHTML += '<fieldset' + (fields[i].id ? ' id="' + fields[i].id + '"' : '') + (cssclass ? ' class="' + cssclass + '"' : '') + '>';
			if (typeof(fields[i].name) != 'undefined')
				fieldsHTML += '<legend>' + fields[i].name + '</legend>';
			fieldsHTML += '<ol>';
			for (j in fields[i].fields) {
				var field = fields[i].fields[j];
				// field specific
				switch (field.type) {
					case 'date':
						if (!field.dateformat)
							field.dateformat = 'yy-mm-dd';
						if (!field.dateformatshow)
							field.dateformatshow = field.dateformat;
// if (values[j])
// values[j] = jQuery.datepicker.formatDate(field.dateformatshow,
// jQuery.datepicker.parseDate(field.dateformat, values[j]));
						break;
				}
				// write values
				if (values[j])
					field.value = values[j];
				field.value = field.value ? field.value : '';
				// needed
				if (!field.needed) {
					field.needed = false;
				} else if (field.needed.functions) {
					var neededfunctions = field.needed.functions.toString();
					var m = 0;
					var needed = false;
					do {
						needed = (neededfunctions.indexOf(functions[m]) > -1);
						m++;
					} while (!needed && m < functions.length);
					field.needed = needed;
				} else if (field.needed.fields) {
					field.needed = false;
				}
				if (field.type == 'hidden') {
					fieldsHTML += '<input id="' + id + '-' + j + '" name="' + j + '" type="' + field.type + '" value="' + field.value + '" class="%_CLASS_%-field relaxinInput-' + field.type + '" />';
				} else {
					// li
					fieldsHTML += '<li id="' + id + '-' + j + '"' + (typeof(field.cssparentclass) != 'undefined' ? ' class="' + field.cssparentclass + '"' : '') + '>';
					// label
					if (typeof(field.name) != 'undefined')
						fieldsHTML += '<label ' + (typeof(field.cssclass) != 'undefined' ? ' class="' + field.cssclass + '"' : '') + '>' + field.name + (field.needed != true ? '' : ' <em>*</em>') + '</label>';
					switch (field.type) {
						case 'list':
							if (field.list && field.list.length > 0) {
								fieldsHTML += '<table class="%_CLASS_%-field' + (typeof(field.cssclass) != 'undefined' ? ' ' + field.cssclass : '') + '">';
								fieldsHTML += '<tbody>';
								
								if (field.headers && field.headers.length > 0) {
									fieldsHTML += '<tr>';
										for (var m = 0; m < field.headers.length &&  m < field.columns.length; m++) {

											fieldsHTML += '<th style="font-size:10px;text-align:left;text-transform:uppercase;">' + field.headers[m] + '</th>';

										}
									fieldsHTML += '</tr>';
								}
								for (var m = 0; m < field.list.length; m++) {
									fieldsHTML += '<tr>';
									if (field.buttons) {
										for (n in field.buttons) {
											field.list[m][n] = textParser('<a href="' + field.buttons[n].href + '" class="button">' + field.buttons[n].text + '</a>', field.list[m]);
										}										
									}
									if (field.popups) {
										for (n in field.popups) {
											field.list[m][n] = textParser('<a onclick="window.open(\'' + field.popups[n].href + '\', \'' + field.popups[n].text + '\', \'menubar=yes,toolbar=yes,location=yes,directories=yes,status=yes,scrollbars=yes,resizable=yes,fullscreen=no,channelmode=no,width=1024,height=800\').focus(); return false" href="' + field.popups[n].href + ' class="button">' + field.popups[n].text + '</a>', field.list[m]);
										}										
									}
									if (field.columns.length > 0) {
										for (var n = 0; n < field.columns.length; n++) {
											fieldsHTML += '<td class="' + field.columns[n] + ((field.buttons[field.columns[n]] || ((field.popups) ? field.popups[field.columns[n]] : false)) ? ' button' : '') + '">' + field.list[m][field.columns[n]] + '</td>';
										}
									}
									fieldsHTML += '</tr>';
								}
								fieldsHTML += '</tbody>';
								fieldsHTML += '</table>';
							}
							
							break;
						case 'plain':
							fieldsHTML += '<span class="%_CLASS_%-plain relaxinPlain' + (typeof(field.cssclass) != 'undefined' ? ' ' + field.cssclass : '') + '">' + field.value + '</span>';
							break;
						case 'multiphoto':
							fieldsUploaders[fieldsUploaders.length] = {name: j, value: field.value};
							var valueString = (field.value && field.value.length > 0 ? ',' + field.value.join(',') : '');
							fieldsHTML += '<span class="%_CLASS_%-upload relaxinUploadButton' + (typeof(field.cssclass) != 'undefined' ? ' ' + field.cssclass : '') + '"><span class="relaxinUploadSWF"><span id="' + id + '-' + j + '-upload"></span></span><span class="relaxinUploadProgress"><span class="relaxinUploadProgressValue"></span></span><span class="relaxinUploadStats"><span class="relaxinBreak"></span></span></span>';	
							fieldsHTML += '<span class="%_CLASS_%-thumbs relaxinUploadThumbs' + (typeof(field.cssclass) != 'undefined' ? ' ' + field.cssclass : '') + '"><span class="relaxinBreak"></span></span>';
							fieldsHTML += '<input name="' + j + '" type="hidden" value="' + valueString + '" class="%_CLASS_%-field" />';
							break;
						case 'range':
							fieldsHTML += '<span class="%_CLASS_%-range relaxinRange' + (typeof(field.cssclass) != 'undefined' ? ' ' + field.cssclass : '') + '" id="' + id + '-' + j + '-range"></span>';	
							break;
						case 'date':
							fieldsDatepickers[fieldsDatepickers.length] = {name: j, type: field.type, dateformat: field.dateformat, dateformatshow: field.dateformatshow};
							fieldsHTML += '<input name="' + j + '" type="text" value="' + field.value + '" class="%_CLASS_%-field relaxinInput-' + field.type + (typeof(field.cssclass) != 'undefined' ? ' ' + field.cssclass : '') + '" />';
							break;
						case 'daterange':
							fieldsDatepickers[fieldsDatepickers.length] = {name: j, type: field.type, dateformat: field.dateformat, dateformatshow: field.dateformatshow};
							fieldsHTML += '<input name="' + j + '" type="text" value="' + field.value + '" class="%_CLASS_%-field relaxinInput-' + field.type + ' relaxinInput-' + field.type + '-from' + (typeof(field.cssclass) != 'undefined' ? ' ' + field.cssclass : '') + '" />';
							fieldsHTML += '<span class="relaxinInput-' + field.type + '-info">-</span>';
							fieldsHTML += '<input name="' + j + '" type="text" value="' + field.value + '" class="%_CLASS_%-field relaxinInput-' + field.type + ' relaxinInput-' + field.type + '-to' + (typeof(field.cssclass) != 'undefined' ? ' ' + field.cssclass : '') + '" />';
							break;
						case 'slider':
							fieldsHTML +=	'<span class="relaxinSliderHolder">'
									   +		'<span class="relaxinSliderLeft"></span>'
									   +		'<a id="' + id + '-' + j + '-handle" class="relaxinSliderHandle"></a>'
									   +		'<span class="relaxinSliderRight"></span>'
									   +		'<input name="' + j + '" type="text" value="' + field.value + '" class="%_CLASS_%-field relaxinSliderInput' + (typeof(field.cssclass) != 'undefined' ? ' ' + field.cssclass : '') + '"' + (typeof(field.link) != 'undefined' ? ' onclick="document.location.href=\'' + field.link +'\';"' : '') + ' />'
//									   +		'<input type="hidden" value="0" class="relaxinSliderMin" />'
//									   +		'<input type="hidden" value="0" class="relaxinSliderMax" />'
									   +	'</span>';
							break;
						case 'text':
						case 'password':
						case 'submit':
						case 'button':
							switch (field.target) {
								case '_blank':
									var onclick = "window.open('" + field.link + "');";
									break;
								default:
									var onclick = "document.location.href='" + field.link + "';";
									break;
							}
							fieldsHTML += '<input name="' + j + '" type="' + field.type + '" value="' + field.value + '" class="%_CLASS_%-field relaxinInput-' + field.type + (typeof(field.cssclass) != 'undefined' ? ' ' + field.cssclass : '') + '"' + (typeof(field.link) != 'undefined' ? ' onclick="' + onclick + '"' : '') + ' />';
							break;
						case 'buttons':
//							this.relaxin.console('buttons', field);
							if (field.list && field.list.length > 0) {
//								fieldsHTML += '<table class="%_CLASS_%-field' + (typeof(field.cssclass) != 'undefined' ? ' ' + field.cssclass : '') + '">';
//								fieldsHTML += '<tbody>';
//								
//								if (field.headers && field.headers.length > 0) {
//									fieldsHTML += '<tr>';
//										for (var m = 0; m < field.headers.length &&  m < field.columns.length; m++) {
//
//											fieldsHTML += '<th style="font-size:10px;text-align:left;text-transform:uppercase;">' + field.headers[m] + '</th>';
//
//										}
//									fieldsHTML += '</tr>';
//								}
//								for (var m = 0; m < field.list.length; m++) {
//									fieldsHTML += '<tr>';
//									if (field.buttons) {
//										for (n in field.buttons) {
//											field.list[m][n] = textParser('<a href="' + field.buttons[n].href + '" class="button">' + field.buttons[n].text + '</a>', field.list[m]);
//										}										
//									}
//									if (field.popups) {
//										for (n in field.popups) {
//											field.list[m][n] = textParser('<a onclick="window.open(\'' + field.popups[n].href + '\', \'' + field.popups[n].text + '\', \'menubar=yes,toolbar=yes,location=yes,directories=yes,status=yes,scrollbars=yes,resizable=yes,fullscreen=no,channelmode=no,width=1024,height=800\').focus(); return false" href="' + field.popups[n].href + ' class="button">' + field.popups[n].text + '</a>', field.list[m]);
//										}										
//									}
//									if (field.columns.length > 0) {
//										for (var n = 0; n < field.columns.length; n++) {
//											fieldsHTML += '<td class="' + field.columns[n] + ((field.buttons[field.columns[n]] || ((field.popups) ? field.popups[field.columns[n]] : false)) ? ' button' : '') + '">' + field.list[m][field.columns[n]] + '</td>';
//										}
//									}
//									fieldsHTML += '</tr>';
//								}
//								fieldsHTML += '</tbody>';
//								fieldsHTML += '</table>';
							}
							break;
						case 'textarea':
							fieldsHTML += '<textarea name="' + j + '" class="%_CLASS_%-field' + (typeof(field.cssclass) != 'undefined' ? ' ' + field.cssclass : '') + '">' + field.value + '</textarea>';
							break;
						case 'select':
							fieldsHTML += '<select name="' + j + '" class="%_CLASS_%-field' + (typeof(field.cssclass) != 'undefined' ? ' ' + field.cssclass : '') + '">';
							fieldsHTML += '<option value="">wybierz...</option>';
							if (field.groups && typeof(field.groups) == 'object') {
								for (var m = 0; m < field.groups.length; m++) {
									fieldsHTML += '<optgroup' + (field.groups[m].id ? ' id="' + field.groups[m].id + '"' : '') + (field.groups[m].label ? ' label="' + field.groups[m].label + '"' : '') + '>';
									if (field.groups[m].options && typeof(field.groups[m].options) == 'object' && field.groups[m].options instanceof Array && field.groups[m].options.length > 0) {
										for (var n = 0; n < field.groups[m].options.length; n++) {
											fieldsHTML += '<option' + (field.groups[m].options[n] == field.value ? ' selected="selected"' : '') + '>' + field.groups[m].options[n] + '</option>';
										}
									} else if (field.groups[m].options && typeof(field.groups[m].options) == 'object') {
										for (var n in field.groups[m].options) {
											fieldsHTML += '<option value="' + n + '"' + (n == field.value ? ' selected="selected"' : '') + '>' + field.groups[m].options[n] + '</option>';
										}
									}
//									for (var n = 0; n < field.groups[m].options.length; n++) {
//										fieldsHTML += '<option' + (field.groups[m].options[n] == field.value ? ' selected="selected"' : '') + '>' + field.groups[m].options[n] + '</option>';
//									}
									fieldsHTML += '</optgroup>';
								}
							} else if (field.options && typeof(field.options) == 'object' && field.options instanceof Array && field.options.length > 0) {
								for (var m = 0; m < field.options.length; m++) {
									fieldsHTML += '<option' + (field.options[m] == field.value ? ' selected="selected"' : '') + '>' + field.options[m] + '</option>';
								}
							} else if (field.options && typeof(field.options) == 'object') {
								for (var m in field.options) {
									fieldsHTML += '<option value="' + m + '"' + (m == field.value ? ' selected="selected"' : '') + '>' + field.options[m] + '</option>';
								}
							}
							fieldsHTML += '</select>';
							break;
						case 'options':
							fieldsHTML += '<div class="relaxinOptions' + (typeof(field.cssclass) != 'undefined' ? ' ' + field.cssclass : '') + '">';
							if (field.groups && typeof(field.groups) == 'object') {
								for (var m = 0; m < field.groups.length; m++) {
									fieldsHTML += '<fieldset' + (field.groups[m].id ? ' id="' + field.groups[m].id + '"' : '') + '>';
									if (field.groups[m].label)
										fieldsHTML += '<legend ' + (typeof(field.groups[m].cssclass) != 'undefined' ? ' ' + field.groups[m].cssclass : '') + '>' + field.groups[m].label + '</legend>';
									fieldsHTML += '<ul>';
									for (var n = 0; n < field.groups[m].options.length; n++) {
										var optionid = this.relaxin.getElementClass('ListOption') + '-' + j + '-' + (new String(Math.random()).replace('\.', ''));
										var checked = "";
										for (var c = 0; c < field.value.length; c++ ) {
											if (field.groups[m].options[n] == field.value[c]) {
												checked = 'checked';
												break;
											}
										}
										
										fieldsHTML += '<li><input name="' + j + '" id="' + optionid + '" type="' + (field.multiple ? 'checkbox' : 'radio') + '" '  + checked + ' class="%_CLASS_%-field" value="' + field.groups[m].options[n] + '" /><label for="' + optionid + '">' + field.groups[m].options[n] + '</label></li>';
									}
									fieldsHTML += '</ul></fieldset>';
								}
							} else if (field.options && typeof(field.options) == 'object' && field.options instanceof Array && field.options.length > 0) {
								fieldsHTML += '<ul>';
								for (var m = 0; m < field.options.length; m++) {
									var optionid = this.relaxin.getElementClass('ListOption') + '-' + j + '-' + (new String(Math.random()).replace('\.', ''));
									var checked = "";
									for (var c = 0; c < field.value.length; c++ ) {
										if (field.options[m] == field.value[c]) {
											checked = 'checked';
											break;
										}
									}
									
									fieldsHTML += '<li><input name="' + j + '"" id="' + optionid + '" type="' + (field.multiple ? 'checkbox' : 'radio') + '" '  + checked + ' class="%_CLASS_%-field" value="' + field.options[m] + '" /><label for="' + optionid + '">' + field.options[m] + '</label></li>';

								}
								fieldsHTML += '</ul>';
								
							} else if (field.options && typeof(field.options) == 'object') {
								fieldsHTML += '<ul>';
								for (var m in field.options) {
									var optionid = this.relaxin.getElementClass('ListOption') + '-' + j + '-' + m;
									var checked = "";
									if (field.checked=='checked' && field.value.length == 0) {
										checked = 'checked='+field.checked;
									} else {
										if (field.value instanceof Array) {
											for (var c = 0; c < field.value.length; c++ ) {
												if (m == field.value[c]) {
													checked = 'checked';
													break;
												}
											}
										} else {
											if (m == field.value)
												checked = 'checked';
										}
									}
//									if (field.checked) {
//											checked = 'checked='+field.checked;
//										}

									fieldsHTML += '<li><input name="' + j + '" id="' + optionid + '" type="' + (field.multiple ? 'checkbox' : 'radio') + '" '  + checked + ' class="%_CLASS_%-field" value="' + m + '" /><label for="' + optionid + '">' + field.options[m] + '</label></li>';
								}
								fieldsHTML += '</ul>';
							}
							fieldsHTML += '</div>';
							break;
					}
					// validation info
					fieldsHTML += '<span class="%_CLASS_%-validator relaxinValidator" style="display: inline-block;"></span>';
					fieldsHTML += '<span class="%_CLASS_%-tip relaxinTip"></span>';
					fieldsHTML += '</li>';
				}
				fieldsArray[j] = field;
			}
			fieldsHTML += '</ol>';
			fieldsHTML += '</fieldset>';
		}
		fieldsHTML += '</form>';
	}
	if (basetag == null) {
		return fieldsHTML;
	} else {
		
//		this.relaxin.console('id: ', id);
		
		// create html
		this.fillBaseTagWithHtml(basetag, fieldsHTML);
		
		// create listeners for collapsible fieldsets
		var fieldsetSwitch = function(fieldset, open) {
			if (fieldset.length > 0) {
				if (fieldset.hasClass('collapsed') || open) {
					fieldset.children('ol:hidden').slideDown();
					fieldset.removeClass('collapsed');
				} else {
					fieldset.children('ol').slideUp();
					fieldset.addClass('collapsed');
				}
			}
		}
		jQuery('#' + id + ' fieldset.collapsible legend').bind('click', {id: id, basetag: basetag, relaxin: this.relaxin}, function(event) {
			fieldsetSwitch(jQuery(this).parents('fieldset.collapsible'));
		});
		
		// create photo upload managers
		var relaxin = this.relaxin;
		var elementClass = this.relaxin.getElementClass(basetag);
		// function to add photos
		var photoAdd = function(id, field, photoID, photoURL, animate) {
			jQuery('#' + id + '-' + field + ' .' + elementClass + '-thumbs .relaxinBreak').before('<span id="relaxinPhotoId-' + photoID + '" class="relaxinPhotoHolder" style="background-image: url(' + photoURL + ');"><span class="relaxinPhotoMask"></span><a class="relaxinPhotoClose" title="Kliknij, aby usun�� zdj�cie"></a></span>');
			$('<img />').attr('src', photoURL).bind('load', {animate: animate}, function() {
				if (!animate)
					jQuery('#relaxinPhotoId-' + photoID).show();
				else
					jQuery('#relaxinPhotoId-' + photoID).fadeIn('slow');
				$(this).remove();
		    });
			jQuery('#relaxinPhotoId-' + photoID + ' a.relaxinPhotoClose').bind('click', {id: id, field: field, photoID: photoID}, function(event) {
				event.preventDefault();
				photoRemove(event.data.id, event.data.field, event.data.photoID);
				return false;
			});
			var fieldObject = jQuery('#' + id + '-' + field + ' .' + elementClass + '-field');
			if (fieldObject.val().indexOf(',' + photoID) < 0)
				fieldObject.val(fieldObject.val() + ',' + photoID).blur();
		}
		// function to remove photos
		var photoRemove = function(id, field, photoID) {
			jQuery('#relaxinPhotoId-' + photoID).fadeOut('fast', function() {
				jQuery(this).remove();
			});
			var fieldObject = jQuery('#' + id + '-' + field + ' .' + elementClass + '-field');
			fieldObject.val(fieldObject.val().replace(eval('/' + ',' + photoID + '/g'), '')).blur();
		}
		// progress managing
		var photoProgress = function(id, field, show, value) {
			var progress = jQuery('#' + id + '-' + field + ' .' + elementClass + '-upload .relaxinUploadProgress');
			progress.children('.relaxinUploadProgressValue').width(parseInt(value) + '%');
			if (show) {
				progress.filter(':hidden').fadeIn();
			} else {
				progress.fadeOut();
			}
		}
		// bind upload managers
		for (var i = 0; i < fieldsUploaders.length; i++) {
			var fieldData = fieldsUploaders[i];
			var field = fieldData.name;
			// initialize sorting photos
			jQuery('#' + id + '-' + field + ' .' + elementClass + '-thumbs').sortable({items: '.relaxinPhotoHolder', helper: 'clone'}).addClass('sortable').bind('sortstop', {id: id, field: field, elementClass: elementClass}, function(event, ui) {
				var items = jQuery(this).sortable('toArray');
				var photosString = '';
				for (var m = 0; m < items.length; m++) {
					var match = items[m].match(/^relaxinPhotoId\-([a-z0-9]{32})$/i);
					if (match)
						photosString += ',' + match[1];
				}
				var list = jQuery('#' + event.data.id + '-' + event.data.field + ' .' + event.data.elementClass + '-field').val(photosString);
			});
			// create and initialize uploader
			var photoUploader = new SWFUpload({
				custom_settings: {
					id: id,
					field: field,
					relaxin: this.relaxin,
					elementClass: elementClass,
					photoAdd: photoAdd,
					photoRemove: photoRemove,
					photoProgress: photoProgress
				},
				upload_url : "http://www.relaxin.pl//api/f9d6ebd06a53752dcb4c0b6cd75516d2/1.200.3/uploadPhoto?relaxin_instance=" + this.relaxin.getInstanceId(),  
				flash_url : "http://www.relaxin.pl//api/pub/flash/swfupload.swf", 
				file_size_limit : "10 MB",
				file_dialog_complete_handler : function() { 
					this.startUpload();
					return true;
				},
				upload_progress_handler : function(file, bytesCompleted, bytesTotal) {
					var stats = this.getStats();
					var total = stats.files_queued + stats.successful_uploads;
					var progress = Math.floor((stats.successful_uploads + bytesCompleted / bytesTotal) / total * 100);
					this.customSettings.photoProgress(this.customSettings.id, this.customSettings.field, true, progress);
				},
				upload_error_handler : function(a, b, c, d){
					var e = b + ' ';
					for( var j in a ) {
						e += j + ': ' + a[j] + '; '; 
					}
					for( var j in SWFUpload.UPLOAD_ERROR ) {
						e += j + ': ' + SWFUpload.UPLOAD_ERROR[j] + '; '; 
					}
					alert('error ' + e );
				},
				upload_success_handler: function(file, server_data, receivedResponse) {
					eval('var data = ' + server_data);
					if (data.result == 'ok') {
						var photoURL = this.customSettings.relaxin.Interface.htmlTemplates.paths.photo_temp.path.replace('%photo-id%', data.data.photo_id).replace('%photo-suffix%', 'preview');
						this.customSettings.photoAdd(this.customSettings.id, this.customSettings.field, data.data.photo_id, photoURL);
					}
					var stats = this.getStats();
					if (stats.files_queued == 0 && stats.in_progress == 0) {
						this.setStats({
							in_progress:		0,
							files_queued:		0,
							successful_uploads:	0,
							upload_errors:		0,
							upload_cancelled:	0
						});
						this.customSettings.photoProgress(id, field, false, 100);
					}
					this.startUpload();
				},
				upload_complete_handler : function() {
					var stats = this.getStats();
					if (stats.files_queued == 0 && stats.in_progress == 0) {
						this.setStats({
							in_progress:		0,
							files_queued:		0,
							successful_uploads:	0,
							upload_errors:		0,
							upload_cancelled:	0
						});
						this.customSettings.photoProgress(id, field, false, 100);
					}
				},
				button_placeholder_id : id + '-' + field + '-upload',
				button_image_url : "http://www.relaxin.pl//api/api/1.0.0/files/themes/default/images/field-button.png",
				button_text: '<a>DODAJ</a>',
				button_text_style: 'a { font-family: Calibri, Verdana, Tahoma, sans-serif; font-weight: 12; color: #ffffff;}',
				button_text_left_padding: 32,
				button_text_top_padding: 6,
				button_cursor : SWFUpload.CURSOR.HAND,
				button_width: 100,
				button_height: 30,
				file_post_name : "filedata"
			}
			); 
//			this.relaxin.console(fieldsUploaders[i]);
			if (fieldData.value && fieldData.value.length > 0) {
				for (var j = 0; j < fieldData.value.length; j++) {
					var photoURL = this.htmlTemplates.paths['photo_' + basetag].path.replace('%photo-id%', fieldData.value[j]).replace('%photo-suffix%', 'preview');
					if (variables) {
						for (m in variables) {
							photoURL = photoURL.replace('%' + m + '%', variables[m]);
						}
					}
					photoAdd(id, field, fieldData.value[j], photoURL, false);
				}
			}
		}
		
		// bind datepicker to date fields
		if (fieldsDatepickers.length > 0) {
			var dateCurrent = new Date();
			jQuery.datepicker.setDefaults({
				monthNames: ['styczeń', 'luty', 'marzec', 'kwiecień', 'maj', 'czerwiec', 'lipiec', 'sierpień', 'wrzesień', 'październik', 'listopad', 'grudzień'],
				monthNamesShort: ['sty', 'lut', 'mar', 'kwi', 'maj', 'cze', 'lip', 'sie', 'wrz', 'paź', 'lis', 'gru'],
				dayNamesShort: ['Nie', 'Pon', 'Wto', 'Śro', 'Czw', 'Pią', 'Sob'],
				dayNamesMin: ['Ni', 'Po', 'Wt', 'Śr', 'Cz', 'Pt', 'So'],
				prevText: 'Wstecz',
				nextText: 'Dalej',
				minDate: new Date(dateCurrent.getFullYear(), 0, 1),
				maxDate: new Date(dateCurrent.getFullYear(), 11, 31),
				navigationAsDateFormat: true,
				beforeShow: function(input) {
					jQuery(input).attr('state', 'locked');
				},
				onClose: function(datetext, datepicker) {
					datepicker.input.attr('state', '');
				},
				onSelect: function(datetext, datepicker) {
					datepicker.input.attr('state', '').blur();
				}
			});
			for (var i = 0; i < fieldsDatepickers.length; i++) {
				var field = fieldsDatepickers[i];
				var datepicker = jQuery('#' + id + ' .relaxinInput-' + field.type + '[name=' + field.name + ']').datepicker({dateFormat: field.dateformatshow});
				if (datepicker.val() != '0000')
					datepicker.attr('readonly', true).datepicker('setDate', jQuery.datepicker.parseDate(field.dateformat, datepicker.val()));
			}
		}
		
		// slider
		var sliderRefresh = function(event, ui) {
			var value = this.sliderInput[0].sliderMin + (this.sliderInput[0].sliderMax - this.sliderInput[0].sliderMin) / (this.sliderInput.parent().width() - jQuery(this).width()) * parseInt(jQuery(this).css('left'));
			this.sliderInput.val(value.toFixed(1));
		}
		var sliders = jQuery('.relaxinSliderHandle').draggable({
			containment: 'parent',
			drag: sliderRefresh,
			stop: sliderRefresh
		}).each(function() {
			this.sliderInput = jQuery(this).siblings('.relaxinSliderInput');
			this.sliderInput[0].sliderHandle = jQuery(this);
			this.sliderValue = function(value) {
				jQuery(this).animate({'left': Math.round((value - this.sliderInput[0].sliderMin) / (this.sliderInput[0].sliderMax - this.sliderInput[0].sliderMin) * (this.sliderInput.parent().width() - jQuery(this).width())) + 'px'}, 'slow');
			}
			jQuery(this).parent().bind('click', {sliderHandle: this, sliderInput: this.sliderInput}, function(event) {
				var offset = jQuery(this).offset();
				var position = Math.min(Math.max(0, event.pageX - offset.left - jQuery(event.data.sliderHandle).width() / 2), jQuery(this).width() - jQuery(event.data.sliderHandle).width());
				var value = event.data.sliderInput[0].sliderMin + (event.data.sliderInput[0].sliderMax - event.data.sliderInput[0].sliderMin) / (jQuery(this).width() - jQuery(event.data.sliderHandle).width()) * position;
				event.data.sliderHandle.sliderValue(value);
				event.data.sliderInput.val(value.toFixed(1)).blur();
			});
		});

		// hide validator info elements
		var validator = jQuery('#' + id + ' .' + elementClass + '-validator').hide();
		var fieldtip = jQuery('#' + id + ' .' + elementClass + '-tip').hide();

		// validator
		var validator = function(event, fieldObject) {
			if (!fieldObject)
				fieldObject = jQuery(this);
			if (!fieldObject)
				return "ok";
			var fieldData = event.data.fields[fieldObject.attr('name')];
			if (!fieldData)
				return "ok";
			var fieldValue = null;
			var holder = jQuery('#' + id + '-' + fieldObject.attr('name'));
			var elementClass = event.data.relaxin.getElementClass(event.data.basetag);
			switch (fieldData.type) {
				case 'daterange':
					if (fieldData.needed) {
						var fieldPartFrom	= holder.children('.relaxinInput-' + fieldData.type + '-from');
						var fieldPartTo		= holder.children('.relaxinInput-' + fieldData.type + '-to');
					}
					break;
				case 'date':
					if (fieldObject.attr('state') == 'locked')
						return;
					fieldValue = jQuery.datepicker.formatDate(fieldData.dateformat, fieldObject.datepicker('getDate'));
					break;
				case 'options':
					fieldValue = (holder.find('input[type=checkbox]:checked').length > 0);
					break;
				case 'multiphoto':
				case 'text':
				case 'password':
				case 'textarea':
				case 'select':
					fieldValue = fieldObject.val();
					var format = fieldData.format != null ? event.data.formats[fieldData.format] : null;
					var formatValid = true;
					if (format && format.regexp) {
						var regexp = eval(format.regexp)
						formatValid = (regexp && regexp.test && regexp.test(fieldObject.val()));
					}
					if (fieldValue != '' && !formatValid) {
						return event.data.relaxin.Interface.formValidator(holder, elementClass, true, "wrongformat", "Niepoprawny format danych" + (format && format.suggestion ? '<br />' + format.suggestion : ''));
					}
					break;
			}
			switch (fieldData.type) {
				case 'hidden':
				case 'button':
				case 'submit':
					return "ok";
					break;
				default:
					if (fieldValue == '' && fieldData.needed) {
						return event.data.relaxin.Interface.formValidator(holder, elementClass, true, "needed", "Pole jest wymagane");
					} else if (fieldValue == '') {
						return event.data.relaxin.Interface.formValidator(holder, elementClass, false, "ok", "");
					} else {
						return event.data.relaxin.Interface.formValidator(holder, elementClass, true, "ok", "");
					}
					break;
			}
		}

		// bind validator to blur event
		var classifier = '#' + id;
		jQuery(classifier + ' input, ' + classifier + ' textarea, ' + classifier + ' select').bind('blur', {id: id, basetag: basetag, relaxin: this.relaxin, fields: fieldsArray, formats: formats}, validator);
		jQuery(classifier + ' input[type=checkbox], ' + classifier + ' input[type=radio]').bind('click', {id: id, basetag: basetag, relaxin: this.relaxin, fields: fieldsArray, formats: formats}, validator).unbind('blur', validator);

		// bind submit event
		jQuery(classifier + ' input[type=submit]').bind('click', {id: id, basetag: basetag, relaxin: this.relaxin, fields: fieldsArray, formats: formats, callback: callback}, function(event) {
			event.preventDefault();
			var elementClass = event.data.relaxin.getElementClass(event.data.basetag);
			// collect data
			var collectedData = new Object();
			var formValid = true;
			var formSubmit = null;
			for (field in event.data.fields) {
				var fieldData = event.data.fields[field];
				var fieldObject = new Object();
				switch (fieldData.type) {
					case 'options':
						var fieldObjects = jQuery('#' + id + '-' + field + ' .' + elementClass + '-field');
						fieldObject = (fieldObjects.length > 0 ? jQuery(fieldObjects[0]) : {});
						break;
					case 'hidden':
						fieldObject = jQuery('#' + id + '-' + field + '.' + elementClass + '-field');
						break;
					default:
						fieldObject = jQuery('#' + id + '-' + field + ' .' + elementClass + '-field');
						break;
				}
				if (fieldObject && fieldObject.length > 0 && fieldObject[0] == this)
					formSubmit = field;
				var fieldValue = null;
				var fieldValid = (fieldData.type == 'hidden' || validator(event, fieldObject) == 'ok');
				if (!fieldValid)
					formValid = false;
				switch (fieldData.type) {
					case 'date':
						fieldValue = jQuery.datepicker.formatDate(fieldData.dateformat, fieldObject.datepicker('getDate'));
						break;
					case 'options':
						fieldValue = new Array();
						var fieldObjects = fieldObjects.filter(':checked');
						for (var i = 0; i < fieldObjects.length; i++) {
							fieldValue[fieldValue.length] = jQuery(fieldObjects[i]).val();
						}
						break;
					case 'hidden':
					case 'multiphoto':
					case 'text':
					case 'password':
					case 'textarea':
					case 'select':
					case 'slider':
						fieldValue = fieldObject.val();
						break;
				}
				collectedData[field] = {value: fieldValue, valid: fieldValid};
			}
//			event.data.relaxin.console(collectedData);
			if (event.data.callback)
				event.data.callback({submit: formSubmit, relaxin: event.data.relaxin, fields: collectedData, validation: formValid, id: id});
		});
		
	}

	return id;
}

RelaxinEngine.prototype.Interface.formValidator = function(holder, elementClass, show, status, message) {
	var validator = holder.find('.' + elementClass + '-validator');
	var fieldTip = holder.find('.' + elementClass + '-tip');
	var validatorStatus = (status == 'ok' ? 'ok' : 'error');
	if (show) {
		holder.removeClass('ok').removeClass('error').addClass(validatorStatus);
		validator.attr('title', message).filter(':hidden').fadeIn();
		if (message != '') {
			fieldTip.html(message).filter(':hidden').slideDown();
		} else {
			fieldTip.slideUp();
		}
//		if (validatorStatus == 'error')
// fieldsetSwitch(fieldObject.parents('fieldset.collapsible.collapsed'));
	} else {
		holder
			.removeClass('ok')
			.removeClass('error');
		validator.fadeOut();
	}
	return status;
}

RelaxinEngine.prototype.Interface.formDataParser = function(collectedData) {
	for (var i in collectedData) {
		collectedData[i] = collectedData[i].value;
	}
	return collectedData;
}

RelaxinEngine.prototype.Interface.parseString = function( name, template, vars ) {
	if ( vars == null )
	{
		vars = {};
	}
	
	vars['_CLASS_'] = this.relaxin.getInstanceClass() + ' ' + this.relaxin.getElementClass( name );
	
	for( var i in vars )
	{
		template = template.replace( new RegExp( '%' + i + '%', 'g' ), vars[i] );
	}
	
	return template;
}

RelaxinEngine.prototype.Interface.getTemplate = function( name, vars, part, noparse )
{
	if ( part == null )
	{
		part = 'item';
	}
	
	var tplName = name;
	
	if ( typeof this.htmlTemplates[ tplName ] == 'undefined' )
	{
		tplName = 'embed' + tplName;
	}

	if ( typeof this.htmlTemplates[ tplName ] == 'undefined' )
	{
		return '';
	}
	
	var template = this.htmlTemplates[ tplName ][part];
	
	return (noparse != true ? this.parseString(name, template, vars) : template);
}	

RelaxinEngine.prototype.Interface.fillBaseTag = function( name, data, part, append )
{	
	this.fillBaseTagWithHtml(name, this.getTemplate( name, data, part ), append);
}

RelaxinEngine.prototype.Interface.fillBaseTagWithHtml = function(name, html, append, cssclass) {
	if (append == null)
		append = false;
	
	html = this.parseString( name, html );
	if (append == true) {
		return jQuery( '.' + this.relaxin.getElementClass( name ) ).append( html );
	} else {
		return jQuery( '.' + this.relaxin.getElementClass( name ) ).html( html );
	}
}

RelaxinEngine.registerNamespace('InterfaceWidgets');
RelaxinEngine.prototype.InterfaceWidgets = new RelaxinEngine.Namespace;

RelaxinEngine.InterfaceWidgets = {};

//RelaxinEngine.InterfaceWidgets.MapRadius

//RelaxinEngine.prototype.InterfaceWidgets.MapDistance

//RelaxinEngine.InterfaceWidgets.MapRadius.prototype = new google.maps.MVCObject();



			/**
			 * A distance widget that will display a circle that can be resized and will
			 * provide the radius in km.
			 *
			 * @param {google.maps.Map} map The map to attach to.
			 *
			 * @constructor
			 */
/*			RelaxinEngine.InterfaceWidgets.MapDistance = function(map) {
				this.set('map', map);
				this.set('position', map.getCenter());
 
				var marker = new google.maps.Marker({
					draggable: true,
					title: 'Move me!'
				});
 
				// Bind the marker map property to the DistanceWidget map property
				marker.bindTo('map', this);
 
				// Bind the marker position property to the DistanceWidget position
				// property
				marker.bindTo('position', this);
 
				// Create a new radius widget
				var radiusWidget = new RelaxinEngine.InterfaceWidgets.MapRadius();
 
				// Bind the radiusWidget map to the DistanceWidget map
				radiusWidget.bindTo('map', this);
 
				// Bind the radiusWidget center to the DistanceWidget position
				radiusWidget.bindTo('center', this, 'position');
 
				// Bind to the radiusWidgets' distance property
				this.bindTo('distance', radiusWidget);
 
				// Bind to the radiusWidgets' bounds property
				this.bindTo('bounds', radiusWidget);
			}
			RelaxinEngine.InterfaceWidgets.MapRadius.prototype = new google.maps.MVCObject();
 
 
			/**
			 * A radius widget that add a circle to a map and centers on a marker.
			 *
			 * @constructor
			 */
			RelaxinEngine.InterfaceWidgets.MapRadius = function(opts) {
				var circle = new google.maps.Circle();
				
				// Set the distance property value, default to 50km.
				
				this.set('distance', opts.radius);
 
				// Bind the RelaxinEngine.InterfaceWidgets.MapRadius bounds property to the circle bounds property.
				this.bindTo('bounds', circle);
 
				// Bind the circle center to the RelaxinEngine.InterfaceWidgets.MapRadius center property
				circle.bindTo('center', this);
 
				// Bind the circle map to the RelaxinEngine.InterfaceWidgets.MapRadius map
				circle.bindTo('map', this);
 
				// Bind the circle radius property to the RelaxinEngine.InterfaceWidgets.MapRadius radius property
				circle.bindTo('radius', this);
 
				// setup
				circle.setOptions(opts);

				// Add the sizer marker
				this.addSizer_();

				// Add the sizer marker
				this.addMover_();
				
				this.set('resize_handler', null);
				
//				var marker = new google.maps.Marker({
//					draggable: true,
//					title: 'Move me!'
//				});
				
			}
			if (google && google.maps && google.maps.MVCObject)
				RelaxinEngine.InterfaceWidgets.MapRadius.prototype = new google.maps.MVCObject();
 
 
			/**
			 * Update the radius when the distance has changed.
			 */
			RelaxinEngine.InterfaceWidgets.MapRadius.prototype.distance_changed = function() {
				this.set('radius', this.get('distance'));
			};
 
 
			/**
			 * Add the sizer marker to the map.
			 *
			 * @private
			 */
			RelaxinEngine.InterfaceWidgets.MapRadius.prototype.addSizer_ = function() {
				var sizer = new google.maps.Marker({
					draggable: true,
					flat: true,
					icon: new google.maps.MarkerImage(
							// url
							'http://www.relaxin.pl//api/api/1.0.0/files/themes/default/images/gm_resize_ew.png',
							// size
							new google.maps.Size(28,28),
							// origin
							new google.maps.Point(0,0),
							// anchor
							new google.maps.Point(14,14)
							),
					zIndex: 1000000,
					title: 'Powiększ/pomniejsz obszar wyszukiwania'
				});
 
				sizer.bindTo('map', this);
				sizer.bindTo('position', this, 'sizer_position');
 
				var me = this;
				google.maps.event.addListener(sizer, 'drag', function() {
					// Set the circle distance (radius)
					me.setDistance();
				});
			};
			
			/**
			 * Add the sizer marker to the map.
			 *
			 * @private
			 */
			RelaxinEngine.InterfaceWidgets.MapRadius.prototype.addMover_ = function() {
				var mover = new google.maps.Marker({
					draggable: true,
					flat: true,
					icon: new google.maps.MarkerImage(
						// url
						'http://www.relaxin.pl//api/api/1.0.0/files/themes/default/images/gm_move.png',
						// size
						new google.maps.Size(28,28),
						// origin
						new google.maps.Point(0,0),
						// anchor
						new google.maps.Point(14,14)
						),
					zIndex: 1000000,
					title: 'Przesuń obszar wyszukiwania'
				});
				
				mover.bindTo('map', this);
				mover.bindTo('position', this, 'center');
				
//				mover.setMap(this.map);
//				mover.setMap(this.map);
				
//				var me = this;
//				google.maps.event.addListener(mover, 'drag', function() {
					// Set the circle distance (radius)
//					me.setPosition();
//				});
			};
 
 
			/**
			 * Update the center of the circle and position the sizer back on the line.
			 *
			 * Position is bound to the DistanceWidget so this is expected to change when
			 * the position of the distance widget is changed.
			 */
			RelaxinEngine.InterfaceWidgets.MapRadius.prototype.center_changed = function() {
				var bounds = this.get('bounds');
 
				// Bounds might not always be set so check that it exists first.
				if (bounds) {
					var lng = bounds.getNorthEast().lng();
 
					// Put the sizer at center, right on the circle.
					var position = new google.maps.LatLng(this.get('center').lat(), lng);
					this.set('sizer_position', position);
				}
			};
 
 
			/**
			 * Calculates the distance between two latlng points in km.
			 * @see http://www.movable-type.co.uk/scripts/latlong.html
			 *
			 * @param {google.maps.LatLng} p1 The first lat lng point.
			 * @param {google.maps.LatLng} p2 The second lat lng point.
			 * @return {number} The distance between the two points in km.
			 * @private
			 */
			RelaxinEngine.InterfaceWidgets.MapRadius.prototype.distanceBetweenPoints_ = function(p1, p2) {
				if (!p1 || !p2) {
					return 0;
				}
 
				var R = 6371000; // Radius of the Earth in km
				var dLat = (p2.lat() - p1.lat()) * Math.PI / 180;
				var dLon = (p2.lng() - p1.lng()) * Math.PI / 180;
				var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
					Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) *
					Math.sin(dLon / 2) * Math.sin(dLon / 2);
				var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
				var d = R * c;
				return d;
			};
 
 
			/**
			 * Set the distance of the circle based on the position of the sizer.
			 */
			RelaxinEngine.InterfaceWidgets.MapRadius.prototype.setDistance = function() {
				// As the sizer is being dragged, its position changes.	Because the
				// RelaxinEngine.InterfaceWidgets.MapRadius's sizer_position is bound to the sizer's position, it will
				// change as well.
				var pos = this.get('sizer_position');
				var center = this.get('center');
				var distance = this.distanceBetweenPoints_(center, pos);
 
				// Set the distance property for any objects that are bound to it
				this.set('distance', distance);
				
//				if (typeof(this.resize_handler) == 'function')
//					this.resize_handler();
				google.maps.event.trigger(this, 'radiuschange');
			};
			
			RelaxinEngine.InterfaceWidgets.MapRadius.prototype.setMap = function(map) {
				this.set('map', map);
			};
			
			RelaxinEngine.InterfaceWidgets.MapRadius.prototype.onResize = function(handler) {
				this.set('resize_handler', handler);
			};
RelaxinInstanceManager = {};

RelaxinInstanceManager.instance = null;

RelaxinInstanceManager.instances = {};

RelaxinInstanceManager.registerInstance = function(name, instance) {
	if (RelaxinInstanceManager.instance == null) {
		if (typeof instance != 'object') {
			instance = new RelaxinEngine();
		}
		RelaxinInstanceManager.instance = instance;
	}

	return RelaxinInstanceManager.instance;
}

RelaxinInstanceManager.getInstance = function() {
	return RelaxinInstanceManager.instance;
}

RelaxinInstanceManager.dispatchEvent = function(event) {
	RelaxinInstanceManager.instance.Events.dispatchEvent(event);
}

SWFUInstanceManager = {};

SWFUInstanceManager.instances = {};

SWFUInstanceManager.getInstance = function(name, params) {
	if (typeof SWFUInstanceManager.instances[name] == 'undefined') {
		SWFUInstanceManager.instances[name] = new SWFUpload(params);
	}

	return SWFUInstanceManager.instances[name];
}
RelaxinEngine.registerNamespace('Remote');
RelaxinEngine.prototype.Remote = new RelaxinEngine.Namespace;

// JSON AJAX
RelaxinEngine.prototype.Remote.queryJSON = function(method, data, callback) {
	var urls = 'http://www.relaxin.pl//api/f9d6ebd06a53752dcb4c0b6cd75516d2/1.200.3/' + method + '/?callback=?';
	if (callback == null)
		callback = this[method + '_callback'];
	if (data == null)
		data = {};
	data.relaxin_instance = this.relaxin.getInstanceId();
	parsedData = new Object();
	for (field in data) {
		if (typeof(data[field]) == 'object') {
			for (property in data[field]) {
				parsedData[field + '[' + property + ']'] = data[field][property];
			}
		} else {
			parsedData[field] = data[field];
		}
	}
	jQuery.ajax({
		type: "GET",
		url: urls,
		data: parsedData,
		success: callback,
		error: callback,
		timeout: 10000,
		cache: false,
		dataType: 'json'
	});
}

RelaxinEngine.prototype.Remote.sendPOST = function(method, data, callback) {
	var urls = method + '?';
//	if (callback == null)
//		callback = this[method + '_callback'];
	if (data == null)
		data = {};
	data.relaxin_instance = this.relaxin.getInstanceId();
	parsedData = new Object();
	for (field in data) {
		if (typeof(data[field]) == 'object') {
			for (property in data[field]) {
				if (property == 'value') {
					parsedData[field] = data[field][property];
				}
//				parsedData[field + '[' + property + ']'] = data[field][property];
			}
		} else {
			parsedData[field] = data[field];
		}
	}
	jQuery.ajax({
		type: "GET",
		url: urls,
		data: parsedData,
		success: callback,
		error: callback,
		timeout: 10000,
		cache: false,
		dataType: 'html'
	});
}

RelaxinEngine.prototype.Remote.printResponse = function(o, clasResp) {
	var dhis = RelaxinInstanceManager.getInstance(o.instance);
	var clas = dhis.getElementClass( clasResp );
	jQuery('.'+clas+'-msg').val(o.data);
}


RelaxinEngine.prototype.Remote.getHelp = function(data, callback) {
	this.queryJSON('getHelp', data, callback);
}


//Get rooms
RelaxinEngine.prototype.Remote.getRoom = function(data, callback) {
	this.queryJSON( 'getRoom', data, callback );
}

RelaxinEngine.prototype.Remote.loginUser = function(data, callback)
{
	this.queryJSON( 'loginUser', data, callback );
}
RelaxinEngine.prototype.Remote.logoutUser = function(callback)
{
	this.queryJSON( 'logoutUser', {}, callback );
}

RelaxinEngine.prototype.Remote.authorizeUser = function( data, callback )
{
	this.queryJSON( 'authorizeUser', data, callback );
}

RelaxinEngine.prototype.Remote.isLogged = function( data, callback )
{
	this.queryJSON( 'isLogged', null, callback );
}

RelaxinEngine.prototype.Remote.getObject = function( data, callback )
{
	this.queryJSON( 'getObject', data, callback );
}

//RelaxinEngine.prototype.Remote.browseNewObjects = function( data, callback )
//{
//	this.queryJSON( 'getNewObjects', data, callback );
//}

RelaxinEngine.registerNamespace('Session');
RelaxinEngine.prototype.Session = new RelaxinEngine.Namespace;

RelaxinEngine.prototype.Session.session = '';
RelaxinEngine.prototype.Session.userName = '';

RelaxinEngine.prototype.Session.isLogged = function() {
	return true;
	Relaxin.Remote.getMyAccount({}, function(result, status) {
		if (status == 'success') {
			var relaxin = RelaxinInstanceManager.getInstance(result.instance);
			relaxin.Session.session = result.session;
			relaxin.Session.userName = result.data;
			relaxin.console(result);
			return true;
//			return (d.Session.userName != null);
		} else {
		}
	});
}

RelaxinEngine.prototype.Interface.createURL = function(){
	var url = '#';
	for ( name in this.relaxin.Address.currentPathNames){
		url += '/' + this.relaxin.Address.currentPathNames[name];
	}
	var params = '';
	var allParams = this.relaxin.Address.currentParameters;
	for ( param in allParams){
		if (param != 'location' && param != 'page' && param != 'min' && param != 'max' && param != 'order')
			params += param + '=' + allParams[param] + '&';
	}
	if (params != '') url += ('?' + params );
	return url;
}

RelaxinEngine.prototype.Interface.embedResults = function(items, criterion){
	// draw base tag
	this.drawBaseTag(items, 'ObjectResults');
	
	if (this.isInitialized() && jQuery) {
		var objectsPerPage = 20;
		
		if (this.relaxin.Interface.Map.mapObject)
			this.relaxin.Interface.Map.mapObject.clearMarkers();

		var drawSearchedContent = function(event){
			var relaxin = RelaxinInstanceManager.getInstance(event.instance);
			var count = event.count;
			var licznik = '';
			var licznikCountPage = parseInt(((count-0.1) / objectsPerPage));
			var index_begin = 0;
			var index_end = (licznikCountPage < 3) ? licznikCountPage : 3;
			var url = relaxin.Interface.createURL();
			if (min == 0 && max == 0) {
				min = index_begin;
				max = index_end;
			}
			if (page < min || page > max ){
				page = 0;
				min = 0;
				max = (licznikCountPage < 3) ? licznikCountPage : 3;
			}
			for(i=0;i <= licznikCountPage; i++){
				var vis = 'block';
				if (min != 0 && max != 0){
					vis = (i >= min && i <= max)?'block':'none';
				} else 
					vis = (i > 3)?'none':'block';
					
				if (i > max) {
					index_end = max + 1;
					index_begin = min + 1;
				}else 
					if (i < min) {
					index_end = max - 1;
					index_begin = min - 1;	
				}else
				if (i >= min && i <= max){
					index_begin = min; 
					index_end = max;
				}
				var order = '';
				if (relaxin.Address.currentParameters.order)
					order = relaxin.Address.currentParameters.order;  
				data = {
					number 	: (i+1),
					'link'	: url + 'order='+ order +'&page='+i+'&min='+index_begin+'&max='+index_end, 
					'disp'	: vis
				}
				licznik += relaxin.Interface.getTemplate('Results',data,'licznik_item');
			}	
			data = {
					count: count,
					orderprice: url + 'order=price',
					orderrank: url + 'order=rank',
					orderdistance: url + 'order=range',
					objects: '',
					licznikTop: relaxin.Interface.getTemplate('Results', {
							res: 'Top', item: licznik}, 'licznik'),
					licznikBottom: relaxin.Interface.getTemplate('Results', {
								res: 'Bottom', item: licznik }, 'licznik')
			}
			relaxin.Interface.fillBaseTagWithHtml('ObjectResults', relaxin.Interface.getTemplate('Results', data, 'item'));
			jQuery('.relaxinChangeOrder').bind('change', {relaxin: relaxin}, function(event) {
				document.location.href = jQuery(this).val();
			});
			jQuery('.relaxinMapShowFound').bind('click', {relaxin: relaxin}, function(event) {
				event.data.relaxin.Interface.fitMap(null, event.data.relaxin.Interface.Map.fitMode.toMarkers);
			});
			// scripts
			var licznik = '.relaxinResultsToolBar .relaxinLicznik';
			var licznikTop = '.relaxinResultsToolBar .relaxinLicznikPlaceTop .relaxinLicznik';
			var licznikBottom = '.relaxinResultsToolBar .relaxinLicznikPlaceBottom .relaxinLicznik';
			jQuery( licznikTop 	+ ' .relaxinLicznikL' ).eq(page).addClass('selected');
			jQuery( licznikBottom + ' .relaxinLicznikL' ).eq(page).addClass('selected');
			
			jQuery( licznik + ' .relaxinLicznikL' ).css('cursor','pointer').bind('click',function(event){
				relaxin.Address.setState('currentPageResult',{page: (parseInt(jQuery( this ).children('a').text())-1)});
			});
			var sortLink = '.relaxinResults .relaxinResultsToolBar span a'; 
			jQuery( sortLink ).removeClass('select');
			if (relaxin.Address.currentParameters.order){
				if (relaxin.Address.currentParameters.order == 'price')
					jQuery( sortLink ).eq(0).addClass('select');
				else
				if (relaxin.Address.currentParameters.order == 'rank')
					jQuery( sortLink ).eq(1).addClass('select');
				else
				if (relaxin.Address.currentParameters.order == 'range')
					jQuery( sortLink ).eq(2).addClass('select');
				else 
					jQuery( sortLink ).eq(0).addClass('select');
			} else {
				relaxin.Address.currentParameters.order = 'price';
				jQuery( sortLink ).eq(0).addClass('select');
			}
			//
			jQuery( licznik + ' .relaxinLicznikPrevR').css('cursor','pointer').bind('click',
			function(){
				//currentPage = relaxin.Address.getState('currentPageResult');
				if (page > 0) {
					relaxin.Address.setState('currentPageResult',{page:page-1,index_low: 0,index_high:3 });
					//jQuery( this ).css('display', 'block');
					//jQuery( this ).next().next().next().next().css('display', 'none');
					jQuery( this ).children('a').attr('href',jQuery(licznik + ' .selected').prev().children('a').attr('href'));
				}
			});
			jQuery( licznik + ' .relaxinLicznikNextR').css('cursor','pointer').bind('click',
			function(){  
				//currentPage = relaxin.Address.getState('currentPageResult');
				if (( (page+1) * objectsPerPage) < count) {
					relaxin.Address.setState('currentPageResult',{page:page+1});
					//jQuery( this ).parent().find('li.selected').hide();
					jQuery( this ).children('a').attr('href',jQuery(licznik + ' .selected').next().children('a').attr('href'));
				}
			});
			jQuery( licznik + ' li').css('cursor','pointer').bind('click',
			function(){
				relaxin.Address.setState('currentPageResult',{page:page});
				});
		}
		
		// Draw objects
		var drawSearchedObjects = function(event){
			var relaxin = RelaxinInstanceManager.getInstance(event.instance);
			var objectsHtml = '';
			var cache = new Array();
			if (event.result == 'ok') {
				var paths = {
	"photo_temp":		{"path": "http://www.relaxin.pl//api/pub/temp/%photo-id%-%photo-suffix%.jpg"},
	"photo_AddObject":	{"path": "http://www.relaxin.pl//api/pub/upload/%object-id%/img/%photo-id%-%photo-suffix%.jpg"},
	"photo_AddRoom":	{"path": "http://www.relaxin.pl//api/pub/upload/%object-id%/%room-id%/img/%photo-id%-%photo-suffix%.jpg"}
}
;
				for (i = 0; i < event.data.length; i++) {
					for (j = 0; j < event.data[i].room_types.length; j++) {
						data = {
							'id'			: event.data[i].room_types[j].id,
							'idObject'		: event.data[i].id + paramSearch,
							'idRoom'		: event.data[i].room_types[j].id,
							'oname'			: event.data[i].name,
							'name'			: event.data[i].room_types[j].name,
							'description'	: event.data[i].room_types[j].descr,
							'city'			: event.data[i].city + ', ' + event.data[i].region,
							'promoted'		: (event.data[i].room_types[j].promoted == 1)? ' promotedItem' : '',
							'price'			: event.data[i].room_types[j].price_avg + ' PLN',
							'pricemin'		: Math.min(event.data[i].room_types[j].price_s1, event.data[i].room_types[j].price_s2, event.data[i].room_types[j].price_s3),
							'pricemax'		: Math.max(event.data[i].room_types[j].price_s1, event.data[i].room_types[j].price_s2, event.data[i].room_types[j].price_s3),
							'path'			: paths.photo_AddRoom.path.replace('%object-id%', event.data[i].id.substr(0, 2) + '/' + event.data[i].id).replace('%room-id%', event.data[i].room_types[j].id).replace('%photo-id%', event.data[i].room_types[j].photo).replace('%photo-suffix%', 'thumb')
						}
						objectsHtml += relaxin.Interface.getTemplate('Thumbnails', data, 'item');
						if (i < 3) 
							cache[i] = event.data[i];
					}
					if (relaxin.Interface.Map.mapObject) {
						relaxin.Interface.markOnMap(relaxin.Interface.Map.mapObject, {
							id: event.data[i].room_types[0].id,
							position: new google.maps.LatLng(event.data[i].latit, event.data[i].longit),
							title: event.data[i].name + "; " + event.data[i].city + ', ' + event.data[i].region,
							markerType: (event.data[i].room_types[0].promoted > 0 ? relaxin.Interface.Map.markerTypes.objectMediumPromoted : relaxin.Interface.Map.markerTypes.objectMedium),
							click: function(event){
							var link = jQuery('.' + this.relaxin.getInstanceClass() + ' .relaxinObjectLink-id-' + this.internalID);
							if (link.length > 0) 
								document.location.href = link.attr('href');
						}
						});
					}
				}
				relaxin.Interface.fitMap(relaxin.Interface.Map.mapObject);
//				if (relaxin.Interface.Map.mapObject.markers.length > 0) {
//					var bounds = new google.maps.LatLngBounds();
//					for (var i = 0; i < relaxin.Interface.Map.mapObject.markers.length; i++) {
//						bounds.extend(relaxin.Interface.Map.mapObject.markers[i].getPosition());
//					}
//					relaxin.Interface.Map.mapObject.map.fitBounds(bounds);
//				}
			}
			var objectsList = '.' + relaxin.getElementClass('Results') + 
				' .'+ relaxin.getElementClass('Resultsobjects');
			jQuery( objectsList ).html(objectsHtml);
			// scripts
			jQuery('.relaxinResults .relaxinResultsobjects .relaxinThumbnails-item').bind('click',
			function(){
				var index = jQuery( this ).parent().children('.relaxinThumbnails-item').index( this );
				//alert(' index '+parseInt(index+(page*objectsPerPage) / 3));
				
				relaxin.Address.setState('searchCriterion', {criterion:paramSearch,page: 0, data: cache, count:event.count });
				relaxin.Address.setState('currentPage', { page:0,index_left:0,index_right:3 }); 
			});	
		}
		
		var criterion = this.relaxin.Address.currentParameters;
		var paramSearch = '';
					for (param in criterion){
						if (param != 'room' && param != 'object' && param != 'page' && param != 'min' && param != 'max' )
							paramSearch += '&'+param+'='+criterion[param];
					}
		paramSearch += (this.relaxin.Address.currentPathNames[1] != null)? '&location=' + this.relaxin.Address.currentPathNames[1]:'';
		loadPage = this.relaxin.Address.getState('loadPage');
		var pageAdress = jQuery.address.value();
		var page = 0;
		var min = 0;
		var max = 0;
		var checkMinMax = false;
		
		if (this.relaxin.Address.currentParameters.min != null && this.relaxin.Address.currentParameters.max != null) {
			var paramMin = parseInt(this.relaxin.Address.currentParameters.min);
			var paramMax = parseInt(this.relaxin.Address.currentParameters.max);
			if (paramMin != 'NaN' && paramMax != 'NaN') {
				if ((paramMax - paramMin) == 3) {
					checkMinMax = true;
					min = paramMin;
					max = paramMax;
				}
			}
		}
		if (!checkMinMax) {
			page = 0;
			min = 0;
			max = 0;
		}
		var url = '#';
		for ( name in this.relaxin.Address.currentPathNames){
			url += '/' + this.relaxin.Address.currentPathNames[name];
		}
		var params = '';
		var allParams = this.relaxin.Address.currentParameters;
		for ( param in allParams){
			if (param != 'location' && param != 'page' && param != 'min' && param != 'max' && param != 'order')
				params += param + '=' + allParams[param] + '&';
		}
		if (params != '') url += ('?' + params );
		
		
		// check cache
		if (loadPage.load != null && loadPage.load == url) {
			if (this.relaxin.Address.currentParameters.page != null) {
				var paramPage = parseInt(this.relaxin.Address.currentParameters.page);
				if (paramPage != 'NaN')  {
					if (paramPage >= 0 && paramPage < loadPage.count / objectsPerPage) {
						page = paramPage;
					}
				} else
					pageAdress += '&page=0';
			} else
				pageAdress += '&page=0';
			drawSearchedContent({ count: loadPage.count });
			jQuery('.relaxinResults .relaxinResultsobjects').css('height', loadPage.height).css('background-image', 'url("images/animation.gif")');
				criterion.perpage = objectsPerPage;
				criterion.offset = 0 + (page * objectsPerPage);
				if (this.relaxin.Address.currentPathNames.length > 1)
					criterion.location = this.relaxin.Address.currentPathNames[this.relaxin.Address.currentPathNames.length - 1];
				this.relaxin.Remote.setSearchCriterion({
					data: criterion
				}, function(event){
			});
			this.relaxin.Remote.searchObjects({ data: criterion}, 
				function(event){
					var relaxin = RelaxinInstanceManager.getInstance(event.instance);
					if (event.result == 'ok') 
						var countTmp = event.data.length;
						height = 216;
						if (countTmp > 6 && countTmp <= 12) {
							height = 216 * 2;
						}
						else 
							if (countTmp > 12) {
								height = 216 * 3;
							}
						jQuery('.relaxinResults .relaxinResultsobjects').animate({
							height: height
						}, 'normal');
						jQuery('.relaxinResults .relaxinResultsobjects').css('background-image', 'none');
						drawSearchedObjects({ result: 'ok', data: event.data, count:loadPage.count });
						relaxin.Address.setState('loadPage', { load: url, page: page, count: loadPage.count, licznik: '', height: height });
						relaxin.Interface.fitMap(relaxin.Interface.Map.mapObject);
				});
		}
		else {
			if (this.relaxin.Address.currentPathNames.length > 1)
				criterion.location = this.relaxin.Address.currentPathNames[this.relaxin.Address.currentPathNames.length - 1];
			this.relaxin.Remote.setSearchCriterion({
				data: criterion
			}, function(event){
			});
			this.relaxin.Remote.searchObjCount({
				data: criterion
			}, function(event){
				var relaxin = RelaxinInstanceManager.getInstance(event.instance);
				var count = event.data;
				drawSearchedContent({ count: count });
				// get page
				if (relaxin.Address.currentParameters.page != null) {
				var paramPage = parseInt(relaxin.Address.currentParameters.page);
				
				if (paramPage != 'NaN')  {
					if (paramPage >= 0 && paramPage < count / objectsPerPage) {
						page = paramPage;
					}
					} else pageAdress += '&page=0';
				} else pageAdress += '&page=0';
				
				criterion.perpage = objectsPerPage;
				criterion.offset = 0 + (page * objectsPerPage);
				relaxin.Remote.searchObjects({
					data: criterion
				}, function(event){
					if (event.result == 'ok') {
						var relaxin = RelaxinInstanceManager.getInstance(event.instance);
						loadPage = relaxin.Address.getState('loadPage');
						var height = 0;
						//if (loadPage.load == null) {
							
							//jQuery('.relaxinResults .relaxinResultsobjects').css('height', loadPage.height).css('background-image', 'url("images/animation.gif")');
							drawSearchedObjects({
								result: 'ok',
								data: event.data,
								count: count
							});
							height = 216;
							countTmp = event.data.length; 
							if (countTmp > 6 && countTmp <= 12) {
								height = 216 * 2;
							}
							else 
								if (countTmp > 12) {
									height = 216 * 3;
								}
							
							//jQuery('.relaxinResults .relaxinResultsobjects').css('background-image', 'none');
							relaxin.Address.setState('loadPage', { load: url, page: page, count: count, licznik: '', height: height });	
					}
					else {
						var relaxin = RelaxinInstanceManager.getInstance(event.instance);
//						relaxin.console("Data: ", event);
						data = {
							count: 0,
							licznikTop: '',
							licznikBottom: '',
							objects: '<p class="relaxin-notice">' + event.data + '</p>',
							licznik: ''
						}
						relaxin.Interface.fillBaseTagWithHtml('ObjectResults', relaxin.Interface.getTemplate('Results', data, 'item'));
					}
				});
			});
		}
		
	}
}
RelaxinEngine.prototype.Interface.htmlTemplates.embedResults = {
		item: '\
			<div class="%_CLASS_%ToolBar upper">\
				<span class="alphaCover"></span>\
				<div class="content">\
					%licznikTop%\
					<div>\
						<span class="foundInfo">Znaleziono <strong>%count%</strong> miejsc</span><label>Sortowanie wg</label><div class="inputBg"><select class="relaxinChangeOrder"><option value="%orderprice%" title="Sortowanie po cenie">Ceny</option><option value="%orderrank%" title="Sortowanie po ocenie">Oceny</option><option value="%orderdistance%" title="Sortowanie po odległości">Odległość od zadanego miejsca</option></select></div><div class="inputBg"><input type="button" class="relaxinMapShowFound" value="Pokaż znalezione" /></div><!-- <span> <a href="%orderprice%" title="Sortowanie po cenie">Ceny</a><a href="%orderrank%" title="Sortowanie po ocenie">Oceny</a><a href="%orderdistance%" title="Sortowanie po odległości">Odległośc od zadanego miejsca</a></span> -->\
					</div>\
				</div>\
			</div>\
			<div class="%_CLASS_%oferty">\
				<div class="%_CLASS_% content">\
					<div class="relaxinObjAround">\
						<div class="%_CLASS_%objects">%objects%</div>\
						<div class="relaxinCleared"></div>\
					</div>\
				</div>\
			</div>',
	licznik:'<div class="licznikPlace relaxinLicznikPlace relaxinLicznikPlace%res%">\
				<ul class="relaxinLicznik licznik">\
					<li class="relaxinLicznikPrevR"><a title="Poprzedenie wyniki"></a></li>\
					<!--<li class="relaxinLicznikViewA"><a title="Widok szczegółowy"></a></li>\
					<li class="ViewB"><a href="" title="Widok ogólny"></a></li>-->\
					%item%\
					<li class="relaxinLicznikNextR"><a title="Następne wyniki"></a></li>\
				</ul>\
			</div>',
	licznik_item: '<li id="relaxinLicznikL-%number%" class="relaxinLicznikL" style="display: %disp%;"><a href="%link%">%number%</a></li>'
	
}

RelaxinEngine.prototype.Interface.htmlTemplates.embedNoResults = {
		item: '<div class="%_CLASS_%-item relaxinItem">\
			<h4>%description%</h4>\
			</div>'
}

RelaxinEngine.prototype.Interface.Map = {
	mapObject: null,
	markers: [],
	formID: '',
	fitMode: {
		'defaultmode':	1,
		'toSelection':	2,
		'toMarkers':	4,
		'toBounds':		8
		},
	markerTypes: {
		'objectSmall'			:	1,
		'objectMedium'			:	2,
		'objectMediumPromoted'	:	4,
		'objectLarge'			:	8,
		'objectLargePromoted'	:	16
		}
};

RelaxinEngine.prototype.Interface.embedPanel = function(items, params) {
	// draw base tag
	this.drawBaseTag(items, 'Panel');
	
	var panelSwitcher = function(event) {
		var elementClass = event.relaxin.getElementClass('Panel');
		var addressPath = jQuery.address.path();
		var addressQuery = jQuery.address.queryString();
		if (typeof(_gaq) != 'undefined')
			_gaq.push(['_trackPageview', '/' + addressPath + (addressQuery != '' ? '?' + addressQuery : '')]);
//		console.lo('test');
		// no address
		if (event.relaxin.Address.currentPathNames.length <= 0) {
			event.relaxin.Auth.userLogout();
//			event.relaxin.console('empty address');
			event.relaxin.Address.setAddress('#/RelaxinSearch');
			return;

		// there is address
		} else {
			// clear panel
			event.relaxin.Interface.fillBaseTagWithHtml('Panel', '');
			// get menu
			if (!event.relaxin.Auth.isUserLogged()) {
				var menuItems = event.relaxin.Interface.htmlTemplates.embedPanel.notlogged_menu;
			} else {
				var menuItems = event.relaxin.Interface.htmlTemplates.embedPanel.logged_menu;
			}
			// paths
			var menuDivision = event.relaxin.Address.currentPathNames[0];
			var menuItem = event.relaxin.Address.currentPathNames[event.relaxin.Address.currentPathNames.length - 1];
			
//			event.relaxin.console("menuDivision: " , menuDivision);
//			event.relaxin.console("menuItem: ", menuItem);
			if (menuDivision == 'RelaxinResults' || menuDivision == 'RelaxinSearch') 
				menuItem = menuDivision;
			switch (menuItem) {
				case 'RelaxinSearch':
//					event.relaxin.Interface.embedSearch('.' + elementClass);
					break;
				case 'RelaxinResults':
//					event.relaxin.Interface.embedSearch('.' + elementClass);
   					event.relaxin.Interface.embedResults('.' + event.relaxin.getElementClass('Panel'));
//   					RelaxinEngine.prototype.Interface.showMap();
//					event.relaxin.Interface.fillBaseTagWithHtml('Panel', 'Wyniki');
					jQuery('#polecaneObiekty, .mainGraphicPart').hide();
					break;
				case 'RelaxinObject':
//					event.relaxin.Interface.embedSearch('.' + elementClass);
					event.relaxin.Interface.embedObjectRoom('.' + elementClass);
//					RelaxinEngine.prototype.Interface.showMap();
					jQuery('#polecaneObiekty, .mainGraphicPart').hide();
					break;
				case 'RelaxinRoom':
//					event.relaxin.Interface.embedSearch('.' + elementClass);
					event.relaxin.Interface.embedObjectRoom('.' + elementClass);
//					RelaxinEngine.prototype.Interface.showMap();
					jQuery('#polecaneObiekty, .mainGraphicPart').hide();
					break;
				case 'Compare':
					event.relaxin.Interface.embedCompareCurrent('.' + elementClass);
					jQuery('#polecaneObiekty, .mainGraphicPart').hide();
					break;

			}
		}
	}
	this.relaxin.Events.addListener('addressChanged', panelSwitcher);
}

RelaxinEngine.prototype.Interface.htmlTemplates.embedPanel = {
	controls: '<div class="relaxinMapControls %_CLASS_%-controls"><h2>Gdzie chcesz jechać?</h2></div>',
	howtouse_start: '\
	<div class="relaxinMapHowToUse %_CLASS_%-howtouse">\
		<h2>Jak korzystać z mapy?</h2>\
			<ul class="%_CLASS_%-lista">',
	howtouse_end: '</ul></div>',
	howtouse_item: '<li>\
						<span class="%_CLASS_%-howtouse-span" >%head%</span>\
						<p class="%_CLASS_%-howtouse-p">%body%</p>\
					</li>',
	map: '<div class="relaxinMap %_CLASS_%-map"></div>',
	menu: {
		'RelaxinSearch':	{parent: '', name: 'Witamy!', params: [], show: false},
		'RelaxinResults':	{parent: '', name: 'Wyniki', params: [], show: false}
	}
}

RelaxinEngine.prototype.Interface.isEmpty = function(ob) {
	for(var i in ob){ return false;}
		return true;
}

RelaxinEngine.prototype.Interface.showMap = function(hideIfEmptySearch) {
	if (hideIfEmptySearch) {
		var location = jQuery('.relaxinSearch input[name=location]').val();
		if (typeof(location) == 'string' && location.length > 0) {
			hideIfEmptySearch = false;
		}
	}		
	if (hideIfEmptySearch) {
//		jQuery('.relaxinSearchMapHolder').hide();
		jQuery('.relaxinSearchMapHolder').removeClass('visible');
	} else {
		jQuery('.relaxinSearchMapHolder').addClass('visible');
//		jQuery('.relaxinSearchMapHolder').show();
		google.maps.event.trigger(this.relaxin.Interface.Map.mapObject, 'resize');
	}
	return hideIfEmptySearch;
//	this.relaxin.Interface.Map
}

RelaxinEngine.prototype.Interface.parseURL = function() {
	if (!this.relaxin.Auth.isUserLogged()) {
		var menuItems = this.htmlTemplates.embedPanel.notlogged_menu;
	} else {
		var menuItems = this.htmlTemplates.embedPanel.logged_menu;
	}
	// paths
	var paths = jQuery.address.pathNames();
	var menuDivision = paths[0];
	var menuItem = this.relaxin.Address.currentPathNames[this.relaxin.Address.currentPathNames.length - 1];
	
//	event.relaxin.console("menuDivision: " , menuDivision);
//	event.relaxin.console("menuItem: ", menuItem);
	if (menuDivision == 'RelaxinResults' || menuDivision == 'RelaxinSearch') 
		menuItem = menuDivision;

	return {
		menuItem: menuItem,
		menuDivision: menuDivision
	};
}

RelaxinEngine.prototype.Interface.fitMap = function(mapObject, fitMode, suggestedBounds) {
	if (mapObject == null)
		mapObject = this.relaxin.Interface.Map.mapObject;
//		mapObject = this.relaxin.Interface.Map.mapObject;
	if (!mapObject)
		reutrn;
	var menu = this.relaxin.Interface.parseURL();
	if (!fitMode || fitMode == this.relaxin.Interface.Map.fitMode.defaultmode) {
		switch (menu.menuItem) {
			case 'RelaxinSearch':
				fitMode = this.relaxin.Interface.Map.fitMode.toBounds;
				break;
			case 'RelaxinResults':
				fitMode = (mapObject.markers.length > 0 ?
						this.relaxin.Interface.Map.fitMode.toMarkers
						: this.relaxin.Interface.Map.fitMode.toBounds);
				break;
			case 'RelaxinCompare':
				fitMode = this.relaxin.Interface.Map.fitMode.toMarkers;
				break;
			case 'RelaxinObject':
				fitMode = this.relaxin.Interface.Map.fitMode.toSelection;
				break;
		}
	}
	switch (fitMode) {
		case this.relaxin.Interface.Map.fitMode.toBounds:
			// zoom to bounds
			if (!suggestedBounds && mapObject.rangeMarker)
				suggestedBounds = mapObject.rangeMarker.get('bounds');
			if (suggestedBounds)
				mapObject.fitBounds(suggestedBounds);
			break;
		case this.relaxin.Interface.Map.fitMode.toMarkers:
			// zoom to markers
			if (mapObject.markers) {
				var bounds = new google.maps.LatLngBounds();
				for (var i = 0; i < mapObject.markers.length; i++) {
					bounds.extend(mapObject.markers[i].getPosition());
				}
				mapObject.fitBounds(bounds);
				var zoom = mapObject.getZoom();
				if (zoom > 16)
					mapObject.setZoom(16);
			}
			break;
		case this.relaxin.Interface.Map.fitMode.toSelection:
			// zoom to selection
			if (suggestedBounds) {
				var bounds = new google.maps.LatLngBounds(suggestedBounds);
				mapObject.fitBounds(bounds);
				var zoom = mapObject.getZoom();
				if (zoom > 16)
					mapObject.setZoom(16);
			}
			break;
	}
}

RelaxinEngine.prototype.Interface.markOnMap = function(mapObject, data) {
	switch (data.markerType) {
		default:
		case this.relaxin.Interface.Map.markerTypes.objectMedium:
			var icon = new google.maps.MarkerImage(
					// url
					'http://www.relaxin.pl//api/api/1.0.0/files/themes/default/images/gm_point_medium_blue.png',
					// size
					new google.maps.Size(34,44),
					// origin
					new google.maps.Point(13,48),
					// anchor
					new google.maps.Point(17,42)
					);
			var shadow = new google.maps.MarkerImage(
					// url
					'http://www.relaxin.pl//api/api/1.0.0/files/themes/default/images/gm_point_medium_shadow.png',
					// size
					new google.maps.Size(45,40),
					// origin
					new google.maps.Point(15,50),
					// anchor
					new google.maps.Point(15,40)
					);
			break;
			
		case this.relaxin.Interface.Map.markerTypes.objectMediumPromoted:
			var icon = new google.maps.MarkerImage(
					// url
					'http://www.relaxin.pl//api/api/1.0.0/files/themes/default/images/gm_point_medium_green_promoted.png',
					// size
					new google.maps.Size(39,49),
					// origin
					new google.maps.Point(13,43),
					// anchor
					new google.maps.Point(17,45)
			);
			var shadow = new google.maps.MarkerImage(
					// url
					'http://www.relaxin.pl//api/api/1.0.0/files/themes/default/images/gm_point_medium_shadow_promoted.png',
					// size
					new google.maps.Size(50,40),
					// origin
					new google.maps.Point(15,50),
					// anchor
					new google.maps.Point(15,40)
			);
			break;
			
		case this.relaxin.Interface.Map.markerTypes.objectLarge:
			var icon = new google.maps.MarkerImage(
					// url
					'http://www.relaxin.pl//api/api/1.0.0/files/themes/default/images/gm_point_large_blue.png',
					// size
					new google.maps.Size(44,54),
					// origin
					new google.maps.Point(8,38),
					// anchor
					new google.maps.Point(22,52)
					);
			var shadow = new google.maps.MarkerImage(
					// url
					'http://www.relaxin.pl//api/api/1.0.0/files/themes/default/images/gm_point_large_shadow.png',
					// size
					new google.maps.Size(60,50),
					// origin
					new google.maps.Point(10,40),
					// anchor
					new google.maps.Point(20,50)
					);
			break;

		case this.relaxin.Interface.Map.markerTypes.objectLargePromoted:
			var icon = new google.maps.MarkerImage(
					// url
					'http://www.relaxin.pl//api/api/1.0.0/files/themes/default/images/gm_point_large_green_promoted.png',
					// size
					new google.maps.Size(54,64),
					// origin
					new google.maps.Point(8,28),
					// anchor
					new google.maps.Point(22,62)
			);
			var shadow = new google.maps.MarkerImage(
					// url
					'http://www.relaxin.pl//api/api/1.0.0/files/themes/default/images/gm_point_large_shadow_promoted.png',
					// size
					new google.maps.Size(70,50),
					// origin
					new google.maps.Point(10,40),
					// anchor
					new google.maps.Point(20,50)
			);
			break;
		
	}
	var marker = new google.maps.Marker({
		position: data.position,
		draggable: false,
		click: data.click,
		map: mapObject,
		icon: icon,
		shadow: shadow,
		title: data.title
	});
	marker.internalID = data.id;
	marker.relaxin = this.relaxin;
	if (typeof(data.click) == 'function')
		google.maps.event.addListener(marker, 'click', data.click);
	mapObject.markers.push(marker);
//	var markerdot = new google.maps.Marker({
//		position: data.position,
//		draggable: false,
//		map: mapObject,
//		title: data.title
//	});
//	mapObject.markers.push(markerdot);
}

RelaxinEngine.prototype.Interface.hideMainPageElements = function(){
	jQuery('.mainGraphicPart, #polecaneObiekty').hide();
}

RelaxinEngine.prototype.Interface.showMainPageElements = function(){
	jQuery('.mainGraphicPart, #polecaneObiekty').show();
}

RelaxinEngine.prototype.Interface.embedSearch = function(items, options) {

	var searchSwitcher = function(event) {
		var elementClass = event.relaxin.getElementClass('Search');
		// no address
		if (event.relaxin.Address.currentPathNames.length <= 0) {
//			event.relaxin.Auth.userLogout();
////			event.relaxin.console('empty address');
//			event.relaxin.Address.setAddress('#/RelaxinSearch');
//			return;

		// there is address
		} else {
			// clear panel
//			event.relaxin.Interface.fillBaseTagWithHtml('Panel', '');
			// get menu
			var menu = event.relaxin.Interface.parseURL();
			switch (menu.menuItem) {
				case 'RelaxinSearch':
					var searchHidden = event.relaxin.Interface.showMap(true);
					if (searchHidden) {
						event.relaxin.Interface.showMainPageElements();
					} else {
						event.relaxin.Interface.hideMainPageElements();
						if (event.relaxin.Interface.Map.mapObject) {
							event.relaxin.Interface.Map.mapObject.clearMarkers();
							event.relaxin.Interface.fitMap(relaxin.Interface.Map.mapObject);
						}
					}
//					event.relaxin.Interface.embedSearch('.' + elementClass);
					break;
				case 'RelaxinResults':
//					event.relaxin.Interface.embedSearch('.' + elementClass);
//   					event.relaxin.Interface.embedResults('.' + event.relaxin.getElementClass('Panel'));
					event.relaxin.Interface.showMap();
					if (event.relaxin.Interface.Map.mapObject && event.relaxin.Interface.Map.markers.length <= 0)
						event.relaxin.Interface.fitMap(relaxin.Interface.Map.mapObject);
//					event.relaxin.Interface.fillBaseTagWithHtml('Panel', 'Wyniki');
					break;
				case 'RelaxinObject':
//					event.relaxin.Interface.embedSearch('.' + elementClass);
//					event.relaxin.Interface.embedObjectRoom('.' + elementClass);
					event.relaxin.Interface.showMap();
					break;
				case 'RelaxinRoom':
//					event.relaxin.Interface.embedSearch('.' + elementClass);
//					event.relaxin.Interface.embedObjectRoom('.' + elementClass);
					event.relaxin.Interface.showMap();
					break;
				case 'Compare':
//					event.relaxin.Interface.embedCompareCurrent('.' + elementClass);
					event.relaxin.Interface.showMap();
					break;

			}
		}
	}
	this.relaxin.Events.addListener('addressChanged', searchSwitcher);
	
	
	// draw base tag
	this.drawBaseTag(items, 'SearchTop');
	this.drawBaseTag(items, 'Search');
	if (this.isInitialized() && jQuery) {
		//this.drawBaseTag('.' + this.relaxin.getElementClass('Search'), 'SearchControls');
		var relaxin = this.relaxin;
//		var state = this.relaxin.Address.getState('embedSearch');
		var defaultLocation = '';
		for (var i = 0; i < this.htmlTemplates.embedSearch.data.fields.length; i++) {
			for (var j in this.htmlTemplates.embedSearch.data.fields[i].fields) {
				if (j == 'location') {
					defaultLocation = this.htmlTemplates.embedSearch.data.fields[i].fields[j].value;
				} else 
				if (j == 'objectfeat'){
					this.htmlTemplates.embedSearch.data.fields[i].fields.objectfeat.options = this.htmlTemplates.embedSearch.objectdetails; 
				} else
				if (j == 'roomfeat'){
					this.htmlTemplates.embedSearch.data.fields[i].fields.roomfeat.groups = this.htmlTemplates.embedSearch.roomdetails; 
				}
			}
		}

		var locationTimeout = radiusTimeout = submitTimeout = null;

		var state = {
				location: '',
				type: '',
				radius: '',
				datefrom: '',
				dateto: '',
				latit: '',
				longit: '',
				objectfeat: '',
				roomfeat: '',
				people: ''
				};
		var path = jQuery.address.pathNames();
		for (property in state) {
			value = jQuery.address.parameter(property);
			switch (property) {
				case 'location':
					if (path.length > 1)
						state[property] = path[1];
					break;
				case 'type':
					if (typeof(value) != 'undefined')
						state[property] = new String(value).split(/\s*,\s*/);
					break;
				default:
					if (typeof(value) != 'undefined')
						state[property] = jQuery.address.parameter(property);
					break;
			}
		}
		this.relaxin.Address.setState('embedSearch', state);
		this.relaxin.console("embedSearch:", this.relaxin.Address.getState('embedSearch'));
		
		var formID = this.formSketcher('Search', this.htmlTemplates.embedSearch.data.fields, this.relaxin.Address.getState('embedSearch'), {}, [], function(formData) {
			if (typeof(options) == 'undefined')
				options = {};
			if (formData.validation && formData.fields.location.value != defaultLocation) {
				if (locationTimeout == null && radiusTimeout == null) {
					var location = formData.fields.location.value;
					var type = formData.fields.type.value;
					var radius = formData.fields.radius.value;
	//				var radius = formData.fields.radiusval.value;
					var datefrom = formData.fields.datefrom.value;
					var dateto = formData.fields.dateto.value;
					var latit = formData.fields.latit.value;
					var longit = formData.fields.longit.value;
					var objectfeat = formData.fields.objectfeat.value;
					var roomfeat = formData.fields.roomfeat.value;
					var people = formData.fields.people.value;
					var baseURL = (typeof(options.baseURL) != 'undefined' ? options.baseURL : '');
					formData.relaxin.Address.setState('loadPage',null);
					formData.relaxin.Address.setState('embedSearch', {location: location, type: type, radius: radius, datefrom: datefrom, dateto: dateto, latit: latit, longit: longit, objectfeat: objectfeat, roomfeat: roomfeat, people: people });
					formData.relaxin.Address.setAddress(baseURL + '#/RelaxinResults/' + location, {type: type, radius: radius, datefrom: datefrom, dateto: dateto, latit: latit, longit: longit,  objectfeat: objectfeat, roomfeat: roomfeat, people: people }, {redirect: (baseURL != '')});
				} else {
					// po najblizszym wywołaniu locatora, zrób submit formularza
					submitTimeout = true;
				}
			}
		});

		if (google && google.maps) {
			
				var distance = function(p1, p2) {
					var R = 6371; // Radius of the earth in m
					var dLat = (p2.lat() - p1.lat()) * Math.PI / 180;
					var dLon = (p2.lng() - p1.lng()) * Math.PI / 180; 
					var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
					Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) * Math.sin(dLon / 2) * Math.sin(dLon / 2);
					var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
					var d = R * c;
					return d.toFixed(1);
				}
				
				var markerer = function(relaxin, mapObject, location, bounds, radius, formID ) {
					if (!location) {
						var location = new google.maps.LatLng(jQuery('.relaxinSearchMapHolder input[name=latit]').val(), jQuery('.relaxinSearchMapHolder input[name=longit]').val());
					}
					if (typeof(radius) == 'object')
						radius = jQuery(radius).val();
					if (mapObject.rangeMarker != null)
						mapObject.rangeMarker.setMap(null);
					mapObject.rangeMarker = new RelaxinEngine.InterfaceWidgets.MapRadius({
						center: location,
						clickable: false,
						map: mapObject,
						radius: radius * 1000,
						strokeWeight: 2,
						strokeOpacity: 0.5,
						strokeColor: '#01a7eb',
						fillOpacity: 0.05,
						fillColor: '#01a7eb'
					});
					google.maps.event.addListener(mapObject.rangeMarker, 'radiuschange', function() {
						jQuery.doTimeout('rangeMarkerRadiusChange', 200, function(rangeMarker) {
							var radius = (rangeMarker.radius / 1000).toFixed(1);
							var radiusObject = jQuery('#' + formID + '-radius input').val(radius);
							if (radius > radiusObject[0].sliderMax) {
								radiusObject[0].sliderMin = 0.1 * radius;
								radiusObject[0].sliderMax = 1.2 * radius;
							}
							if (radiusObject[0].sliderHandle && radiusObject[0].sliderHandle.length > 0)
								radiusObject[0].sliderHandle[0].sliderValue(radius);
						}, this);
					});

					if (bounds == null)
						bounds = mapObject.rangeMarker.get('bounds');
					
					relaxin.Interface.fitMap(mapObject, relaxin.Interface.Map.fitMode.toBounds, bounds);
				
					jQuery('.relaxinSearchMapHolder input[name=latit]').val(location.lat().toFixed(6));
					jQuery('.relaxinSearchMapHolder input[name=longit]').val(location.lng().toFixed(6));
				}
				var locator = function(relaxin, mapObject, formID, object, callback) {
					if (!mapObject)
						return;
					var address = 'Polska';
					if (typeof(object) == 'object' && object != null) {
						object = jQuery(object);
						if (object.length == 0)
							return;
						address = object.val() + ', ' + address;
					}
					if (google && google.maps) {
						var geocoder = new google.maps.Geocoder();
						geocoder.geocode({
							address: address,
							language: 'pl',
							region: 'PL'
						}, function(results, status) {
							results = results[0];
							if (status == 'OK' && results.address_components.length > 0) {
								var bounds = (results.geometry.bounds ? results.geometry.bounds : results.geometry.viewport);
								var radius = distance(bounds.getNorthEast(), bounds.getSouthWest()) / 2;
								markerer(relaxin, mapObject, results.geometry.location, results.geometry.viewport, radius, formID);
								var radiusObject = jQuery('#' + formID + '-radius input').val(radius);
								radiusObject[0].sliderMin = 0.1 * radius;
								radiusObject[0].sliderMax = Math.min(500, 5.0 * radius);
								if (radiusObject[0].sliderHandle && radiusObject[0].sliderHandle.length > 0)
									radiusObject[0].sliderHandle[0].sliderValue(radius);
							}
							if (submitTimeout == true) {
								if (locationTimeout != null) {
									clearTimeout(locationTimeout);
									locationTimeout = null;
								}
								if (locationTimeout != null) {
									clearTimeout(locationTimeout);
									locationTimeout = null;
								}
								submitTimeout = false;
								jQuery('#' + formID + ' .relaxinInput-submit').click();
							}
							if (typeof(callback) == 'function')
								callback();
						});
					}
				}
				var mapHtml = jQuery('.' + this.relaxin.getElementClass('SearchMap'));
				if (mapHtml.length > 0) {
					var mapObject = {};
					var myLatlng = new google.maps.LatLng(-34.397, 150.644);
					var mapOptions = {
						zoom: 3,
						center: myLatlng,
						mapTypeControl: false,
						disableDefaultUI: true,
						navigationControl: true,
					    scaleControl: true,
					    scrollwheel: false,
					    navigationControlOptions: {
							style: google.maps.NavigationControlStyle.SMALL,
							position: google.maps.ControlPosition.LEFT
						},
						scaleControlOptions: {
							position: google.maps.ControlPosition.RIGHT
						},
//						streetViewControl: true,
//							navigationControlOptions: {'position': 'LEFT', 'style': 'TOP_LEFT'},
//							navigationControlOptions: {position: 'LEFT'},
						mapTypeId: google.maps.MapTypeId.ROADMAP
						};
					var mapObject = new google.maps.Map(mapHtml[0], mapOptions);
					this.relaxin.Interface.Map.mapObject = mapObject;
					this.relaxin.Interface.Map.formID = formID;
					mapObject.markers = [];
					mapObject.clearMarkers = function() {
						if (this.markers && this.markers.length > 0) {
							while (this.markers.length > 0) {
								var marker = this.markers.pop();
								marker.setMap(null);
							}
						}
					}
					mapObject.rangeMarker = null;
					var radius = jQuery('#' + formID + '-radius input').val();
					var latit = jQuery('.relaxinSearchMapHolder input[name=latit]').val();
					var longit = jQuery('.relaxinSearchMapHolder input[name=longit]').val();
					google.maps.event.trigger(mapObject, 'resize');
					if (radius != '' && latit != '' && longit != '') {
						markerer(this.relaxin, mapObject, new google.maps.LatLng(latit, longit), null, radius, formID );
					} else {
						locator(this.relaxin, mapObject, formID);
					}
	    		}
				
				function showAdvanceOptions(){
					jQuery('.relaxinSearchAdvanced > div > ol').slideToggle("normal",function(){
						if (jQuery('.relaxinSearchAdvanced > div > ol').is(':visible')) {
							jQuery('.relaxinSearchAdvanced input.advencedButton').attr('value', 'Mniej opcji').addClass('lessOptions');
							jQuery('.relaxinLocationRadius').addClass('advanceVisible');
						}
						else{
							jQuery('.relaxinSearchAdvanced input.advencedButton').attr('value', 'Więcej opcji').removeClass('lessOptions');
							jQuery('.relaxinLocationRadius').removeClass('advanceVisible');
						}
					});
				}
				
				
				//on load
				
				//dodaj diva na zewnatrz
				jQuery('.relaxinSearchAdvanced').append('<div class="content"><div class="cleared"></div></div>').children('ol').prependTo('.relaxinSearchAdvanced .content')
				
				//wyjecie inputa advance na zewnatrz
				jQuery('#' + formID + '-advanced input').prependTo('.relaxinSearchAdvanced .content');
				
				jQuery('#' + formID + '-pricefrom').addClass('lineDown');
				
				if(jQuery('#' + formID + '-location input').val() != '') 
					jQuery('#' + formID + '-location input').removeClass('defaultValue');
					
				jQuery('#' + formID + '-location input').bind('keypress', {relaxin: this.relaxin, formID: formID, locationTimeout: locationTimeout, mapObject: mapObject, defaultLocation: defaultLocation}, function(event) {
					jQuery.doTimeout('locationInputKeypressBlur', 500, locator, event.data.relaxin, event.data.mapObject, event.data.formID, this);
//					if (locationTimeout != null) {
//						clearTimeout(locationTimeout);
//						relaxin = null;
//					}
//					locationTimeout = setTimeout(locator, 500, event.data.relaxin, event.data.mapObject, event.data.formID, this);
					if (jQuery('.relaxinSearchMapHolder').is(':hidden')) {
						event.data.relaxin.Interface.showMap();
						if (jQuery('.relaxinSearchAdvanced > div > ol').is(':hidden')) {
							showAdvanceOptions();
						}
					}
					event.data.relaxin.Interface.hideMainPageElements();
				}).bind('focus', {defaultLocation: defaultLocation}, function(event) {
					if (jQuery(this).val() == event.data.defaultLocation)
						jQuery(this).val('').toggleClass('defaultValue');
					jQuery(this).addClass('relaxinFocus');
				}).bind('blur', {relaxin: this.relaxin, formID: formID, locationTimeout: locationTimeout, mapObject: mapObject, defaultLocation: defaultLocation}, function(event) {
					jQuery.doTimeout('locationInputKeypressBlur');
//					if (locationTimeout != null) {
//						clearTimeout(locationTimeout);
//						locationTimeout = null;
//					}
					locator(event.data.relaxin, event.data.mapObject, formID, this);
					if (jQuery(this).val() == '')
						jQuery(this).val(event.data.defaultLocation).toggleClass('defaultValue');
					jQuery(this).removeClass('relaxinFocus');
				});
				
				jQuery('.relaxinSearchAdvanced input.advencedButton').bind('click', {defaultLocation: defaultLocation}, function(event) {
					showAdvanceOptions();
					//alert('hej hop!');
				});
				
				//shadow on map
				jQuery('.relaxinSearchMapHolder').append('<div class="mapShad"></div>');
				
				/***********************************/
				
				
				jQuery('.relaxinSearchAdvanced .relaxinOptions').hide();
				var typeInputValue = '';
				jQuery('#' + formID + '-type .relaxinOptions li label').each(function(index, Element){
					typeInputValue += jQuery(Element).text() + ', ';
				});
				
				var objectfeatInputValue = '';
				jQuery('#' + formID + '-objectfeat .relaxinOptions li label').each(function(index, Element){
					objectfeatInputValue += jQuery(Element).text() + ', ';
				});
				var roomfeatInputValue = '';
				jQuery('#' + formID + '-roomfeat .relaxinOptions li label').each(function(index, Element){
					roomfeatInputValue += jQuery(Element).text() + ', ';
				});
				
				jQuery('#' + formID + '-type label.hiddenInput').after('<input type="text" class="hiddenInput" readonly="readonly" value="" />').next().attr('value', typeInputValue);
				jQuery('#' + formID + '-type input.hiddenInput').click(function(){
					jQuery('#' + formID + '-type .relaxinOptions').slideToggle();
				});
				jQuery('#' + formID + '-type .relaxinOptions input').change(function(){
					var typeInputChangeValue = '';
					jQuery('#' + formID + '-type .relaxinOptions li input:checked').each(function(index, Element){
						typeInputChangeValue += jQuery(Element).next().text() + ', ';
					});
					jQuery('#' + formID + '-type input.hiddenInput').attr('value', typeInputChangeValue);
				});
				
				jQuery('#' + formID + '-objectfeat label.hiddenInput').after('<input type="text" class="hiddenInput" readonly="readonly" value="" />');//.next().attr('value', objectfeatInputValue);
				jQuery('#' + formID + '-objectfeat input.hiddenInput').click(function(){
					jQuery('#' + formID + '-objectfeat .relaxinOptions').slideToggle();
				});
				jQuery('#' + formID + '-objectfeat .relaxinOptions input').change(function(){
					var objectfeatInputChangeValue = '';
					jQuery('#' + formID + '-objectfeat .relaxinOptions li input:checked').each(function(index, Element){
						objectfeatInputChangeValue += jQuery(Element).next().text() + ', ';
					});
					jQuery('#' + formID + '-objectfeat input.hiddenInput').attr('value', objectfeatInputChangeValue);
				});
				
				jQuery('#' + formID + '-roomfeat label.hiddenInput').after('<input type="text" class="hiddenInput" readonly="readonly" value="" />');//.next().attr('value', roomfeatInputValue);
				jQuery('#' + formID + '-roomfeat input.hiddenInput').click(function(){
					jQuery('#' + formID + '-roomfeat .relaxinOptions').slideToggle();
				});
				jQuery('#' + formID + '-roomfeat .relaxinOptions input').change(function(){
					var roomfeatInputChangeValue = '';
					jQuery('#' + formID + '-roomfeat .relaxinOptions li input:checked').each(function(index, Element){
						roomfeatInputChangeValue += jQuery(Element).next().text() + ', ';
					});
					jQuery('#' + formID + '-roomfeat input.hiddenInput').attr('value', roomfeatInputChangeValue);
				});
				
				/*****************************************/
				
				jQuery('#' + formID + '-radius input').bind('keypress', {relaxin: this.relaxin, formID: formID, locationTimeout: locationTimeout, mapObject: mapObject}, function(event) {
					if (locationTimeout != null) {
						clearTimeout(locationTimeout);
						locationTimeout = null;
					}
					locationTimeout = setTimeout(markerer, 500, event.data.relaxin, event.data.mapObject, null, null, this, event.data.formID);
				});
				jQuery('#' + formID + '-radius input').bind('blur', {relaxin: this.relaxin, formID: formID, locationTimeout: locationTimeout, mapObject: mapObject}, function(event) {
					if (locationTimeout != null) {
						clearTimeout(locationTimeout);
						locationTimeout = null;
					}
//					var state = event.data.relaxin.Address.getState('embedSearch');
					var radiusObject = jQuery(this);
					radiusObject.val(Math.min(500, parseFloat(radiusObject.val()).toFixed(1)));
					if (radiusObject.val() < this.sliderMin)
						this.sliderMin = 0.5 * radiusObject.val();
					if (radiusObject.val() > this.sliderMax)
						this.sliderMax = Math.min(500, 2.0 * radiusObject.val());
					if (radiusObject[0].sliderHandle && this.sliderHandle.length > 0)
						this.sliderHandle[0].sliderValue(radiusObject.val());
					markerer(event.data.relaxin, event.data.mapObject, null, null, radiusObject.val(), event.data.formID );
				});
				jQuery('#' + formID + '-radius .relaxinSliderHandle').bind('dragstop', {relaxin: this.relaxin, formID: formID, locationTimeout: locationTimeout, mapObject: mapObject}, function(event) {
					if (this.sliderInput && this.sliderInput.length > 0) {
						var radiusObject = this.sliderInput;
//						this.sliderMin = 0.1 * radiusObject.val();
//						this.sliderMax = 2 * radiusObject.val();
//						this.sliderValue(radiusObject.val());
						markerer(event.data.relaxin, event.data.mapObject, null, null, radiusObject.val(), event.data.formID);
					}
				});
//			}
      	}
		this.drawBaseTag('.' + this.relaxin.getElementClass('Search'), 'Cleared');
	}
}

RelaxinEngine.prototype.Interface.htmlTemplates.embedSearch = {
	data: {
	"fields": [{
		"cssclass":	"relaxinWide relaxinLocationRadius",
		"fields": {
			"location":	{"type": "text", "name": "Określ region", "needed": true, "value": "", "cssclass": "relaxinSearchLocation defaultValue"}, 
			"radius":	{"type": "slider", "name": "Promień (kM):","needed": true, "cssclass": "relaxinSearchRange"},
			"submit":	{"type": "submit", "value": ""}
		}
	},{
		"cssclass":	"relaxinWide relaxinSearchAdvanced",
		"fields": {
			"advanced":	{"type": "button", "value": "Więcej opcji", "cssclass": "advencedButton"},
			"datefrom":	{"type": "date", "name": "Termin", "value": "", "dateformatshow": "yy-mm-dd"},
			"dateto":	{"type": "date", "name": "-", "value": "", "dateformatshow": "yy-mm-dd", "cssclass": "shortLabel"},
			"people":	{"type": "text", "name": "Ilość osób", "value": "",  "cssclass": "peopleLabel longerLabelPad"},
			"type":		{"type": "options", "name": "Typ obiektu","cssclass": "hiddenInput longerLabelPad", "multiple": true, 
				"options": {
					"hotel": 	"Hotel", 
					"hotelspa": "Hotel SPA", 
					"hostel": 	"Hostel", 
					"yearlonghouse": 	"Domek całoroczny", 
					"holidayhouse": 	"Domek letniskowy", 
					"shelter": 		"Schronisko", 
					"guesthouse": 	"Pensjonat", 
					"farm": 		"Agroturystyka", 
					"apartment": 	"Mieszkanie", 
					"penthouse": 	"Apartament", 
					"accomodation": "Kwatera prywatna"
				}, 
				"needed": true, 
				"checked": "checked"
			},
			"pricefrom":	{"type": "text", "name": "Cena", "value": ""},
			"priceto":		{"type": "text", "name": "-", "value": "", "cssclass": "shortLabel"},
			"objectfeat":	{"type": "options", "name": "Wyposaż. obiektu","cssclass": "hiddenInput longerLabel", "multiple": true, "checked": "checked"},
			"roomfeat":		{"type": "options", "name": "Wyposaż. pokou","cssclass": "hiddenInput longerLabel", "multiple": true, "checked": "checked"}
		}
	},{
		"cssclass":	"relaxinWide relaxinSearchMapHolder",
		"fields": {
			"map":			{"type": "plain", "value": "Mapa", "cssclass": "relaxinSearchMap"},
			"latit":		{"type": "hidden", "name": "Szer", "cssclass": "relaxinSearchMap"},
			"longit":		{"type": "hidden", "name": "Dług", "cssclass": "relaxinSearchMap"},
			"radiusval":	{"type": "hidden", "name": "Prom", "cssclass": "relaxinSearchMap"}
		}
	}]
},
	controls: '<div class="relaxinMapControls %_CLASS_%-controls"><h2>Gdzie chcesz jechać?</h2></div>',
	howtouse_start: '\
	<div class="relaxinMapHowToUse %_CLASS_%-howtouse">\
		<h2>Jak korzystać z mapy?</h2>\
			<ul class="%_CLASS_%-lista">',
	howtouse_end: '</ul></div>',
	howtouse_item: '<li>\
						<span class="%_CLASS_%-howtouse-span" >%head%</span>\
						<p class="%_CLASS_%-howtouse-p">%body%</p>\
					</li>',
	map: '<div class="relaxinMap %_CLASS_%-map"></div>',
	objectdetails: ["altana/wiata","grill","meble ogrodowe","miejsce na ognisko","stajnia z końmi / jazda konna","piaskownica","plac zabaw dla dzieci","ogród","boisko do koszykówki","boisko do siatkówki","kort tenisowy","sala konferencyjna","basen kryty","basen odkryty","sauna","siłownia","stołówka","restauracja","bar nocny","świetlica","sala telewizyjna","kuchnia ogólnodostępna","lodówka ogólnodostępna","łazienka ogólnodostępna","pralnia","przechowalnia rowerów","przechowalnia sprzętu narciarskiego","przechowalnie sprzętu wędkarskiego","taras","kominek","winda","dostęp do Internetu","monitoring / ochrona","garaż","parking niestrzeżony","parking strzeżony","łodzie / kajaki","piłkarzyki","dart / rzutki","stół do bilarda","stół do ping ponga","leżaki","parawany","quady","skutery","rowery","sanki"],
	roomdetails: [
 	{"label"	: "Meble", 			       "options" : ["łóżko jednoosobowe", "łóżko dwuosobowe", "kanapa", "stolik", "stół z krzesłami", "lampka nocna"]},
 	{"label"	: "Aneks kuchenny",        "options" : ["czajnik elektryczny", "lodówka", "kuchenka mikrofalowa", "zlewozmywak", "naczynia kuchenne", "naczynia stołowe", "szklanki", "noże do krojenia", "ekspres do kawy", "piekarnik", "kuchnia gazowa / elektryczna", "zmywarka", "minibarek"]},
 	{"label"	: "Węzeł sanitarny",	   "options" : ["łazienka", "kabina prysznicowa", "wanna", "wanna z hydromasażem", "umywalka", "toaleta", "bidet", "pralka", "suszarka do włosów", "żelazko", "deska do prasowania", "ręczniki"]},
 	{"label" 	: "Media",				   "options" : ["internet", "telewizor kineskopowy", "telewizor lcd", "radio", "odtwarzacz DVD", "telefon stacjonarny"]},
 	{"label" 	: "Wyposażenie dodatkowe", "options" : ["balkon", "klimatyzacja", "garderoba", "stolik i krzesła na tarasie", "suszarka balkonowa", "łóżeczko dziecięce", "zabawki dla dzieci", "sprzęt plażowy (maty, parawany, leżaki, koce)"] }
]

}

RelaxinEngine.prototype.Interface.embedMiniSearch = function(items, options) {
	this.drawBaseTag(items, 'MiniSearch');
//	if (console) {
//	}
	if (this.isInitialized() && jQuery) {
		var formID = this.formSketcher('MiniSearch', this.htmlTemplates.embedMiniSearch.data.fields, this.relaxin.Address.getState('embedSearch'), {}, [], function(formData) {
			var address = 'Polska';
			if (formData.fields.location.value.length == 0)
				return;
			address = formData.fields.location.value + ', ' + address;
			if (GBrowserIsCompatible && GMap2 && GClientGeocoder) {
				var geocoder = new GClientGeocoder();
				geocoder.getLocations(address, function(locationgeocoded) {
					var redirecturl = '';
					if (locationgeocoded && locationgeocoded.Placemark && locationgeocoded.Placemark.length > 0) {
						locationgeocoded = locationgeocoded.Placemark[0];
						var point = new GLatLng(locationgeocoded.Point.coordinates[1], locationgeocoded.Point.coordinates[0]);
						var cornerNE = new GLatLng(locationgeocoded.ExtendedData.LatLonBox.north, locationgeocoded.ExtendedData.LatLonBox.east);
						var cornerSW = new GLatLng(locationgeocoded.ExtendedData.LatLonBox.south, locationgeocoded.ExtendedData.LatLonBox.west);
						var radius = (cornerNE.distanceFrom(cornerSW) / 4000).toFixed(1);
						var location = formData.fields.location.value;
						var type = formData.fields.type.value;
						var datefrom = formData.fields.datefrom.value;
						var dateto = formData.fields.dateto.value;
						var latit = point.lat().toFixed(6);
						var longit = point.lng().toFixed(6);
						formData.relaxin.Address.setState('loadPage', null);
						formData.relaxin.Address.setState('embedSearch', {location: location, type: type, radius: radius, datefrom: datefrom, dateto: dateto, latit: latit, longit: longit });
						switch (formData.submit) {
							case 'more':
								alert('121');
//								formData.relaxin.Address.setAddress((options.searchurl ? options.searchurl + '/' : '') + '#/RelaxinSearch', {}, {redirect: (options.searchurl), restorestate: true});
								formData.relaxin.Address.setAddress((options.searchurl ? options.searchurl + '/' : '') + '#/RelaxinSearch/' + location, {type: type, radius: radius, datefrom: datefrom, dateto: dateto, latit: latit, longit: longit }, {redirect: (options.searchurl), restorestate: true});
								break;
							default:
								alert('122');
								formData.relaxin.Address.setAddress((options.searchurl ? options.searchurl + '/' : '') + '#/RelaxinResults/' + location, {type: type, radius: radius, datefrom: datefrom, dateto: dateto, latit: latit, longit: longit }, {redirect: (options.searchurl), restorestate: true});
								break;
						}
					}
				});
			}
		});
	}
}

RelaxinEngine.prototype.Interface.htmlTemplates.embedMiniSearch = {
	data: {
	"fields": [{
		"cssclass":	"relaxinLocationBox",
		"fields": {
			"location"	: {"type": "text", "name": "Szukaj miejsc w", "needed": true, "value": "", "cssclass": "relaxinSearchLocation defaultValue"} 
		}
	},{
		"cssclass":	"relaxinTwoColumn",
		"fields": {
			"datefrom":	{"type": "date", "name": "Rezerwacja od", "value": "", "cssclass": "float", "dateformatshow": "yy-mm-dd"},
			"dateto":	{"type": "date", "name": "Rezerwacja do", "value": "", "cssclass": "float", "dateformatshow": "yy-mm-dd"}
		}
	},{
		"cssclass":	"relaxinIE7class",
		"fields": {
			"type":		{"type": "options", "name": "Typ", "multiple": true, 
				"options": {
					"hotel"			: "Hotel", 
					"hotelspa"		: "Hotel SPA", 
					"hostel"		: "Hostel", 
					"yearlonghouse"	: "Domek całoroczny", 
					"holidayhouse"	: "Domek letniskowy", 
					"shelter"		: "Schronisko", 
					"guesthouse"	: "Pensjonat", 
					"farm"			: "Agroturystyka", 
					"apartment"		: "Mieszkanie", 
					"penthouse"		: "Apartament", 
					"accomodation"	: "Kwatera prywatna"
				}, 
				"needed": true, 
				"checked": "checked"
			}
		}
	},{
		"cssclass":	"relaxinWide relaxinSubmitSearch",
		"fields":	{
			"submit"	: {"type": "submit", "value": "Szukaj"},
			"more"		: {"type": "submit", "value": "Więcej..."}
		}
	}]
}
}
RelaxinEngine.prototype.Interface.embedThumbnails = function(items, criterion){
	// draw base tag
	this.drawBaseTag(items, 'Thumbnails');
	if (this.isInitialized() && jQuery) {
		var paramSearch = '';
			for (param in criterion){
				if (param != 'room' && param != 'object' )
					paramSearch += '&'+param+'='+criterion[param];
			}	
//		this.relaxin.console("criterion: "+paramSearch);
		this.relaxin.Remote.searchObjects({data: criterion}, function(event) {
			if (event.result == 'ok') {
				var relaxin = RelaxinInstanceManager.getInstance(event.instance);
				var template = {
	"name":	"Najnowsze",
	"fields":	{
		"list":	{"type": "list", "cssclass": "wide", "list": [],
			"columns": ["name"]
		}
	}
};
				var paths = {
	"photo_temp":		{"path": "http://www.relaxin.pl//api/pub/temp/%photo-id%-%photo-suffix%.jpg"},
	"photo_AddObject":	{"path": "http://www.relaxin.pl//api/pub/upload/%object-id%/img/%photo-id%-%photo-suffix%.jpg"},
	"photo_AddRoom":	{"path": "http://www.relaxin.pl//api/pub/upload/%object-id%/%room-id%/img/%photo-id%-%photo-suffix%.jpg"}
}
;
				relaxin.Interface.htmlTemplates.embedThumbnails
				if (typeof(event.data) == 'object' && event.data.length > 0) {
					var componentHTML = '';
//					relaxin.console("Data: ", event.data[3]);
					var cache = new Array();
					
					//relaxin.Interface.fillBaseTagWithHtml('Thumbnails', componentHTML);
					//componentHTML = '';
					var item = '';
					/*item += relaxin.Interface.getTemplate('Thumbnails',null,'licznikPlace_prev');
					for (var i = 0; i < event.data.length / 6; i++ ){
						item += relaxin.Interface.getTemplate('Thumbnails',{'name'	:	(i+1)},'licznikPlace_item');	
					}
					item += relaxin.Interface.getTemplate('Thumbnails',null,'licznikPlace_next'); 
					data = {
						'item'	:	item
					}*/
//					componentHTML += relaxin.Interface.getTemplate('Thumbnails',data,'licznikPlace');
					
					for (var i = 0; i < event.data.length; i++) {
						for (j = 0; j < event.data[i].room_types.length; j++) {
						data = {
							'idObject'		: event.data[i].id + paramSearch,
							'idRoom'		: event.data[i].room_types[j].id,
							'oname'			: event.data[i].name,
							'name'			: event.data[i].room_types[j].name,
							'city'			: event.data[i].city + ', ' + event.data[i].region,
							'promoted'		: (event.data[i].room_types[j].promoted == 1)? ' promotedItem' : '',
							'price'			: event.data[i].room_types[j].price_avg + ' PLN',
							'pricemin'		: Math.min(event.data[i].room_types[j].price_s1, event.data[i].room_types[j].price_s2, event.data[i].room_types[j].price_s3),
							'pricemax'		: Math.max(event.data[i].room_types[j].price_s1, event.data[i].room_types[j].price_s2, event.data[i].room_types[j].price_s3),
							'path'			: paths.photo_AddRoom.path.replace('%object-id%', event.data[i].id.substr(0, 2) + '/' + event.data[i].id).replace('%room-id%', event.data[i].room_types[j].id).replace('%photo-id%', event.data[i].room_types[j].photo).replace('%photo-suffix%', 'thumb')
						}
						componentHTML += relaxin.Interface.getTemplate('Thumbnails',data,'item');			
						if ( i<3 ) cache[i] = event.data[i];	
						}	
					}
					relaxin.Interface.fillBaseTagWithHtml('Thumbnails', componentHTML);
					
					var relaxinThumb = '#relaxinOcenaMiejsca .relaxinThumbnails-item ';
					jQuery( relaxinThumb ).bind('click',
					function(){
						relaxin.Address.setState('searchCriterion', {criterion:paramSearch,page:0, data: cache, count:event.data.length });
						relaxin.Address.setState('currentPage', {page:0});
					});
					itemsAll = ['#relaxinRoomsCommon','#relaxinRoomsRating','#relaxinRoomsNewest'];
					for(i=0; i<itemsAll.length;i++){
						items = itemsAll[i];
//						relaxin.console('itmes '+itemsAll[i]);
						jQuery(items + ' .relaxinThumbnails .relaxinThumbnails-licznik .relaxinThumbnails-li:first').addClass('selected');
						jQuery(items + ' .relaxinThumbnails .relaxinThumbnails-licznik .relaxinThumbnails-li').bind('click', function(){
							jQuery(this).parent().children('.relaxinThumbnails-li').removeClass('selected');
							jQuery(this).addClass('selected');
						});
						jQuery(items + ' .relaxinThumbnails .relaxinThumbnails-licznik .relaxinThumbnails-li').css('display','none');
						jQuery(items + ' .relaxinThumbnails .relaxinThumbnails-licznik .relaxinThumbnails-li:lt(4)').css('display','block');
						jQuery(items + ' .relaxinThumbnails .relaxinThumbnails-licznik .relaxinLicznikPrev').bind('click', function(){
							if (jQuery(this).parent().children('.relaxinThumbnails-li:first').not('.selected').text() != '') {
								var element = jQuery(this).parent().children('.selected').removeClass('selected').prev();
								jQuery(element).addClass('selected');
								if (jQuery(element).css('display') == 'none') {
									jQuery(element).css('display', 'block');
									jQuery(element).next().next().next().next().css('display', 'none');
								}
							}
						});
						jQuery(items + ' .relaxinThumbnails .relaxinThumbnails-licznik .relaxinLicznikNext').bind('click', function(){
							if (jQuery(this).parent().children('.relaxinThumbnails-li:last').not('.selected').text() != '') {
								var element = jQuery(this).parent().children('.selected').removeClass('selected').next();
								jQuery(element).addClass('selected');
								if (jQuery(element).css('display') == 'none') {
									jQuery(element).css('display', 'block');
									jQuery(element).prev().prev().prev().prev().css('display', 'none');
								}
							}
						});
					}
//					jQuery(".relaxinObject-smallMenu a").css('cursor','pointer').click(
//						function(){
//							room_show(this);
//						}
//					);
					function room_show(a){
//							jQuery("#relaxinOcenaMiejsca .relaxinObject-smallMenu li").removeClass('selected');
							jQuery("#relaxinRoomsNewest, #relaxinRoomsRating, #relaxinRoomsCommon").hide();				
							jQuery(a).parent().addClass('selected');
							jQuery("#relaxinRooms" + jQuery(a).attr('class')).show();
						}
					
					}
					
			}
		});
	}
}
RelaxinEngine.prototype.Interface.htmlTemplates.embedThumbnails = {
		item: '<div class="%_CLASS_%-item relaxinItem%promoted%">\
				<a href="#/RelaxinObject?room=%idRoom%&object=%idObject%" class="relaxinObjectLink-id-%id%">\
					<span class="relaxinItemHovering">\
						<span class="relaxinFotoBg">\
							<span class="recomendedItem"></span>\
							<span class="relaxinFoto" style="background:transparent url(%path%) no-repeat scroll center center"></span>\
						</span>\
						<span class="relaxinItemObjectTitle">%oname%</span>\
						<span class="relaxinItemTitle">%name%</span>\
						<span class="relaxinItemCity">%city%</span>\
						<span class="relaxinItemPrice">od <span class="price">%pricemin%</span> do <span class="price">%pricemax%</span> PLN</span>\
						<span class="relaxinTools">\
							<span class="relaxinTool1"></span>\
							<span class="relaxinTool2 relaxinTool"></span>\
						</span>\
					</span>\
				</a>\
				</div>'/*,
		licznikPlace: '\
		<div class="%_CLASS_%-licznikPlace relaxinLicznikPlace">\
			<ul class="relaxinLicznik %_CLASS_%-licznik">\
			%item%\
			</ul>\
		</div>',
		licznikPlace_item: '\
		<li class="%_CLASS_%-li">\
			<a class="%_CLASS_%-li-a" style="cursor: pointer;" >%name%</a>\
		</li>',
		licznikPlace_prev: '\
		<li class="relaxinLicznikPrev">\
			<a class="%_CLASS_%-li-prev" style="cursor: pointer;" title="Poprzedenie wyniki"></a>\
		</li>',
		licznikPlace_next: '\
		<li class="relaxinLicznikNext">\
			<a class="%_CLASS_%-li-next" style="cursor: pointer;" title="Następne wyniki"></a>\
		</li>\
		'*/
}

RelaxinEngine.prototype.Interface.embedLoginUserInfo = function(items) {
	// draw base tag
	this.drawBaseTag(items, 'UserInfo');
	// skecher
	var sketcher = function(event) {
		jQuery('.'+event.relaxin.getElementClass("UserInfo")+', .'+event.relaxin.getElementClass("Login")).hide();
		if (event.relaxin.Auth.isUserLogged()) {
			var userName = '';
			if (event.relaxin.Auth.userData.firstname || event.relaxin.Auth.userData.surname) {
				if (event.relaxin.Auth.userData.firstname) 
					userName += event.relaxin.Auth.userData.firstname;
				if (event.relaxin.Auth.userData.firstname && event.relaxin.Auth.userData.surname) 
					userName += ' ';
				if (event.relaxin.Auth.userData.surname) 
					userName += event.relaxin.Auth.userData.surname;
			}
			else {
				userName += event.relaxin.Auth.userData.email;
			}
			var componentHTML = event.relaxin.Interface.getTemplate('LoginUserInfo', { name: userName }, 'logged');
			event.relaxin.Interface.fillBaseTagWithHtml('UserInfo', componentHTML);
			jQuery('.'+event.relaxin.getElementClass("UserInfo")).show();
			jQuery('.'+event.relaxin.getElementClass("UserInfo")+' a').click( function(){
				event.relaxin.Auth.userLogout();
			} );
			
		} else {	
			var login = jQuery('.'+event.relaxin.getElementClass("Login"));
		    if (login.length == 0) event.relaxin.Interface.embedLogin(items);
			jQuery('.'+event.relaxin.getElementClass("Login")).show();
		}
		
	}
	
	if (this.relaxin.isInitialized()) 
	{
		sketcher(this.relaxin.Events.createEventHash('relaxinInitialized'));
	}
	else 
	{
		this.relaxin.Events.addListener('relaxinInitialized', sketcher);
		sketcher(this.relaxin.Events.createEventHash('relaxinInitialized'));
	}
	this.relaxin.Events.addListener('userStatusChanged', sketcher);
}

RelaxinEngine.prototype.Interface.htmlTemplates.embedLoginUserInfo = {
	logged		: 'Witaj, <strong>%name%</strong>! (<a style="cursor: pointer;">Wyloguj</a>)',
	notlogged	: ''
}
// Object or Room
RelaxinEngine.prototype.Interface.embedObjectRoom = function(items){
	this.drawBaseTag(items, 'objectView');
	this.drawBaseTag(jQuery('.relaxinobjectView'), 'objectOpis');
	this.drawBaseTag(jQuery('.relaxinobjectView'), 'objectsLista');
	this.drawBaseTag(jQuery('.relaxinobjectView'), 'cleared');
	
	if (this.relaxin.Interface.Map.mapObject)
		this.relaxin.Interface.Map.mapObject.clearMarkers();

	if (this.isInitialized() && jQuery) {
		if (this.relaxin.Address.currentParameters.object) {
			 
		var drawObjectRoom = function(event){
				var relaxin = RelaxinInstanceManager.getInstance(event.instance);
				var componentHTML = '';
				if (event.result == 'ok') {
					relaxin.Address.setState('object', {id:event.data.id, data: event.data });
					var room_type = null;
					if (relaxin.Address.currentParameters.room){
						for (i = 0; i < event.data.room_types.length; i++) {
							if (event.data.room_types[i].id == relaxin.Address.currentParameters.room) {
								room_type = event.data.room_types[i];
								break;
						}}
					}
					var paths = {
	"photo_temp":		{"path": "http://www.relaxin.pl//api/pub/temp/%photo-id%-%photo-suffix%.jpg"},
	"photo_AddObject":	{"path": "http://www.relaxin.pl//api/pub/upload/%object-id%/img/%photo-id%-%photo-suffix%.jpg"},
	"photo_AddRoom":	{"path": "http://www.relaxin.pl//api/pub/upload/%object-id%/%room-id%/img/%photo-id%-%photo-suffix%.jpg"}
}
;
					
					//Object or Room
					if (room_type == null){
						var opinions = '';
						var sumRate = 0.0;
						for (i = 0; i < event.data.opinion.length; i++ ) {
							var response = '';
							if ( event.data.opinion[i].id_owner != 'block' && event.data.opinion[i].date_response.substr(0,10)!='0000-00-00'){
								response += relaxin.Interface.htmlTemplates.embedObject.response.
								replace("%headreop%","Odpowiedź Wynajmującego").
								replace("%bodyreop%"," " + event.data.opinion[i].response_object);
							}
							
							opinions += relaxin.Interface.htmlTemplates.embedObject.opinion.
							replace("%headop%"," " +event.data.opinion[i].date_add).
							replace("%bodyop%"," "+event.data.opinion[i].comment_object).
							replace(/%rate%/gi,parseFloat(event.data.opinion[i].opinion)).
							replace("%response%", response);
							
							sumRate += parseFloat(event.data.opinion[i].opinion);
						}
						if (event.data.opinion.length == 0)
							opinions = '<p>Brak opini dla tego obiektu</p>' 
						
						var avgRate = 0.0;
						if (event.data.opinion.length > 0){
							avgRate = Math.round((sumRate / event.data.opinion.length) *10)/10;
						} 

						
						var objstaff;
						if (event.data.objectdetails != null  && event.data.objectdetails.length > 0) {
							objstaff = "<ul>";
							
							for (var i=0; i<event.data.objectdetails.length; i++) {
								objstaff += "<li>" + event.data.objectdetails[i] + "</li>";
							}
							objstaff += "</ul>";
						} else {
							objstaff = "<p>Właściciel nie dodał jeszcze informacji o wyposażeniu</p>";
						}
						
						var objadress;
						objadress = event.data.postcode + ' ' + event.data.city + '<br />';
						objadress += 'ul. ' + event.data.street + (event.data.app != null ? ' ' + event.data.app : '');
						
						var objroomsprice;
						if (event.data.room_types.length > 1) {
							var minRoomPrice = event.data.room_types[0].dispprice;
							var maxRoomPrice = 0;
							jQuery.each(event.data.room_types, function(index, value){
								Vvalue = parseInt(value.dispprice);
								if(minRoomPrice > Vvalue)
									minRoomPrice = Vvalue;
								if(maxRoomPrice < Vvalue)
									maxRoomPrice = Vvalue;
							});
							objroomsprice = 'od <span class="RXprice">' + minRoomPrice + '</span> do <span class="RXprice">' + maxRoomPrice + '</span> PLN';
						} else if (event.data.room_types.length > 0) {
							objroomsprice = '<span class="RXprice">' + event.data.room_types[0].dispprice + '</span> PLN';
						} else {
							objroomsprice = 'Właściciel nie dodał jeszcze informacji o cenach';
						}
				
						
						data = {
							'name' 			: event.data.name,
							'descr'			: event.data.descr,
							'objstaff'		: objstaff,
							'opinions'		: opinions,
							'avgRate'		: avgRate,
							'objadress'		: objadress,
							'objroomsprice'	: objroomsprice
						}
						
						componentHTML += relaxin.Interface.getTemplate('Object',data,'object_top');
					} else {
						var opinions = '';
						var sumRate = 0.0;
						var index = 0;
						for (i = 0; i < event.data.opinion.length; i++ ) {
							if (relaxin.Address.currentParameters.room == event.data.opinion[i].id_room) {
							
							var response = '';
							if ( event.data.opinion[i].id_owner != 'block' &&  event.data.opinion[i].date_response.substr(0,10) != '0000-00-00'){
								response += relaxin.Interface.htmlTemplates.embedObject.response.
								replace("%headreop%","Odpowiedź Wynajmującego" ).
								replace("%bodyreop%"," "+event.data.opinion[i].response_room);
							}
							
							opinions += relaxin.Interface.htmlTemplates.embedObject.opinion.
							replace("%headop%"," " +event.data.opinion[i].date_add).
							replace("%bodyop%"," "+event.data.opinion[i].comment_room).
							replace(/%rate%/gi,parseFloat(event.data.opinion[i].opinion)).
							replace("%response%", response);
							
							sumRate += parseFloat(event.data.opinion[i].opinion);
							index++;
							}
						}
						if (opinions == '')
							opinions = '<p>Brak opini dla tego pokoju</p>' 
						
						var avgRate = 0.0;
						if (index > 0){
							avgRate = Math.round((sumRate / index) *10)/10;
						}
						
						var roomdetails;
						if (room_type.roomdetails != null && room_type.roomdetails.length > 0) {
							roomdetails = "<ul>";
							
							for (var i=0; i<room_type.roomdetails.length; i++) {
								roomdetails += "<li>" + room_type.roomdetails[i] + "</li>";
							}
							for (var i=0; i<event.data.objectdetails.length; i++) {
								roomdetails += "<li>" + event.data.objectdetails[i] + "</li>";
							}
							roomdetails += "</ul>";
						} else {
							roomdetails = "<p>Właściciel nie dodał jeszcze informacji o wyposażeniu</p>";
						}
						
						var objadress;
						objadress = event.data.postcode + ' ' + event.data.city + '<br />';
						objadress += 'ul. ' + event.data.street + (event.data.app != null ? ' ' + event.data.app : '');
						
						/* CALENDAR */
						
						var numberToMonth 			= new Array("Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień");
						
						function daysInMonth(iMonth, iYear){ //return days in month
							return 32 - new Date(iYear, iMonth, 32).getDate();
						}
						dateTemp = new Date();
//		test				dateTemp.setMonth(dateTemp.getMonth() - 1)
						today = dateTemp.getDate();
						todayMonth = numberToMonth[dateTemp.getMonth()];
						todayYear = dateTemp.getFullYear();
						days = daysInMonth(dateTemp.getMonth(), dateTemp.getFullYear());
						
						dateTemp.setDate(days);
						endDayOfWeek = dateTemp.getDay();
						endDayOfWeek -= 1;
							if(endDayOfWeek == -1)
								endDayOfWeek = 7;
						
						dateTemp.setDate(1);
						startDayOfWeek = dateTemp.getDay();
						startDayOfWeek -= 1;
							if(startDayOfWeek == -1)
								startDayOfWeek = 7;
						
						dateTemp.setHours(3, 0, 0, 0); //3 w nocy dla ominiecia zmiany czasu letni/zimowy
						
						var previousMonth = '';
						if (startDayOfWeek != 0) {								
							var temp = new Date(dateTemp);
							temp.setMonth(dateTemp.getMonth() - 1);
							var end = daysInMonth(temp.getMonth(), temp.getFullYear());
							var i = end - startDayOfWeek;
							for (; i < end; i++) 
								previousMonth += '<td class="otherMonth"><a href="#">' + i + '</a></td>';
						}
						
						var nextMonth = '';
						if (endDayOfWeek != 7) {

							for (i = 1; i <= endDayOfWeek; i++) 
								nextMonth += '<td class="otherMonth"><a href="#">' + i + '</a></td>';
						}
						
						var calendar;
						calendar = '\
						<div class="calendar">\
								<div class="toolbar">\
									<span class="name">' + todayMonth + ' ' + todayYear + 'r.</span>\
									<a title="Wstecz" class="backMonth"></a>\
									<a title="Dalej" class="nextMonth"></a>\
								</div>\
								<table cellpadding="0" cellspacing="0">\
									<thead>\
										<tr>\
											<th><span title="Monday">Po</span></th>\
											<th><span title="Tuesday">Wt</span></th>\
											<th><span title="Wednesday">Śr</span></th>\
											<th><span title="Thursday">Cz</span></th>\
											<th><span title="Friday">Pt</span></th>\
											<th><span title="Saturday">So</span></th>\
											<th><span title="Sunday">Ni</span></th>\
										</tr>\
									</thead>\
									<tbody>\
						';
						for(i=1;i <= days;i++){
							if((i + startDayOfWeek)%7==1)
								calendar += '<tr>';
								
							if(i==1)
								calendar += previousMonth;
									
							calendar +=  '<td><a href="#">' + i + '</a></td>';
							
							if(i==days)
								calendar += nextMonth;
							
							if((i + startDayOfWeek)%7==0)
								calendar += '</tr>';
						}
						
						calendar += '\
									</tbody>\
								</table>\
								<div class="legend">\
									<span class="on"><em>nn</em> - dostępny</span>\
									<span class="off"><em>nn</em> - niedostępny</span>\
								</div>\
							</div>\
						';
						
						/*calendar = '\
						<div class="calendar">\
								<div class="">\
									<a title="Wstecz" class=""></a>\
									<a title="Dalej" class=""></a>\
									<span class="">Październik 2010 r.</span>\
								</div>\
								<table cellpadding="0" cellspacing="0">\
									<thead>\
										<tr>\
											<th><span title="Monday">Po</span></th>\
											<th><span title="Tuesday">Wt</span></th>\
											<th><span title="Wednesday">Śr</span></th>\
											<th><span title="Thursday">Cz</span></th>\
											<th><span title="Friday">Pt</span></th>\
											<th><span title="Saturday">So</span></th>\
											<th><span title="Sunday">Ni</span></th>\
										</tr>\
									</thead>\
									<tbody>\
										<tr>\
											<td class="off otherMonth"><a href="#">26</a></td>\
											<td class="off otherMonth"><a href="#">27</a></td>\
											<td class="off otherMonth"><a href="#">28</a></td>\
											<td class="off otherMonth"><a href="#">29</a></td>\
											<td class="off otherMonth"><a href="#">30</a></td>\
											<td><a href="#">1</a></td>\
											<td><a href="#">2</a></td>\
										</tr>\
										<tr>\
											<td><a href="#">3</a></td>\
											<td><a href="#">4</a></td>\
											<td class="off"><a href="#">5</a></td>\
											<td class="off"><a href="#">6</a></td>\
											<td class="off"><a href="#">7</a></td>\
											<td><a href="#">8</a></td>\
											<td><a href="#">9</a></td>\
										</tr>\
										<tr>\
											<td class="off"><a href="#">10</a></td>\
											<td class="off"><a href="#">11</a></td>\
											<td class="off"><a href="#">12</a></td>\
											<td><a href="#">13</a></td>\
											<td><a href="#">14</a></td>\
											<td><a href="#">15</a></td>\
											<td><a href="#">16</a></td>\
										</tr>\
										<tr>\
											<td><a href="#">17</a></td>\
											<td><a href="#">18</a></td>\
											<td><a href="#">19</a></td>\
											<td><a href="#">20</a></td>\
											<td><a href="#">21</a></td>\
											<td class="today"><a href="#">22</a></td>\
											<td><a href="#">23</a></td>\
										</tr>\
										<tr>\
											<td><a href="#">24</a></td>\
											<td><a href="#">25</a></td>\
											<td><a href="#">26</a></td>\
											<td><a href="#">27</a></td>\
											<td><a href="#">28</a></td>\
											<td><a href="#">29</a></td>\
											<td><a href="#">30</a></td>\
										</tr>\
										<tr>\
											<td><a href="#">31</a></td>\
											<td class="otherMonth"><a href="#">1</a></td>\
											<td class="otherMonth"><a href="#">2</a></td>\
											<td class="otherMonth"><a href="#">3</a></td>\
											<td class="otherMonth"><a href="#">4</a></td>\
											<td class="otherMonth"><a href="#">5</a></td>\
											<td class="off otherMonth"><a href="#">6</a></td>\
										</tr>\
									</tbody>\
								</table>\
								<div class="legend">\
									<span class="on"><em>nn</em> - dostępny</span>\
									<span class="off"><em>nn</em> - niedostępny</span>\
								</div>\
							</div>\
						';*/
						
//						relaxin.console("adres:", relaxin.Address);
//						relaxin.console("embedSearch:", relaxin.Address.getState('embedSearch'));

						var state = relaxin.Address.getState('embedSearch');
							data = {
								'calendar'		: calendar,
								'object'		: event.data.id,
								'fbobject'		: event.data.id,
								'id-object'		: event.data.id+paramSearch,
								'name-object' 	: event.data.name,
								'odescr' 		: event.data.descr,
								'name-room' 	: room_type.name,
								'max_person' 	: room_type.max_person,
								'objadress'		: objadress,
								'price'			: room_type.dispprice,
								'pricemin'		: Math.min(room_type.price_s1, room_type.price_s2, room_type.price_s3),
								'pricemax'		: Math.max(room_type.price_s1, room_type.price_s2, room_type.price_s3),
								'descr'			: room_type.descr,
								'room-details'	: roomdetails,
								'promoted'		: (parseInt(room_type.promoted) == 1)? ' promotedObject' : '',
								'path'			: paths.photo_AddRoom.path.replace('%object-id%',event.data.id.substr(0, 2)+'/'+event.data.id).replace('%room-id%',room_type.id).replace('%photo-id%',room_type.photo).replace('%photo-suffix%','medium'),
								'id_rooms'		: (state.rooms != null) ? (state.rooms + ',' + relaxin.Address.currentParameters.room) : relaxin.Address.currentParameters.room,
								'datefrom'		: (state.datefrom != null) ? state.datefrom : (relaxin.Address.currentParameters.datefrom != null ? relaxin.Address.currentParameters.datefrom : ''),
								'dateto'		: (state.dateto != null) ? state.dateto : (relaxin.Address.currentParameters.dateto != null ? relaxin.Address.currentParameters.dateto : ''),
								'opinions'		: opinions,
								'avgRate'		: avgRate,
								'fbroom'		: relaxin.Address.currentParameters.room,
								'room'			: relaxin.Address.currentParameters.room,
								'addtocompare'	: (event.data.cmp != null) ? ("?cmp=" + event.data.cmp.last + "&op=add") : ('?op=new'),
								'compare'		: (event.data.cmp != null) ? ("?cmp=" + event.data.cmp.last) : (''),
								'people'		: relaxin.Address.currentParameters.people
							}
						relaxin.console('data', data);
						relaxin.Address.setState('room_id', relaxin.Address.currentParameters.room);
						componentHTML += relaxin.Interface.getTemplate('Object',data,'room_top');
					}
					if (event.data.room_types.length > 0) {
						for (i = 0; i < event.data.room_types.length; i++) {
							datarooms = {
								'id_room'	:event.data.room_types[i].id,
								'fbroom'	:event.data.room_types[i].id,
								'room_name'	:event.data.room_types[i].name,
								'id_object'	:event.data.id+paramSearch,
								'fbobject'	:event.data.id,
								'photo' 	:paths.photo_AddRoom.path.replace('%object-id%',event.data.id.substr(0, 2)+'/'+event.data.id).replace('%room-id%',event.data.room_types[i].id).replace('%photo-id%',event.data.room_types[i].photo).replace('%photo-suffix%','thumb')
							}
							componentHTML += relaxin.Interface.getTemplate('Object', datarooms, 'object_room');
						}
					} else {
						componentHTML += '<p>Brak wprowadzonych pokoi</p>';
					}
					componentHTML += relaxin.Interface.getTemplate('Object',data,'object_top_end');
					if (room_type == null) 
						for (i = 0; i < event.data.photos.length; i++) {
							data = {
								'path': paths.photo_AddObject.path.replace('%object-id%', event.data.id.substr(0, 2) + '/' + event.data.id).replace('%photo-id%', event.data.photos[i]).replace('%photo-suffix%', 'thumb')
							}
							componentHTML += relaxin.Interface.getTemplate('Object', data, 'object_foto');
						}
					else {
						for (i = 0; i < room_type.photos.length; i++) {
							data = {
								'path': paths.photo_AddRoom.path.replace('%object-id%', event.data.id.substr(0, 2) + '/' + event.data.id).replace('%room-id%', room_type.id).replace('%photo-id%', room_type.photos[i]).replace('%photo-suffix%', 'medium'),
								'pathBig': paths.photo_AddRoom.path.replace('%object-id%', event.data.id.substr(0, 2) + '/' + event.data.id).replace('%room-id%', room_type.id).replace('%photo-id%', room_type.photos[i]).replace('%photo-suffix%', 'large')
							}
							componentHTML += relaxin.Interface.getTemplate('Object', data, 'object_foto');
						}
						for (i = 0; i < event.data.photos.length; i++) {
							data = {
								'path': paths.photo_AddObject.path.replace('%object-id%', event.data.id.substr(0, 2) + '/' + event.data.id).replace('%photo-id%', event.data.photos[i]).replace('%photo-suffix%', 'medium'),
								'pathBig': paths.photo_AddObject.path.replace('%object-id%', event.data.id.substr(0, 2) + '/' + event.data.id).replace('%photo-id%', event.data.photos[i]).replace('%photo-suffix%', 'large')
							}
							componentHTML += relaxin.Interface.getTemplate('Object', data, 'object_foto');
						}
					}
					componentHTML += relaxin.Interface.getTemplate('Object',null,(room_type == null)?'object_bottom':'room_bottom');
					

					relaxin.Interface.fillBaseTagWithHtml('objectOpis', componentHTML);
					
					if (room_type != null && room_type.reservations == 1) {
						if (room_type.reservonline == 1)
							jQuery('.relaxin-rezerwacje .reservationOffline').remove();
					} else {
						jQuery('.relaxin-rezerwacje .reservation').remove();
						
					}
					
					// facebook reinit
					if (FB) {
						FB.XFBML.parse(document.body);
					}
					
					jQuery('#header, .relaxinSearch').addClass('bigResolution');
					function stepsOnResize(){
						var minWindowWidth = 1212;
						if(!(jQuery('.relaxinobjectView').hasClass('lowResolution')) && parseInt(jQuery('.relaxinPanel').width()) < minWindowWidth){
							jQuery('.relaxinobjectView').addClass('lowResolution');
							jQuery('.relaxin-rezerwacje').before(jQuery('.relaxinObject-secondSide'));
							jQuery('.relaxinObject-secondSide img').each(function(){
								jQuery(this).removeAttr('width').attr('src',jQuery(this).attr('src').replace('medium','thumb'));
							});
							jQuery('#header, .relaxinSearch').removeClass('bigResolution');
						}
						else if(jQuery('.relaxinobjectView').hasClass('lowResolution') && parseInt(jQuery('.relaxinPanel').width()) >= minWindowWidth){
							jQuery('.relaxinobjectView').removeClass('lowResolution');
							jQuery('.relaxinObject-oneSide').after(jQuery('.relaxinObject-secondSide'));
							jQuery('.relaxinObject-secondSide img').each(function(){
								jQuery(this).attr('width','200').attr('src',jQuery(this).attr('src').replace('thumb','medium'));
							});
							jQuery('#header, .relaxinSearch').addClass('bigResolution');
						}
					}
					stepsOnResize();//on load
					jQuery(window).resize(stepsOnResize);
					var elementy = jQuery('.'+ relaxin.getElementClass('Object-galeria') +' .'+ relaxin.getElementClass('Object-galeriaScroll') +' li').length;
					jQuery('a.lightbox').lightBox(); // Select all links with lightbox class
					
					jQuery('.relaxinObject-buttonToCompare').click(function(){
					jQuery('.relaxinObject-toCompareBg').toggleClass('relaxinObject-toCompareBgOn');
					jQuery('.relaxinObject-toCompareLinks').slideToggle('normal');
					});			
					
					var dateCurrent = new Date();
					jQuery.datepicker.setDefaults({
						monthNames: ['styczeń', 'luty', 'marzec', 'kwiecień', 'maj', 'czerwiec', 'lipiec', 'sierpień', 'wrzesień', 'październik', 'listopad', 'grudzień'],
						monthNamesShort: ['sty', 'lut', 'mar', 'kwi', 'maj', 'cze', 'lip', 'sie', 'wrz', 'paź', 'lis', 'gru'],
						dayNamesShort: ['Nie', 'Pon', 'Wto', 'Śro', 'Czw', 'Pią', 'Sob'],
						dayNamesMin: ['Ni', 'Po', 'Wt', 'Śr', 'Cz', 'Pt', 'So'],
						prevText: 'Wstecz',
						nextText: 'Dalej',
						minDate: new Date(dateCurrent.getFullYear(), 0, 1),
						maxDate: new Date(dateCurrent.getFullYear(), 11, 31),
						navigationAsDateFormat: true,
						beforeShow: function(input) {
							jQuery(input).attr('state', 'locked');
						},
						onClose: function(datetext, datepicker) {
							datepicker.input.attr('state', '');
						},
						onSelect: function(datetext, datepicker) {
							datepicker.input.attr('state', '').blur();
						}
					});

					var reservationDateChange = function() {
						var datefrom = jQuery('#datefrom').val();
						var dateto = jQuery('#dateto').val();
						if (datefrom != '' && dateto != '') {
							relaxin.Remote.calcReservation({
								rooms	 : relaxin.Address.currentParameters.room,
								datefrom : datefrom,
								dateto	 : dateto
								}, function (event) {
									if (event.result == 'ok') {
										for (var i = 0; i < event.data.length; i++) {
											var rooms = event.data[i].room_types;
											for (var j=0; j<rooms.length; j++) {
												var price = rooms[j].price;
												break;
											}
										}
										jQuery('.relaxin-rezerwacje .amountToPay').html('<em>' + price + '</em> PLN');
									} else {
										jQuery('.relaxin-rezerwacje .amountToPay').html('');
									}
								});
						}
					}
					jQuery('#datefrom, #dateto')
						.change(reservationDateChange)
						.datepicker({dateFormat: 'yy-mm-dd', onSelect: reservationDateChange});
					
				}
				else {
//					relaxin.console("brak danych ");
				}
			}
			var clearSearchedObjects = function(event){
				var relaxin = RelaxinInstanceManager.getInstance(event.instance);
				var objectsList = '.' + relaxin.getElementClass('Object-listaObiektowContent') + 
					' .'+ relaxin.getElementClass('Object-objects');
				jQuery( objectsList ).html('');
			}
			var drawSearchedObjects = function(event){
				var relaxin = RelaxinInstanceManager.getInstance(event.instance);
				var objectsHtml = '';
				var currentObject = null;
				var selectedOnList = '';
				
				if (relaxin.Interface.Map.mapObject)
					relaxin.Interface.Map.mapObject.clearMarkers();
				if (event.result == 'ok') {
					relaxin.Address.setState('searchCriterion', {criterion:paramSearch, page:currentPage.page, data: event.data, count:countObjects });
//					relaxin.console('currentPage ', currentPage);
					var paths = {
	"photo_temp":		{"path": "http://www.relaxin.pl//api/pub/temp/%photo-id%-%photo-suffix%.jpg"},
	"photo_AddObject":	{"path": "http://www.relaxin.pl//api/pub/upload/%object-id%/img/%photo-id%-%photo-suffix%.jpg"},
	"photo_AddRoom":	{"path": "http://www.relaxin.pl//api/pub/upload/%object-id%/%room-id%/img/%photo-id%-%photo-suffix%.jpg"}
}
;
					for (i = 0; i < event.data.length; i++) {
						var promoted = false;
						for (j = 0; j < event.data[i].room_types.length; j++) {
							data = {
								'id'			: event.data[i].room_types[j].id,
								'fbobject'		: event.data[i].id,
								'idObject'		: event.data[i].id + paramSearch,
								'fbroom'		: event.data[i].room_types[j].id,
								'idRoom'		: event.data[i].room_types[j].id,
								'oname'			: event.data[i].name,
								'name'			: event.data[i].room_types[j].name,
								'description'	: event.data[i].room_types[j].descr,
								'city'			: event.data[i].city + ', ' + event.data[i].region,
								'promoted'		: (event.data[i].room_types[j].promoted == 1)? ' promotedItem' : '',
								'price'			: event.data[i].room_types[j].price_avg + ' PLN',
								'pricemin'		: Math.min(event.data[i].room_types[j].price_s1, event.data[i].room_types[j].price_s2, event.data[i].room_types[j].price_s3),
								'pricemax'		: Math.max(event.data[i].room_types[j].price_s1, event.data[i].room_types[j].price_s2, event.data[i].room_types[j].price_s3),
								'path'			: paths.photo_AddRoom.path.replace('%object-id%', event.data[i].id.substr(0, 2) + '/' + event.data[i].id).replace('%room-id%', event.data[i].room_types[j].id).replace('%photo-id%', event.data[i].room_types[j].photo).replace('%photo-suffix%', 'thumb')
							}
							objectsHtml += relaxin.Interface.getTemplate('Thumbnails', data, 'item');
							if (relaxin.Address.currentParameters.room == event.data[i].room_types[j].id) {
								selectedOnList = event.data[i].room_types[j].id;
							}
							promoted = promoted || event.data[i].room_types[j].promoted;
						}
						if (relaxin.Interface.Map.mapObject) {
							// biezacy obiekt
							var markerType = null;
							if (relaxin.Address.currentParameters.object == event.data[i].id) {
								relaxin.console(promoted);
								markerType = (promoted > 0 ? relaxin.Interface.Map.markerTypes.objectLargePromoted : relaxin.Interface.Map.markerTypes.objectLarge);
								currentObject = event.data[i];
							} else {
								markerType = (promoted > 0 ? relaxin.Interface.Map.markerTypes.objectMediumPromoted : relaxin.Interface.Map.markerTypes.objectMedium);
							}
							relaxin.Interface.markOnMap(relaxin.Interface.Map.mapObject, {
								'id': event.data[i].room_types[0].id,
								click: function(event){
								var link = jQuery('.' + this.relaxin.getInstanceClass() + ' .relaxinObjectLink-id-' + this.internalID);
								if (link.length > 0) 
									document.location.href = link.attr('href');
							},
							markerType: markerType,
							position: new google.maps.LatLng(event.data[i].latit, event.data[i].longit),
							title: event.data[i].name + "; " + event.data[i].city + ', ' + event.data[i].region
							});
						}
					}
				}
				var objectsList = '.' + relaxin.getElementClass('Object-listaObiektowContent') + 
					' .'+ relaxin.getElementClass('Object-objects');
				jQuery( objectsList ).html(objectsHtml);
				jQuery('.relaxinItem a[class*="' + selectedOnList + '"]').parent().addClass('selected');
				if(currentObject != null)
					relaxin.Interface.fitMap(relaxin.Interface.Map.mapObject, null, new google.maps.LatLng(currentObject.latit, currentObject.longit));
			}
			
			var drawSearchedContent = function(event) {
				    var relaxin = RelaxinInstanceManager.getInstance(event.instance);
					var componentHTML = '';
					var objectsHtml = '';
					var page = 0;  
					componentHTML += relaxin.Interface.getTemplate('Object',{count	:countObjects},'objects_top');
					componentHTML += relaxin.Interface.getTemplate('Object',{objects: ''},'objects_objects');
					var licznikElements='';
					currentPage = relaxin.Address.getState('currentPage');
					//licznik
					for (i = 0; i < ((countObjects / 8)) ; i++) {
						var vis = '';
						if (currentPage.index_left != null && currentPage.index_right != null){
							vis = (i >= currentPage.index_left && i <= currentPage.index_right)?'block':'none';
						} else 
							vis = (i > 3)?'none':'block';
						data = {
							number 	: (i+1),
							'disp'	: vis
						}
						licznikElements += relaxin.Interface.getTemplate('Object', data, 'objects_licznik_item');
					}
					
					componentHTML += relaxin.Interface.getTemplate('Object',{list:licznikElements, count: countObjects},'objects_licznik');
					componentHTML += relaxin.Interface.getTemplate('Object',null,'objects_bottom');
					relaxin.Interface.fillBaseTagWithHtml('objectsLista', componentHTML);
					jQuery('.relaxinChangeOrder').bind('change', {relaxin: relaxin}, function(event) {
						document.location.href = jQuery(this).val();
					});
					jQuery('.relaxinMapShowFound').bind('click', {relaxin: relaxin}, function(event) {
						event.data.relaxin.Interface.fitMap(null, event.data.relaxin.Interface.Map.fitMode.toMarkers);
					});
					jQuery('.relaxinMapShowSelected').bind('click', {relaxin: relaxin}, function(event) {
						if (event.data.relaxin.Interface.Map.mapObject && event.data.relaxin.Interface.Map.mapObject.markers) {
							var markers = event.data.relaxin.Interface.Map.mapObject.markers;
							for (var i = 0; i < markers.length; i++) {
								if (markers[i].internalID == event.data.relaxin.Address.currentParameters.room) {
									var bounds = new google.maps.LatLngBounds();
									event.data.relaxin.Interface.fitMap(null, event.data.relaxin.Interface.Map.fitMode.toSelection, markers[i].getPosition());
									break;
								}
							}
						}
					});

					//draw objects
					drawSearchedObjects(event);
					//scripts
					var elementList = '.' + relaxin.getElementClass('Object-listaObiektowContent') 
					   +  ' .' + relaxin.getElementClass('Object-licznikPlace') 
					   +  ' .' + relaxin.getElementClass('Object-licznik');
					var objectsList = '.' + relaxin.getElementClass('Object-listaObiektowContent') + 
					' .'+ relaxin.getElementClass('Object-objects');
					
					var changePage = function(currentPage){							
							criterion.perpage = 8;
							criterion.offset = 8 * (--currentPage.page);
							relaxin.Address.setState('currentPage',currentPage);
							clearSearchedObjects(event);
							var stateSearchCriterion = relaxin.Address.getState('searchCriterion');
							if (stateSearchCriterion == null || stateSearchCriterion.criterion != paramSearch || stateSearchCriterion.page != currentPage.page ) {
								relaxin.Remote.searchObjects({
									data: criterion
								}, drawSearchedObjects);
							} else {
								drawSearchedContent({
									result: 'ok',
									data: stateSearchCriterion.data
					})
							}
					}
					jQuery( objectsList ).hide();
					jQuery( objectsList + ':first' ).show();
					jQuery( elementList + ' .' + relaxin.getElementClass('Object-li')).eq(currentPage.page).addClass('selected');   
					jQuery( elementList + ' .' + relaxin.getElementClass('Object-li') ).css('cursor','pointer').bind('click', 
					function(){
						jQuery( elementList + ' .' + relaxin.getElementClass('Object-li')).removeClass('selected');
						jQuery( this ).addClass('selected');
						currentPage.page = jQuery(this).children('a').text();
						changePage(currentPage);
					})
					var licznikMove = function(page,left){
						var element = elementList + ' .' + relaxin.getElementClass('Object-li');
						var display = jQuery( element ).eq(page).css('display');
						if (display == 'none'){
							currentPage = relaxin.Address.getState('currentPage');
							if (!left){
								currentPage.index_left = page-8;
								currentPage.index_right = page;
							} else {
								currentPage.index_left = page;
								currentPage.index_right = page+8;
							}
							relaxin.Address.setState('currentPage',currentPage);
							jQuery( element ).eq( page ).css('display','block');
							jQuery( element ).eq( (!left)?page-9:page+9 ).css('display','none');
						}
					}
					jQuery( elementList + ' .' + relaxin.getElementClass('LicznikNextR')).bind('click',
					function(){
						var count = relaxin.Address.getState('currentPage');
						if (((count.page+1)*3) < countObjects) {
							var page = (++count.page + 1);
							currentPage.page = page;
							jQuery(elementList + ' .' + relaxin.getElementClass('Object-li')).removeClass('selected');
							jQuery(elementList + ' .' + relaxin.getElementClass('Object-li')).eq(page - 1).addClass('selected');
							licznikMove(page-1);
							changePage(currentPage);
						}
					});
					jQuery( elementList + ' .' + relaxin.getElementClass('LicznikPrevR')).bind('click',
					function(){
						var count = relaxin.Address.getState('currentPage');
						if (count.page > 0) {
							var page = (--count.page + 1);
							currentPage.page = page;
							jQuery(elementList + ' .' + relaxin.getElementClass('Object-li')).removeClass('selected');
							jQuery(elementList + ' .' + relaxin.getElementClass('Object-li')).eq(page - 1).addClass('selected');
							licznikMove(page-1,'left');
							changePage(currentPage);
						}
					});
			}
			// start
			this.relaxin.Interface.fillBaseTagWithHtml('cleared', this.relaxin.Interface.getTemplate('Object',null,'cleared'));
			var criterion = this.relaxin.Address.currentParameters;
			
//			this.relaxin.console('currentParameters :',this.relaxin.Address.currentParameters);
			var paramSearch = '';
			for (param in criterion){
				if (param != 'room' && param != 'object' )
					paramSearch += '&'+param+'='+criterion[param];
			}	
			var state = this.relaxin.Address.getState('object');
			if (state == null || state.id != this.relaxin.Address.currentParameters.object || state.people != this.relaxin.Address.currentParameters.people) {
//				this.relaxin.console('no state object');
				this.relaxin.Remote.getObject({
					'id': 		this.relaxin.Address.currentParameters.object,
					'people': 	this.relaxin.Address.currentParameters.people,
					'checkcmp': true,
					'datefrom': ((this.relaxin.Address.currentParameters.datefrom != null) ? this.relaxin.Address.currentParameters.datefrom : ''),
					'dateto': 	((this.relaxin.Address.currentParameters.dateto != null) ? this.relaxin.Address.currentParameters.dateto : '')
				}, drawObjectRoom);
			}
			else {
//				this.relaxin.console('get state object');
				drawObjectRoom({
					result: 'ok',
					data: state.data
				});
			}
			var countObjects = 0;
			var currentPage = this.relaxin.Address.getState('currentPage');
			if (!currentPage.page){
				currentPage.page = 0;
				this.relaxin.Address.setState('currentPage',currentPage);
//				this.relaxin.console('new currentPage',currentPage);
			} else this.relaxin.console('get currentPage ',currentPage);
			//Search Objects
			//if (paramSearch != '') {
				var stateSearchCriterion = this.relaxin.Address.getState('searchCriterion');
				if (stateSearchCriterion == null || stateSearchCriterion.criterion != paramSearch || stateSearchCriterion.page != currentPage.page) {
					criterion.perpage = null;
					criterion.offset = null;
					criterion.count = null; 
					this.relaxin.Remote.searchObjCount({
						data: criterion
					}, function(event){
						 var relaxin = RelaxinInstanceManager.getInstance(event.instance);
						 countObjects = event.data;
//						 relaxin.console('no state search');
						 criterion.perpage=8;
						 criterion.offset=currentPage.page*8;
//						 relaxin.console('searchObjCount',countObjects);
//						 relaxin.console('criterion',criterion);
						 relaxin.Remote.setSearchCriterion({
							data: criterion
							}, function(event){});
							relaxin.Remote.searchObjects({
							data: criterion
						}, drawSearchedContent);
					});
				} else {
//					this.relaxin.console('get state search');
							countObjects = stateSearchCriterion.count;
							drawSearchedContent({
								result: 'ok',
								data: stateSearchCriterion.data
							})
			
				}
				
				
			} else jQuery('.relaxinObject-ilosc strong').show();
		//}
	}
}

function resvUrl(url){
	var datefrom = document.getElementById('datefrom').value;
	var dateto = document.getElementById('dateto').value;
	if (datefrom == "" || dateto == "")
		return false;
	window.location = url + "&datefrom=" + datefrom + "&dateto=" + dateto;
	return true;
}

RelaxinEngine.prototype.Interface.htmlTemplates.embedObject = {
	object_top :	'<div class="%_CLASS_%-opisObiektu">\
	 				   <div class="%_CLASS_%-opisObiektuContent">\
						<div class="%_CLASS_%-ObjectTop">\
							<div class="%_CLASS_%-ocena">\
								<strong>Ocena</strong>\
								<span class="stars3"></span>\
							</div>\
							<h1>%name%</h1>\
							<div class="cleared"></div>\
						</div>\
					<div class="%_CLASS_%-oneSide">\
						<div class="%_CLASS_%-objectBox"><h3>Adres</h3><div>%objadress%</div></div>\
						<div class="%_CLASS_%-objectBox"><h3>Cena za pokój</h3><div>%objroomsprice%</div></div>\
						<div class="%_CLASS_%-objectBox"><h3>Wyposażenie</h3><div class="roomEquipment">%objstaff%</div></div>\
						<div class="cleared"></div>\
						<div class="%_CLASS_%-opinie">\
							<div class="%_CLASS_%-opinieScroll-desc"><h3>opis Obiektu</h3><div>%descr%</div></div>\
							<div class="%_CLASS_%-opinieScroll-opinion"><h3>Komentarze i opinie</h3><div>%opinions%</div></div>\
							<div class="%_CLASS_%-opinieScroll-vicinity"></div>\
						</div>\
						<div class="%_CLASS_%-galeria %_CLASS_%-longer">\
							<h3>Pokoje w obiekcie:</h3>\
								',
	object_room			:'<span><a href="#/RelaxinObject?room=%id_room%&object=%id_object%"><img width="40" height="40" src="%photo%" alt="" /><span>%room_name%</span></a></span>',
	object_top_end		:'<div class="cleared"></div>\
							</div>\
							<div class="%_CLASS_%-opinieScroll-opinion"><h3>Komentarze i opinie</h3><div><fb:comments xid="Relaxin-object%fbobject%-room%fbroom%" width="470"></fb:comments></div></div>\
						</div>\
					</div>\
					<div class="%_CLASS_%-secondSide">\
						<h3>Galeria</h3>\
						<div>\
							',
		object_foto: '<a href="%pathBig%" class="lightbox"><img src="%path%" width="200" alt="" /></a>',							
		object_bottom: '<div class="cleared"></div>\
						</div>\
					</div>\
					<div class="%_CLASS_%-maps" style="width: 300px; height: 175px; float: left; margin-left: 18px; margin-top: 10px;"></div>\
				  <div class="%_CLASS_%-cleared"></div>\
				</div>\
			</div>\
			',
		objects_top: '<div class="%_CLASS_%-listaObiektow">\
						<div class="%_CLASS_%-listaObiektowContent">',
		objects_objects: '<div class="%_CLASS_%-objects " >%objects%</div>',
		objects_content: ' <a class="%_CLASS_%-linkObject" href="#/RelaxinRoom?id_room=%id_room%&id_object=%id_object%">\
							 <span class="%_CLASS_%-obiekt">\
								<span class="%_CLASS_%-fotoObject" style="background-image: url(%photo%)"></span>\
							 </span>\
							 <span class="%_CLASS_%-nameObject">%nameobject%</span>\
						   </a>', 
		objects_licznik :'\
							\
							<div class="relaxinResultsToolBar upper">\
								<span class="alphaCover"></span>\
								<div class="content">\
									<div class="%_CLASS_%-licznikPlace relaxinLicznikPlace">\
										<ul class="relaxinLicznik %_CLASS_%-licznik">\
											<li class="relaxinLicznikPrevR">\
												<a class="%_CLASS_%-li-prev" style="cursor: pointer;" title="Poprzedenie wyniki"></a>\
											</li>\
											%list%\
											<li class="relaxinLicznikNextR">\
												<a class="%_CLASS_%-li-next" style="cursor: pointer;" title="Następne wyniki"></a>\
											</li>\
										</ul>\
									</div>\
									<div>\
										<span class="foundInfo">Znaleziono <strong>%count%</strong> miejsc</span><label>Sortowanie wg</label><div class="inputBg"><select class="relaxinChangeOrder"><option value="%orderprice%" title="Sortowanie po cenie">Ceny</option><option value="%orderrank%" title="Sortowanie po ocenie">Oceny</option><option value="%orderdistance%" title="Sortowanie po odległości">Odległość od zadanego miejsca</option></select></div><div class="inputBg"><input type="button" class="relaxinMapShowSelected" value="Pokaż na mapie" /></div><div class="inputBg"><input type="button" class="relaxinMapShowFound" value="Pokaż znalezione" /></div><!-- <span> <a href="%orderprice%" title="Sortowanie po cenie">Ceny</a><a href="%orderrank%" title="Sortowanie po ocenie">Oceny</a><a href="%orderdistance%" title="Sortowanie po odległości">Odległośc od zadanego miejsca</a></span> -->\
									</div>\
								</div>\
							</div>',
		objects_licznik_item : '\<li style="display: %disp%;" class="%_CLASS_%-li" ><a>%number%</a></li>',
		objects_bottom: '\
						</div>\
					</div>',
		cleared:	'<div class="cleared"></div>',
		room_top : '<div class="%_CLASS_%-opisObiektu%promoted%">\
	 			<div class="%_CLASS_%-opisObiektuContent">\
						<div class="%_CLASS_%-ObjectTop">\
							<div class="%_CLASS_%-ocena">\
								<strong>Ocena</strong>\
								<span class="stars3"></span>\
							</div>\
							<h1>%name-object%</h1>\
							<h3>%name-room% (%max_person%-osobowy)</h3>\
							<div class="cleared"></div>\
							<span class="recomendedAtach"></span>\
							<a href="#/Compare%addtocompare%" class="addToCompare" title="Dodaj do bieżącego porównanie"><span>Porównaj</span></a>\
							<div class="cleared"></div>\
						</div>\
					<div class="%_CLASS_%-oneSide">\
						<div class="%_CLASS_%-objectBox"><h3>Adres</h3><div>%objadress%</div></div>\
						<div class="%_CLASS_%-objectBox"><h3>Cena za pokój</h3><div>od <span class="price">%pricemin%</span> od <span class="price">%pricemax%</span> PLN</div></div>\
						<div class="%_CLASS_%-objectBox resolutionSensitive"><h3>Wyposażenie</h3><div class="roomEquipment">%room-details%</div></div>\
						<div class="cleared"></div>\
						<div class="relaxin-rezerwacje">\
							<h3>rezerwacja i Dostępność</h3>\
							%calendar%\
							<div class="reservation">\
								<form>\
									<span class="headingSpan">Wybierz termin rezerwacji</span>\
									<div class="%_CLASS_%-opcje">\
										<div class="relaxinObject-dateForm">\
											<div class="%_CLASS_%-semantic">\
												<span><input id="datefrom" type="text" value="%datefrom%" /></span>\
												<label>-</label>\
												<span><input id="dateto" type="text" value="%dateto%" /></span>\
											</div>\
										</div>\
									</div>\
									<div class="infoBox reservationOffline">\
										<span>Ten obiekt możesz zarezerwować bez zobowiązań z Twojej strony. Transakcję dokończ bezpośrednio z Wynajmującym.</span>\
									</div>\
									<div class="infoBox reservationValue">\
										<span class="valueReser">Wartość rezerwacji</span>\
										<span class="amountToPay"></span>\
										<div class="cleared"></div>\
									</div>\
									<a href="http://www.relaxin.pl//api/f9d6ebd06a53752dcb4c0b6cd75516d2/1.200.3/prepareReservation?rooms=%id_rooms%" class="buttonNormal" title="Rezerwacja" onclick="resvUrl(this.href); return false;">Rezerwuj</a>\
								</form>\
							</div>\
						</div>\
						<div class="%_CLASS_%-opinie longerContent">\
							<div class="%_CLASS_%-opinieScroll-desc"><h3>opis Obiektu</h3><div>%odescr%</div></div>\
							<div class="%_CLASS_%-opinieScroll-desc"><h3>opis pokoju</h3><div>%descr%</div></div>\
							<div class="%_CLASS_%-opinieScroll-vicinity"></div>\
							<div class="%_CLASS_%-galeria %_CLASS_%-otherRooms">\
							<h3>Pokoje w obiekcie:</h3>\
								',
		room_bottom: '\
						</div>\
					</div>\
				  <div class="%_CLASS_%-cleared"></div>\
				</div>\
			</div>',
		opinion: '\
			<div class="relaxin-opinia">\
				<div class="relaxin-flash-ocena">\
					<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="40" height="40" id="myFlashContent">\
						<param name="movie" value="http://www.relaxin.pl//api/api/1.0.0/files/themes/default/flash/restin.swf" />\
						<param name="flashvars" value="rateNumber=%rate%" />\
						<param name="wmode" value="transparent" />\
						<!--[if !IE]>-->\
						<object type="application/x-shockwave-flash" data="http://www.relaxin.pl//api/api/1.0.0/files/themes/default/flash/restin.swf" width="40" height="40">\
							<param name="flashvars" value="rateNumber=%rate%" />\
							<param name="wmode" value="transparent" />\
						</object>\
						<!--<![endif]-->\
					</object>\
				</div>\
				<div class="relaxin-opinia-content">\
					<h3>%headop%</h3><p>%bodyop%</p>\
					%response%\
				</div>\
			</div>',
		response: '<h4>%headreop%</h4><p>%bodyreop%</p>'
}

RelaxinEngine.prototype.Interface.embedCompareCurrent = function(items){
	this.drawBaseTag(items, 'compare');
	
	if (this.isInitialized() && jQuery) {
		
		var cmp = null;
		if (this.relaxin.Address.currentParameters.cmp != null)
			cmp = this.relaxin.Address.currentParameters.cmp;
		
		var op = null;
		if (this.relaxin.Address.currentParameters.op != null)
			op = this.relaxin.Address.currentParameters.op;
		
//		room = this.relaxin.Address.currentParameters.room;
		room = this.relaxin.Address.getState('room_id');
		
		//czyszczenie markerow
		if (this.relaxin.Interface.Map.mapObject)
		this.relaxin.Interface.Map.mapObject.clearMarkers();
		
		this.relaxin.Remote.setComparation({room: room, cmp: cmp, op: op}, function(event) {
			var relaxin = RelaxinInstanceManager.getInstance(event.instance);
			var paths = {
	"photo_temp":		{"path": "http://www.relaxin.pl//api/pub/temp/%photo-id%-%photo-suffix%.jpg"},
	"photo_AddObject":	{"path": "http://www.relaxin.pl//api/pub/upload/%object-id%/img/%photo-id%-%photo-suffix%.jpg"},
	"photo_AddRoom":	{"path": "http://www.relaxin.pl//api/pub/upload/%object-id%/%room-id%/img/%photo-id%-%photo-suffix%.jpg"}
}
;
			
			var norooms = function() {
				jQuery('.relaxinCompareContent').css('min-height', '30px');
				jQuery('.relaxinCompareContent').css('text-align', 'center');
				jQuery('.relaxinCompareContent').css('text-valign', 'middle');
				jQuery('.relaxinCompareContent').css('font-weight', 'bold');
				jQuery('.relaxinCompareContent').html("Brak pokoi do porównania");
			}
			
			var nodata = function() {
				var componentHTML = '';
				componentHTML += relaxin.Interface.getTemplate('CompareCurrent', {name: ''}, 'comparePanel');
				componentHTML += relaxin.Interface.htmlTemplates.embedCompareCurrent.topCompare;
				componentHTML += relaxin.Interface.htmlTemplates.embedCompareCurrent.bottomCompare;
				relaxin.Interface.fillBaseTagWithHtml('compare', componentHTML);
				norooms();
			}
			
			if (event.result == 'ok') {
				
				if (typeof(event.data) == 'object' && event.data.length > 0) {
					
					var componentHTML = '';
					var resp = event.data[0];
					var cmpColsWidth = 247;
					var cmpScrollWidth = 0;
					var name = '';
					var cmpdEmpty = false;
//					relaxin.console('event', resp);
					
					var item_mycmp = '';
					for (j = 0; j < resp.mycmp.length; j++) {
						item_data = {
							'compare' 	: resp.mycmp[j].id,
							'cmpname'	: resp.mycmp[j].name
						}
						item_mycmp += relaxin.Interface.getTemplate('CompareCurrent', item_data, 'myComparations');
					}
					
					if (resp.name != null) {
						name = resp.name
					}
					
					componentHTML += relaxin.Interface.getTemplate('CompareCurrent', {name: name, mycmp: item_mycmp}, 'comparePanel');
					componentHTML += relaxin.Interface.htmlTemplates.embedCompareCurrent.topCompare;
					
					
					
					if (resp.cmp_details != null && resp.cmp_details.length > 0) {
						for (i = 0; i < resp.cmp_details.length; i++) {
							
							relaxin.Interface.markOnMap(relaxin.Interface.Map.mapObject, {
								'id': resp.cmp_details[i].room.id,
								click: function(event){
									document.location.href = '#/RelaxinObject?room=' + resp.cmp_details[i].room.id + '&object=' + resp.cmp_details[i].room.object.id;
								},
//								markerType: markerType,
								position: new google.maps.LatLng(resp.cmp_details[i].room.object.latit, resp.cmp_details[i].room.object.longit),
								title: resp.cmp_details[i].room.object.name + "; " + resp.cmp_details[i].room.object.city + ', ' + resp.cmp_details[i].room.object.region
							});
							
							var item_opinions = '';
							for (j = 0; j < resp.cmp_details[i].room.object.opinions.length; j++) {
								item_data = {
									'headop'	: 'Opinia',
									'bodyop'	: resp.cmp_details[i].room.object.opinions[j].comment_object,
									'rate'		: resp.cmp_details[i].room.object.opinions[j].opinion
								}
								item_opinions += relaxin.Interface.getTemplate('CompareCurrent', item_data, 'item_opinion');
							}
							
							var item_about_object = '';
							item_data = {
								'headop'	: 'Opis obiektu',
								'bodyop'	: resp.cmp_details[i].room.object.descr,
								'rate'		: resp.cmp_details[i].room.object.opinion
							}
							item_about_object += relaxin.Interface.getTemplate('CompareCurrent', item_data, 'item_object');
							
							var item_about_room = '';
							item_data = {
								'headop'	: 'Opis pokoju',
								'bodyop'	: resp.cmp_details[i].room.descr,
								'rate'		: resp.cmp_details[i].room.opinion
							}
							item_about_room += relaxin.Interface.getTemplate('CompareCurrent', item_data, 'item_object');
							
							var item_notes = '';
							item_data = {
								'headop'	: 'Notatki',
								'notes'		: resp.cmp_details[i].notes
							}
							item_notes += relaxin.Interface.getTemplate('CompareCurrent', item_data, 'item_notes');
							
							var objstaff;
							if (resp.cmp_details[i].room.roomdetails != null  && resp.cmp_details[i].room.roomdetails.length > 0) {
								objstaff = "<ul>";
								
								for (var j=0; j<resp.cmp_details[i].room.roomdetails.length; j++) {
									objstaff += "<li>" + resp.cmp_details[i].room.roomdetails[j] + "</li>";
								}
								for (var j=0; j<resp.cmp_details[i].room.objectdetails.length; j++) {
									objstaff += "<li>" + resp.cmp_details[i].room.objectdetails[j] + "</li>";
								}
								
								objstaff += "</ul>";
							} else {
								objstaff = "<p>Brak informacji o wyposażeniu</p>";
							}
							
							var item_gallery = '';
							for (j = 0; j < resp.cmp_details[i].room.room_photos.length; j++) {
								item_data = {
									'path': paths.photo_AddRoom.path.replace('%object-id%', resp.cmp_details[i].room.object.id.substr(0, 2) + '/' + resp.cmp_details[i].room.object.id).replace('%room-id%', resp.cmp_details[i].room.id).replace('%photo-id%', resp.cmp_details[i].room.room_photos[j]).replace('%photo-suffix%', 'thumb'),
									'pathBig': paths.photo_AddRoom.path.replace('%object-id%', resp.cmp_details[i].room.object.id.substr(0, 2) + '/' + resp.cmp_details[i].room.object.id).replace('%room-id%', resp.cmp_details[i].room.id).replace('%photo-id%', resp.cmp_details[i].room.room_photos[j]).replace('%photo-suffix%', 'large'),
									'lightboxClass': 'lightbox' + i
								}
								item_gallery += relaxin.Interface.getTemplate('CompareCurrent', item_data, 'gallery_photo');
							}
							for (j = 0; j < resp.cmp_details[i].room.object_photos.length; j++) {
								item_data = {
									'path': paths.photo_AddObject.path.replace('%object-id%', resp.cmp_details[i].room.object.id.substr(0, 2) + '/' + resp.cmp_details[i].room.object.id).replace('%photo-id%', resp.cmp_details[i].room.object_photos[j]).replace('%photo-suffix%', 'thumb'),
									'pathBig': paths.photo_AddObject.path.replace('%object-id%', resp.cmp_details[i].room.object.id.substr(0, 2) + '/' + resp.cmp_details[i].room.object.id).replace('%photo-id%', resp.cmp_details[i].room.object_photos[j]).replace('%photo-suffix%', 'large'),
									'lightboxClass': 'lightbox' + i
								}
								item_gallery += relaxin.Interface.getTemplate('CompareCurrent', item_data, 'gallery_photo');
							}
							
							data = {
								'object'		:resp.cmp_details[i].room.object.id,
								'obj_name'		:resp.cmp_details[i].room.object.name,
								'rate_total'	:resp.cmp_details[i].room.opinion,
								'room'			:resp.cmp_details[i].room.id,
								'room_name'		:resp.cmp_details[i].room.name,
								'room_price'	:resp.cmp_details[i].room.price_avg,
								'promoted'		:(parseInt(resp.cmp_details[i].room.promoted) == 1)? ' promotedObject' : '',
								'objstaff'		:objstaff,
								'obj_address'	:resp.cmp_details[i].room.object.city + ', ' + resp.cmp_details[i].room.object.region,
								'photo' 		:paths.photo_AddRoom.path.replace('%object-id%',resp.cmp_details[i].room.object.id.substr(0, 2)+'/'+ resp.cmp_details[i].room.object.id).replace('%room-id%',resp.cmp_details[i].room.id).replace('%photo-id%',resp.cmp_details[i].room.room_photos[0]).replace('%photo-suffix%','medium'),
								'about_object'	:item_about_object,
								'about_room'	:item_about_room,
								'opinions'		:item_opinions,
								'notes'			:item_notes,
								'gallery'		:item_gallery
							}
							cmpScrollWidth += cmpColsWidth;
							componentHTML += relaxin.Interface.getTemplate('CompareCurrent', data, 'item');
							
							
							
						}
						//zoom na mape
						relaxin.Interface.fitMap(null, relaxin.Interface.Map.fitMode.toMarkers);
					} else {
						cmpdEmpty = true;
					}
					componentHTML += relaxin.Interface.htmlTemplates.embedCompareCurrent.bottomCompare;
					relaxin.Interface.fillBaseTagWithHtml('compare', componentHTML);
					
//					relaxin.console(relaxin.getElementClass('-compareItem'));
					
					if (cmpdEmpty) {
						norooms();
					}
					
					var savecmp = function(cnt) {
						
						var name = jQuery('.relaxin-cmp_name').val();
						data = {
							'name' : name
						}
						relaxin.Remote.setCmp({id: resp.id, data: data}, function(event) {
						});
					}
					var savecmpd = function(cnt) {
						var id = jQuery(cnt).parents('.relaxin-compareItem').attr('id');
						var notes = jQuery('#' + id + ' .relaxin-notes-data').val();
						
						data = {
							'notes' : notes
						}
						
						relaxin.Remote.setCmpDetails({cid: resp.id, rid: id, data: data}, function(event) {
						});
					}
					var delCmpRoom = function(cid, rid) {
						jQuery('#' + rid).remove();
						var scrWidth = jQuery('.relaxinCompareContentScroll').width();
						scrWidth -= 247;
						jQuery('.relaxinCompareContentScroll').width(scrWidth + 'px');
						var size = jQuery('.relaxinCompareContentScroll').children().size();
//						relaxin.console("size", size);
						if (size <= 1) {
							norooms();
						}
						relaxin.Remote.delCmpRoom({cid: cid, rid: rid}, function(event) {
//							if (event.result == 'ok') {
//								if (event.data.url != '') {
//									location.reload(true);
//									relaxin.Address.setAddress(event.data.url);
//								}
//							}
						});
					}
					
					jQuery('.relaxinCompareContentScroll').width(cmpScrollWidth);
					jQuery('.relaxin-microMenuContentScroll > div').hide();
					jQuery('.relaxin-microMenuContentScroll div:first-child').show();
					
					jQuery('.'+ relaxin.getElementClass('-compareItem') + ' .' + relaxin.getElementClass('-microMenu')+' .relaxin-microIcon4').hide();
					jQuery('.'+ relaxin.getElementClass('-compareItem') + ' .' + relaxin.getElementClass('-microMenu')+' .relaxin-microIcon5').css('margin-left', '70px');
					
					jQuery('.'+ relaxin.getElementClass('-compareItem') + ' .' + relaxin.getElementClass('-microMenu')+' span:first-child').addClass('selected');
					
					jQuery('.'+ relaxin.getElementClass('-compareItem') + ' .' + relaxin.getElementClass('-microMenu')+' span').css('cursor','pointer').bind('click',
						function(){
							var id = jQuery(this).parents('.relaxin-compareItem').attr('id');
							
							jQuery('#' + id + ' .' + relaxin.getElementClass('-microMenu')+' span').removeClass('selected');
							jQuery( this ).addClass('selected');
							
							jQuery('#' + id + ' .relaxin-microMenuContentScroll > div').hide();
							
							var name = jQuery(this).attr('class');
							if ( name.search('-microIcon1') > -1) {
								jQuery('#' + id + ' .relaxin-about_object').show();			
							}
							if ( name.search('-microIcon2') > -1) {
								jQuery('#' + id + ' .relaxin-about_room').show();			
							}
							if ( name.search('-microIcon3') > -1) {	
								jQuery('#' + id + ' .relaxin-opinions').show();			
							}
							if ( name.search('-microIcon4') > -1) {
//								jQuery('.relaxin-microMenuContentScroll .relaxin-opinions').show();			
							}
							if ( name.search('-microIcon5') > -1) {
								jQuery('#' + id + ' .relaxin-notes').show();
							}
						});
					
					jQuery('.relaxin-microMenuContentScroll .relaxin-notes .relaxin-notes-button').bind('click', function() {
						savecmpd(this);
					});
					jQuery('.relaxin-microMenuContentScroll .relaxin-notes .relaxin-notes-data').bind('blur', function() {
						savecmpd(this);
					});
					
					jQuery('.relaxin-compareItem .relaxin-comapareClose').bind('click', function() {
						var id = jQuery(this).parents('.relaxin-compareItem').attr('id');
						delCmpRoom(resp.id, id);
					});
					
					jQuery('.relaxinComparePanel .relaxin-cmp_save').bind('click', function() {
						savecmp(this);
					});
					jQuery('.relaxinComparePanel .relaxin-cmp_name').bind('blur', function() {
						savecmp(this);
					});
					
					jQuery('#saveComapre').attr('value', 'Podaj nazwę porównania, np. wyjazd na wakacje').attr('defaultValue', 'Podaj nazwę porównania, np. wyjazd na wakacje');

					jQuery('#saveComapre')
						.bind('focus', function(event){
							if(this.value == this.defaultValue) 
								this.value = '';
						})
						.bind('blur', function(event){
							if(this.value == '') 
								this.value = this.defaultValue;
						});
						
					jQuery('.relaxinObject-buttonToCompare').click(function(){
						jQuery('.relaxinObject-toCompareBg').toggleClass('relaxinObject-toCompareBgOn');
						jQuery('.relaxinObject-toCompareBgTop').toggleClass('relaxinObject-toCompareBgTopOn');
						jQuery('.relaxinObject-toCompareBgBottom').toggleClass('relaxinObject-toCompareBgBottomOn');
						jQuery('.relaxinObject-toCompareLinks').slideToggle('normal');
					});
					jQuery('.relaxinCompareContentScroll').css('width', jQuery('.relaxin-compareItem').length * 251);
					
					var lightboxString = '';
					for (i = 0; i < resp.cmp_details.length; i++) {
						jQuery('a.lightbox' + i).lightBox();
					}
					jQuery('.relaxin-picture').click(function(event) {
						event.preventDefault();
						event.stopPropagation();
						jQuery(this).find('.lightboxGallery a').eq(0).click();
						return false;
					});
					
				} else {
					nodata();
				}
			} else {
				nodata();
			}
		});
	}
}

RelaxinEngine.prototype.Interface.htmlTemplates.embedCompareCurrent = {
	comparePanel : '',
	myComparations : '<a href="#/Compare?cmp=%compare%" title="%cmpname%">%cmpname% &raquo;</a>',
	topCompare : '<div class="alphaCover"></div><div class="relaxincompareContent">',
	gallery_photo: '<a href="%pathBig%" class="%lightboxClass%"><img src="%path%" alt="" /></a>',
	item : '<div class="relaxin-compareItem%promoted%" id="%room%">\
				<div class="relaxin-info">\
					<span class="relaxinItemObjectTitle">%obj_name%</span>\
					<span class="relaxinItemTitle">%room_name%</span>\
					<span class="relaxinItemCity">%obj_address%</span>\
					<span class="relaxinItemPrice">%room_price% PLN</span>\
					<span class="recomendedAtach"></span>\
				</div>\
				<h3>Galeria</h3>\
				<div class="relaxin-picture">\
					<div style="background-image: url(%photo%)"></div>\
					<div class="lightboxGallery">%gallery%</div>\
				</div>\
				<div class="relaxin-about_object">\
					%about_object%\
				</div>\
				<h3>wyposażenie</h3>\
				<div class="relaxinObject-objectBox">\
					<div class="roomEquipment">%objstaff%</div>\
				</div>\
				<div class="compareLinks">\
					<a href="#/RelaxinObject?room=%room%&object=%object%" class="fullDesc addToCompare"><span>Pełny opis</span></a>\
				</div>\
				<div class="compareLinks">\
					<span class="relaxin-comapareClose addToCompare" title="Usuń z porównania"><span>Usuń z porównania</span></span>\
				</div>\
			</div>',
	item_notes: '<div class="relaxin-notes">\
					<div class="relaxin-opinia-content">\
						<h3>%headop%</h3>\
						<textarea class="relaxin-notes-data" name="notes">%notes%</textarea>\
						<input class="relaxin-notes-button" type="button" value="Zapisz">\
					</div>\
				</div>',
	item_object : '\
					<h3>%headop%</h3>\
					<div>%bodyop%</div>',
	item_opinion : '<div class="relaxin-opinia">\
						<div class="relaxin-flash-ocena">\
							<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="20" height="20" id="myFlashContent">\
								<param name="movie" value="http://www.relaxin.pl//api/api/1.0.0/files/themes/default/flash/restin.swf" />\
								<param name="flashvars" value="rateNumber=%rate%" />\
								<param name="wmode" value="transparent" />\
								<object type="application/x-shockwave-flash" data="http://www.relaxin.pl//api/api/1.0.0/files/themes/default/flash/restin.swf" width="20" height="20">\
									<param name="flashvars" value="rateNumber=%rate%" />\
								</object>\
							</object>\
						</div>\
						<div class="relaxin-opinia-content">\
							<h3>%headop%</h3>\
							<p>%bodyop%</p>\
						</div>\
					</div>',
	bottomCompare : '<div class="cleared"></div></div>'
}
RelaxinEngine.prototype.Remote.searchObjects = function( data, callback )
{
	this.queryJSON( 'searchObjects', data, callback );
}

RelaxinEngine.prototype.Remote.searchObjCount = function( data, callback )
{
	this.queryJSON( 'searchObjCount', data, callback );
}

RelaxinEngine.prototype.Remote.setSearchCriterion = function( data, callback ) {
	this.queryJSON( 'setSearchCriterion', data, callback );
}

RelaxinEngine.prototype.Remote.getSearchCriterion = function( data, callback ) {
	this.queryJSON( 'getSearchCriterion', data, callback );
}

RelaxinEngine.prototype.Remote.setComparation = function( data, callback ) {
	this.queryJSON( 'setComparation', data, callback );
}

RelaxinEngine.prototype.Remote.setCmp = function( data, callback ) {
	this.queryJSON( 'setCmp', data, callback );
}

RelaxinEngine.prototype.Remote.setCmpDetails = function( data, callback ) {
	this.queryJSON( 'setCmpDetails', data, callback );
}

RelaxinEngine.prototype.Remote.delCmpRoom = function( data, callback ) {
	this.queryJSON( 'delCmpRoom', data, callback );
}

RelaxinEngine.prototype.Remote.calcReservation = function( data, callback ) {
	this.queryJSON( 'calcReservation', data, callback );
}


