/*
* The script loads places for the selected country
*/

;(function($) {

$.fn.loadCountryPlaces = function(options) {
        //default options
        $.fn.loadCountryPlaces.defaults = {
		url: '/places/jslist/',
		target: '#places',
		defaultOption: '<option value="0">- Create new place -</option>',
		selected: -1
	};

        options = $.extend({}, $.fn.loadCountryPlaces.defaults, options);
        return this.each(function() {
                var $this = $(this);
		var opts = options;
		opts.trigger = this;
		opts.url = options.url+$this.val();
		$(options.target).loadList(options);
        });

};

$.fn.loadList = function(options) {
	var url = __cakeBase+options.url;
	var target = $(this);
	var defaultOption = options.defaultOption;
	var listOptions = '';
	$.getJSON(url,{}, function(data){
		target.html('');
		if ( defaultOption ) {
			target.append(defaultOption);
		}
		var selected = 0;
		$.each(data, function(i,item){
			if ( !selected ) {
				selected = i;
			}
			target.append('<option value="'+i+'">'+item+'</option>');
		});
		if (options.selected >= 0) {
			selected = options.selected;
		}
		target.children('[value="'+selected+'"]').attr('selected','selected');
		target.trigger('change');
	});
};

$.fn.toggleBlock = function(options) {
	var defaults = {
		target: 'tips-regional-add-place-block',
		speed: 'fast',
		show: function($this) {
			return ($this.val()==0);
		}
	};
	var opts = $.extend(defaults, options);
	var target = $(opts.target);
	return this.each(function() {
		var $this = $(this);
		if ( opts.show($this) ) {	
			target.show(opts.speed);
		}
		else {
			target.hide(opts.speed);
		}
	});
};

$.fn.multipleLinks = function(options) {
};

$.fn.formMulti = function(options) {
	var defaults = {
		fields: 'multi-fields',
		list: '#multi-list',
		add: '#multi-add',
		max: 3,
		template: '',
		load: [],
		validateCallback: function(obj, options){
			$("div."+options.fields+":visible input:visible")
			v = $(obj).find('input:first').val(); 
			if ( v == '' || v == 'undefined' ) {
				return false;
			}
			else {
				return true;
			}	
		},
		formatCallback: null
	};
	
	return this.each(function() {
		var opts = $.extend({}, defaults, options);
		
		opts.template = '<div class="'+opts.fields+'">'+$(this).html()+'</div>';
		$(this).addClass(opts.fields);

		__load(opts);

		$(opts.add).click(function() {
			if ( __checkMax(opts) ) {
				__add(opts);
			}
			return false;
		});
	});

	/*
	//load data
	*/
	function __load(options) {
		for(var model in options.load) {
			if ( typeof model == 'string' ) {
				var values = [];
				if ( $.isArray(options.load[model]) ) {
					field = model+'[]';
					if ( $.isArray(options.load[model]) ) {
						for(var i = 0; i < options.load[model].length;i++){
							if ( !$.isArray(values[i]) ) {
								values[i]= [];
							}
							values[i][field] = options.load[model][i];
						}
					}
				}
				else {
					for( var fieldName in options.load[model] ) {
						field = model+'['+fieldName+'][]';
						if ( $.isArray(options.load[model][fieldName]) ) {
							for(var i = 0; i < options.load[model][fieldName].length;i++){
								if ( !$.isArray(values[i]) ) {
									values[i]= [];
								}
								values[i][field] = options.load[model][fieldName][i];
							}
						}
					}
				}
			
				for(var i = (values.length-1); i >= 0; i--) {
					for(var field in values[i]) {
						$("div."+options.fields+":visible [name='"+field+"']:visible").val(values[i][field]);
					}
					__add(options);
				}	
			}
		}
	}

	function __add(options) {
		var $this = $('div.'+options.fields+':visible');
		if(__getCount(options) > options.max) {
			return false;
		}
		if ( $.isFunction(options.validateCallback) ) {
			if ( !options.validateCallback($this, options) ) {
				return false;
			}
		}

		var v;	
		if ( $.isFunction(options.formatCallback) ) {
			v = options.formatCallback(this);
		}
		else {
			v = $this.find('input:first').val();
		}
		if ( v == '' || v == 'undefined' ) {
			return true;	
		}
		$this.hide();
		$this.parent().prepend(options.template);
		if(v != '') {
			$("div"+options.list).append('<div class="multi-list-item"><span>'+v+'</span><a href="#" class="remove">Remove</a></div>').find("a").click(function(){
				$(this).parent().remove();
				$this.remove();
				__checkMax(options);
				return false;
			});
		}
		__checkMax(options);
	}

	function __checkMax(options) {
		if( __getCount(options) > options.max) {
			$('div.'+ options.fields+':visible input').attr('disabled', true);
			return false;
		}
		else {
			$('div.'+ options.fields+':visible input').attr('disabled', false);
			return true;
		}
	}

	function __getCount(options) {
		return $('div.'+ options.fields).size();
	}
}

$.fn.reloadLists = function(data, options) {
	return this.each(function() {
		var opts = $.extend({select: null, defaultValue: '-Select-'}, options || {});
		var obj = this;
		if (typeof data == 'string') {	
			var url = __cakeBase+data;
			$.getJSON(url,{}, function(data){
				loadList(obj, data, opts);
			});
		}
		else {
			loadList(this, data);
		}
	});

	function loadList(obj, data, options) {
		target = $(obj);
		var selectedOption = target.children(':selected').attr('value');
		target.html('');
		if ( options.defaultValue != null ) {
			target.append('<option value="">'+options.defaultValue+'</option>');
		}
		$.each(data, function(i,item){
			if ( options.select == null || options.select == -1 ) {
				options.select = i;
			}
			target.append('<option value="'+i+'">'+item+'</option>');
		});
		if ( options.select != null ) {
			target.children('[value="'+options.select+'"]').attr('selected','selected');
		}
		else {
			target.children('[value="'+selectedOption+'"]').attr('selected','selected');
		}
		target.trigger('change');
	}

/*	return this.each(function(){
		return this;
	}); */
		/*target.html('');
		if ( defaultOption ) {
			target.append(defaultOption);
		}
		var selected = 0;
		$.each(data, function(i,item){
			if ( !selected ) {
				selected = i;
			}
			target.append('<option value="'+i+'">'+item+'</option>');
		});
		if (options.selected >= 0) {
			selected = options.selected;
		}
		target.children('[value="'+selected+'"]').attr('selected','selected');
		target.trigger('change');
	});
	}*/

}

$.fn.multipleInputs = function(options) {
	var defaults = {
		form: '#mult-form',
		trigger: '#multi-add',
		target: '#multi-added',
		format: '{1}',
		limit: 3,
		validateCallback: function(){
			return true;
		}	
	};
	
	return this.each(function() {
		var opts = $.extend({template: '<div class="_template">'+$(this).html()+'</div>'}, defaults, options);
		var template = $(this);
		template.html(opts.template);
		$(opts.trigger).click(function() {
			__add(template, opts);
			return false;
		});

		$(opts.form).submit(function(){
			var empty = true;
			$(template).find("div._template:visible").find(':input').each(function(){
				var val = $(this).val();
				if ( val && val != '' && val != 'undefined' ) {
					empty = false;
				}
			});
			if ( empty || (!empty && __add(template, opts)) ) {
				$("div._template:visible").remove();
				return true;
			}
			else {
				return false;
			}
		});
	
	});

	function __add(template, opts) {
		var fields =  $(template).find("div._template:visible");
		if ( !opts.validateCallback(fields.find(':input')) ) {
			return false;
		}
		fields.hide();
		template.prepend(opts.template);

		if ( __checkLimit(template, opts) ) {
			var item = __formatItem(fields, opts); 
			$(opts.target).append('<div>'+item + '<a href="#" class="remove">Remove</a></div>').find("a").click(function(){
				fields.remove();
				$(this).parent().remove();
				__checkLimit(template, opts);
				return false;
			});
		}
		__checkLimit(template, opts);
		return true;
	}

	function __formatItem(fields, opts) {
		var inputs = $(fields).find(':input');
		var i = 1;
		var format = opts.format;
		inputs.each(function(){
			var val = $(this).val();
			if ( val && val.length > 20) {
				val = val.substr(0, 4) + '...' + val.substr(val.length - 13, 13);
			}
			format = format.replace('{'+i+'}', val);
			i++;
		});
		return format;
	}

	function __checkLimit(template, opts) {
		var fields =  $(template).find("div._template:hidden");
		if ( fields.length >= opts.limit ) {
			$(template).find("div._template:visible").find(':input').attr('disabled', true);
			return true;
		}
		else {
			$(template).find("div._template:visible").find(':input').removeAttr('disabled');
			return true;
		}
	}

}

$.fn.photoInfo = function(options) {
	return this.each(function() {
		var container = $('#container-main');
		$(this).find('div.photo div.info').each(function(){
			$(this).hide();
		});
		$(this).find('div.photo')
		.bind('mouseenter', function(){
			var photoDiv = $(this);
			var photoInfo = $(this).find('.info').html();
			var img = $(this).find('img');
			var offset = img.offset();
			container.append('<div style="display:none" class="photo-popup photo-info">'+photoInfo+'</div>').find('div.photo-popup').css({'position':'absolute', 'top': (offset.top+img.height())+'px', 'left': offset.left+'px', 'z-index':999}).fadeIn().bind('mouseleave', function(){
				photoDiv.trigger('mouseleave');
			});
		})
		.bind('mouseleave', function(e){
			var photoDiv = $(this);
			var photoOffset = photoDiv.offset();
			var popup = container.find('.photo-popup');
			if ( popup && popup != 'undefined' ) {
				offset = popup.offset();
				if ( e.pageX >= offset.left && e.pageX <= (offset.left + popup.width()) && e.pageY >= offset.top && e.pageY <= (offset.top + popup.height()) ) {
				}
				else {
					container.find('.photo-popup').fadeOut().remove();
				}
			}
		});
	});
};


})(jQuery);

(function($){
    /**
     * jQuery delayed event execution.
     */
/*
$(document).ready(function() {
  $('#typeinme').delay({
   delay: 500,
   event: 'keyup',
   fn: function(){
    alert(this.value);
   })
  });
 }

*/
    $.fn.delay = function(options) {
        var timer;
        var delayImpl = function(eventObj) {
            if (timer != null) {
                clearTimeout(timer);
            }
            var newFn = function() {
                options.fn(eventObj);
            };
            timer = setTimeout(newFn, options.delay);
        }
       
        return this.each(function() {
            var obj = $(this);
            obj.bind(options.event, function(eventObj) {
                 delayImpl(eventObj);  
            });
        });
    };

})(jQuery);
