function ngIcon(point,className,zIndex,href,icon,html){
	this.zIndex_=zIndex;
	this.point_=point;
	this.className_=className;
	this.href_=href;
	this.icon_=icon;
	this.html_=html;
};

ngIcon.prototype=new GOverlay();

ngIcon.prototype.initialize=function(m) {
	this.map_=m;
	
	if(this.icon_) {
		var mrk=document.createElement("img"); 
		mrk.src=this.icon_;
		mrk.style.cursor="pointer";
		mrk.style.position="absolute";
		mrk.style.width="15px";
		mrk.style.height="15px";
	}
	else {
		var mrk=document.createElement("a");  
		mrk.className = this.className_;
		mrk.href = this.href_;
	};
	
	if(this.html_) {
	    mrk.innerHTML = this.html_
	}

	mrk.style.zIndex=this.zIndex_;

	this.map_.getPane(G_MAP_MARKER_PANE).appendChild(mrk);
	this.mrk_=mrk;
	
	var self=this;
	
	if(this.icon_) {
		GEvent.addDomListener(this.mrk_, 'click', function(){
			document.location = self.href_;
		});
	};
	
	GEvent.addDomListener(this.mrk_, 'mouseover', function(){
		GEvent.trigger(self,"mouseover");
	});
	
	GEvent.addDomListener(this.mrk_, 'mouseout', function(){
		GEvent.trigger(self,"mouseout");
	});
};

ngIcon.prototype.remove=function() {
	this.mrk_.parentNode.removeChild(this.mrk_);
};

ngIcon.prototype.copy=function() {
	return new ngIcon(this.point_,this.title_,this.className_,this.width_,this.height_);
};

ngIcon.prototype.redraw=function(force) {
    this.redrawWithOffset(force, 0, 0);
};

ngIcon.prototype.redrawWithOffset=function(force, xOffset, yOffset) {
    xOffset = xOffset || 0;
    yOffset = yOffset || 0;
    
	if (!force) return;
	var p=this.map_.fromLatLngToDivPixel(this.point_);
	this.mrk_.style.left=(p.x-7+xOffset) + "px";
	this.mrk_.style.top=(p.y-7+yOffset) + "px";
};

ngIcon.prototype.getIcon=function() {
	return {
		iconAnchor: {
			x:7,
			y:7
		}
	}
};

ngIcon.prototype.getPoint=function(){
	return this.point_;
};eat.area = {
    map: {
        gMap: null,
        resizeTimer: null,
		allowZoomOut: true,
		
		controls: {
			main: null,
			zoomIn: null,
			zoomOut: null
		},
		
        state: {
            ready: false,
            lat: 0,
            lng: 0,
            zoom: 15
        },
        
        bounds: {
            nelat: null,
            swlat: null,
            nelng: null,
            swlng: null
        },
        
        init: function(){
			var self = this;
			
            if (self.state.ready) {
                if (GBrowserIsCompatible()) {
				
                    // read state from cookie
                    var cookie = $.cookie('eatstate');
                    
                    if (cookie) {
						self.state = JSON.parse(cookie);
                    }
                    else {
						$.cookie('eatstate', JSON.stringify(this.state), { expires: 365, path: '/', domain: '.eat.fi' });
                    };
                    
                    // init map
                    this.gMap = new GMap2($("#gmap")[0]);
                    this.gMap.setCenter(new GLatLng(this.state.lat, this.state.lng), this.state.zoom);
					
					// map controls
					this.controls.main = $('#map-controls');
					this.controls.zoomIn = $('#map-controls-zoom-in');
					this.controls.zoomOut = $('#map-controls-zoom-out');
					
                    // save bounds for searches and init markers
                    self.updateBounds();
                    eat.area.markers.init();
                    
                    GEvent.addListener(this.gMap, 'moveend', function() {
                        eat.area.filterBar.updateData();
                        self.updateBounds();
                        eat.area.markers.loadData();
                        self.updateState();
                    });
					
					// set translations
					$('#gmap-zoomalert').html(__('area.map.error.zoom'));
					$('#gmap-loading').html(__('area.map.message.loading'));
					
					// bind controls
					$('#map-controls-up').bind('click', function() { self.navigate('up'); });
					$('#map-controls-down').bind('click', function() { self.navigate('down'); });
					$('#map-controls-left').bind('click', function() { self.navigate('left'); });
					$('#map-controls-right').bind('click', function() { self.navigate('right'); });
					$('#map-controls-zoom-in').bind('click', function() { self.zoom('in'); });
					$('#map-controls-zoom-out').bind('click', function() { self.zoom('out'); });
					
					$(window).bind('resize', function(e) {				
						self.resize();
					});
                    
					$(window).unload(function(e) {
                        GUnload();
                    });
					
					this.renderControls();
					
					this.controls.main.css('top', ($('#location-navi li:visible').length*25)+15);
					this.controls.main.show();
                    
                    // LOG: core.logger.logInfo('Map initialisation ready');
					
					if ("geolocation" in navigator) {
						if (document.location.href.indexOf("showlocation") != -1) {
							eat.area.location.showCurrentLocation();
						}
					}
                    
                    this.ready = true;
                }
                else {
                    alert(__('area.map.error'));
                };
            }
            else {
                window.setTimeout(function(){
                    self.init();
                }, 100);
            };
        },
        
        updateBounds: function() {
            var bounds = this.gMap.getBounds();
            var sw = bounds.getSouthWest();
            var ne = bounds.getNorthEast();
            
            this.bounds = {
                nelat: ne.lat(),
                swlat: sw.lat(),
                nelng: ne.lng(),
                swlng: sw.lng()
            };
            
            // LOG: core.logger.logInfo('Set map bounds: ' + this.bounds);
        },
        
        updateState: function(){
            var center = eat.area.map.gMap.getCenter();
            
			with(this.state) {
				ready = true;
                lat = center.lat();
                lng = center.lng();
                zoom = this.gMap.getZoom();
			};
            
            // LOG: core.logger.logInfo('Set map state', this.state);
            
            $.cookie('eatstate', JSON.stringify(this.state), { expires: 365, path: '/', domain: '.eat.fi' });
        },
		
		renderState: function() {
            this.gMap.setCenter(new GLatLng(this.state.lat, this.state.lng), this.state.zoom);
			
			this.renderControls();
			
            $.cookie('eatstate', JSON.stringify(this.state), { expires: 365, path: '/', domain: '.eat.fi' });
		},
		
		renderControls: function() {
			if(eat.area.markers.shownIds.length>300) {
				this.controls.zoomOut.addClass('disabled');				
				this.allowZoomOut = false;
			}
			else {
				this.controls.zoomOut.removeClass('disabled');
				this.allowZoomOut = true;
			}
		},
		
		resize: function() {
			if(this.resizeTimer) {
				window.clearTimeout(this.resizeTimer);
			};
			
            eat.area.layout.update();
			
			this.resizeTimer = window.setTimeout(function() {
                eat.area.map.updateBounds();
                eat.area.filterBar.updateData();
                eat.area.markers.loadData();
                eat.area.map.updateState();	
			}, 500);
		},
		
		navigate: function(dir) {
			switch(dir) {
				case 'up': this.state.lat = parseFloat(this.state.lat) + 0.01; break;
				case 'down': this.state.lat = parseFloat(this.state.lat) - 0.01; break;
				case 'right': this.state.lng = parseFloat(this.state.lng) + 0.03; break;
				case 'left': this.state.lng = parseFloat(this.state.lng) - 0.03; break;
			}
			
			this.renderState();
		},
		
		zoom: function(dir) {
			var newZoom = null;
			
			if(dir=='in') {
				newZoom = this.state.zoom + 1;
			}
			else if (this.allowZoomOut) {
				newZoom = this.state.zoom - 1;	
			}
			
			if(newZoom) {
				this.state.zoom = newZoom;	
				this.renderState();	
			}
		}
    },
    
    markers: {
    	showMarkers: true,
        data: [],
        shownIds: [],
        tooltip: null,
		tooltipTimer: null,
        icons: [],
        cities: [],
        
        init: function() {
            this.loadData();
            this.initTooltip();
        },
        
        loadData: function() {
			var self = this;
						
            $('#gmap-loading').show();
            
            var vars = {
                ids: this.shownIds.toString(),
                cats: eat.area.filterBar.data.categories.toString(),
                noCat: eat.area.filterBar.data.noCategory,
                feature: eat.area.filterBar.data.feature,
                nelat: eat.area.map.bounds.nelat,
                swlat: eat.area.map.bounds.swlat,
                nelng: eat.area.map.bounds.nelng,
                swlng: eat.area.map.bounds.swlng,
                rating: eat.area.filterBar.data.rating,
                ratingtype: eat.area.filterBar.data.ratingType,
                minprice: eat.area.filterBar.data.minPrice,
                maxprice: eat.area.filterBar.data.maxPrice,
                date: eat.area.filterBar.data.date,
                time: eat.area.filterBar.data.time,
                text: eat.area.filterBar.data.text,
                toplist: (($.browser.msie && parseInt($.browser.version) < 7)?1:0)
            };
			
			$.post(eat.settings.areaUrl, vars, function(data) {
				self.updateMarkers(data);
				
				$('#gmap-loading').hide();
				
				// LOG: core.logger.logInfo('Loaded new entry data');
			}, "json");
			
			this.hideZoomAlert();
			
			// LOG: core.logger.logInfo('Loading new entry data', vars);
        },
		
        getMarkerClassName: function(status, favorite, bookmark, sponsor){
            var className = 'marker marker_'+status;
            var suffix;
            
			if (status != 'foreign') {
			    if(sponsor) {
                    className += '_sponsor';
			    }
			    else {
                    if (favorite) {
                        className += '_favorite';
                    }
                    else if (bookmark) {
                        className += '_bookmark';
                    };	
                };	
			};
			
			return className;
        },
        
        getMarkerIconUrl: function(status, favorite, bookmark, sponsor){
            var iconFile = status;
            var suffix;
            
			if (status != 'unknown' && status != 'foreign') {
			    if(sponsor) {
                    iconFile += '_sponsor';
			    }
			    else {
                    if (favorite) {
                        iconFile += '_favorite';
                    }
                    else if (bookmark) {
                        iconFile += '_bookmark';
                    };	
                };
			};
							            
			if (core.browser.msie6) {
				suffix = '.gif';
			}
			else {
				suffix = '.png';
			};
			
			return eat.settings.iconUrl + iconFile + suffix;
        },
		
        createMarker: function(data) {
			var self = this;
			
            data.favorite = ($.inArray(parseInt(data.id), eatFavorites) != -1) ? true : false;
            data.bookmark = ($.inArray(parseInt(data.id), eatBookmarks) != -1) ? true : false;
            data.message = (data.msg == 0) ? null : data.msg;
            data.sponsor = (data.spr == 1) ? true : false;
            data.dealmsg = (data.deal == 0) ? null : data.deal;
				
			var url = eat.settings.restaurantUrl + '/' + data.id;

            var marker_html = false;
				
            // create faster marker for regular users
			if(core.browser.msie6) {
				var marker = new ngIcon(new GLatLng(data.lat, data.lng), false, ((data.sts == 'unknown')?1:(data.sts == 'closed')?2:1000), url, this.getMarkerIconUrl(data.sts, data.favorite, data.bookmark, data.sponsor), marker_html);						
			}
			else {
				var marker = new ngIcon(new GLatLng(data.lat, data.lng), this.getMarkerClassName(data.sts, data.favorite, data.bookmark, data.sponsor), ((data.sts == 'unknown')?1:(data.sts == 'closed')?2:1000), url, false, marker_html);		
			}

            // create regular tooltip for the marker
            var html = '<div class="tooltip-wrapper">';
            html += '<div class="tooltip '+((data.sponsor)?'sponsor':'')+'" id="tooltip-'+data.id+'">';
            html += '<div class="header">';
            
            if(data.message) {
                html += '<div class="headerMessageWrapper">';
                    html += '<div class="headerMessage">';
                        html += '<div class="headerMessageHeader"></div>';
                        html += '<div class="headerMessageBody">'+data.message+'</div>';
                        html += '<div class="headerMessageFooter"></div>';
                    html += '</div>';
                html += '</div>';
            }
            
            if (data.rgo) {
                html += '<div class="ratingOverall">' + data.rgo + '</div>';	
            };
            
            html += '<div class="label">' + data.lbl + '</div>';
            html += '</div>';
            html += '<div class="body">';	
            html += '<div class="data">';	

            if (data.sts == 'foreign') {
                html += '<div class="foreign">' + __('area.map.tooltip.foreign') + '</div>';
            }
            else {
                if (data.wbc == 1) {
                    html += '<div class="willBeClosed">' + __('area.map.tooltip.willBeClosed') + '</div>';
                }
                else {
                    html += '<div class="openStatus '+data.sts+'">' + __('restaurant.openingStatus.'+data.sts) + '</div>';
                };
                
                html += '<div class="reviews">';
                
                if (data.dealmsg) {
                    html += '<div class="deal" title="' + data.dealmsg + '"></div>';
                }
                
                if (data.rvw == 0) {
                    html += __('area.map.tooltip.noReviews');
                }
                else 
                    if (data.rvw == 1) {
                        html += data.rvw + ' ' + __('area.map.tooltip.review');
                    }
                    else {
                        html += data.rvw + ' ' + __('area.map.tooltip.reviews');
                    };
                
                html += '</div>';
                html += '<div class="ratings">';
                
                if (data.rgq) {
                    html += '<div class="ratingEntry">';
                    html += '<div class="ratingQuality"><div class="ratingBar" style="width:' + ((data.rgq-0.8) * 12 * 1.5) + 'px"></div></div>';
                    html += '<div class="ratingTitle"><strong>' + data.rgq + '</strong> ' + __('area.map.tooltip.qualityLabel') + '</div>';
                    html += '</div>';
                }
                
                if (data.rge) {
                    html += '<div class="ratingEntry">';
                    html += '<div class="ratingExperience"><div class="ratingBar" style="width:' + ((data.rge-0.8) * 12 * 1.5) + 'px"></div></div>';
                    html += '<div class="ratingTitle"><strong>' + data.rge + '</strong> ' + __('area.map.tooltip.experienceLabel') + '</div>';
                    html += '</div>';
                };
                
                if (data.rgp) {
                    html += '<div class="ratingEntry">';
                    html += '<div class="ratingPrice"><div class="ratingBar" style="width:' + ((data.rgp-0.8) * 12 * 1.5) + 'px"></div></div>';
                    html += '<div class="ratingTitle"><strong>' + data.rgp + '</strong> ' + __('area.map.tooltip.priceLabel') + '</div>';
                    html += '</div>';
                };
                
                html += '</div>';
                
            };
                
            html += '</div>';
            html += '</div>';
            
            html += '<div class="footer">';
            
            if (data.sts == 'foreign') {
                html += '<div class="foreign-link"><a href="javascript:document.location = \'' + eat.settings.indexUrl + '?cityId=' + data.cty + '&lat=' + eat.area.map.state.lat + '&lng=' + eat.area.map.state.lng + '&zoom=' + eat.area.map.state.zoom + '\';">' + __('area.map.tooltip.foreignLink') + ' ' + this.cities[data.cty] + ' »' + '</a></div>';	
            }
            else {
                html += '<div class="category-small-list">';
                
                for (var a = 0; data.cat[a]; a++) {
                    html += '<div class="category-small" id="category-small-' + data.cat[a] + '"><div class="category-label"><label>&nbsp;</label></div></div>';
                };
                
                html += '</div>';
                
                if (data.dsc) {
                    html += '<div class="descr">' + data.dsc + '</div>';
                };
            };
            
            html += '</div>';
            html += '</div>';
            html += '</div>';
            
            marker.tooltip = html;            
            marker.data = data;
			
			marker.href = eat.settings.restaurantUrl + '/' + data.id;
			
			eat.area.map.gMap.addOverlay(marker);
			
			var mrks = [marker];
			
			var addFlag = function(marker, type, x, y) {
			    var flag = new ngIcon(new GLatLng(data.lat, data.lng), type, ((data.sts == 'unknown')?1:(data.sts == 'closed')?2:1000), marker.href, false);
                eat.area.map.gMap.addOverlay(flag);
                flag.redrawWithOffset(true, x, y);
                mrks.push(flag);
                
                GEvent.addListener(flag, "mouseover", function(){
                    self.showTooltip(marker);
                });
                
                GEvent.addListener(flag, "mouseout", function(){
                    self.hideTooltip(marker);
                });
                
                GEvent.addListener(eat.area.map.gMap, "zoomend", function(){
                    flag.redrawWithOffset(true, 6, -5);
                });
			};
			
            if (data.message) {
                addFlag(marker, "marker-flag", 6, -5);
            }
            
            if (data.dealmsg) {
                addFlag(marker, "marker-deal", -5, -5);
            }
            
            GEvent.addListener(marker, "mouseover", function(){
                self.showTooltip(marker);
            });
            
            GEvent.addListener(marker, "mouseout", function(){
                self.hideTooltip(marker);
            });
            
            return mrks;
        },
		
		updateCities: function(cities) {
			for(var a=0; cities[a]; a++) {
				var city = cities[a];
				this.cities[city[0]] = city[1];
			};
		},
		
        updateMarkers: function(data){			
			this.updateCities(data.cities);
			
            // filter and hide existing markers      
            for(var a=0; data.hide[a]; a++) {
				var mrk = this.data[data.hide[a]];
				
				if(!!mrk) {
					for (var b = 0; mrk[b]; b++) {
					    eat.area.map.gMap.removeOverlay(mrk[b]);
					}
					this.data[data.hide[a]] = null;
				};
            };
			
            // add new markers or show existing			
            var markers = [];
            
            for(var a=0; data.show[a]; a++) {
                var item = this.parseJsonItem(data.show[a]);
                
                var mrks;
				if(eat.settings.admin && item.sts != 'foreign') {
				    mrks = this.createAdminMarker(item);						
				}
				else {
				    mrks = this.createMarker(item);
				}
				
				/*
				for (var b = 0; mrks[b]; b++) {
				    eat.area.map.gMap.addOverlay(mrks[b]);
				}
				*/
				
				this.data[item.id] = mrks;
                
                this.shownIds.push(item.id);
            };
            
			// remove hidden ids from shownIds
			this.shownIds = $.grep(this.shownIds, function(n, i){
				if($.inArray(parseInt(n), data.hide) != -1) {
					return false;
				};
				
				return true;
		    });
		    
            // update top list
			if(data.topList.length>10) {			
				eat.area.topList.html = data.topList;
			};
			
            eat.area.bestlunch.init();
			eat.area.topList.update();
			eat.area.map.renderControls();
			
			$.each(["marker-flag", "marker-deal"], function() {
			    var flags = $("#gmap ." + this);
	            if (flags.length > 0) {
	                var z = 2000 + flags.length;
	                flags.each(function(i) {
	                    $(this).css({ zIndex: z-i });
	                });
	            }
			});
        },
        
		resetMarkers: function() {		
            this.loadData();
		},
        
        showTooltip: function(marker){
			window.clearTimeout(this.tooltipTimer);
		
            var map = eat.area.map.gMap;
            
            this.tooltip.html(marker.tooltip);
			
            var point = map.getCurrentMapType().getProjection().fromLatLngToPixel(map.fromContainerPixelToLatLng(new GPoint(eat.settings.tooltipOffsetX, eat.settings.tooltipOffsetY), true), map.getZoom());
            var offset = map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(), map.getZoom());
			var anchor = marker.getIcon().iconAnchor;			
			var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x, offset.y - point.y - anchor.y));

            pos.apply(this.tooltip[0]);
			
			$('.tooltip', this.tooltip).bind('mouseover', function(){
				eat.area.markers.onTooltip(marker);
			});
			
			$('.tooltip', this.tooltip).bind('mouseout', function(){
				eat.area.markers.offTooltip(marker);
			});
			
			$('.tooltip', this.tooltip).bind('click', function(){
				if (marker.data.sts == 'foreign') {
					document.location = eat.settings.indexUrl + '?cityId=' + marker.data.cty + '&lat=' + eat.area.map.state.lat + '&lng=' + eat.area.map.state.lng;
				}
				else {
					document.location = eat.settings.restaurantUrl + '/' + this.id.split('-')[1];
				}
			});	
            
            this.tooltip.show();
            
            $(".entry.on").removeClass("on");
            $("#toplist_entry_" + marker.data.id + ", #lunchlist_entry_" + marker.data.id).addClass("on");
        },
        
		hideTooltip: function(marker) {
			this.tooltipTimer = window.setTimeout(function() {
				if (core.browser.msie6) {
					$(eat.area.markers.tooltip).hide();
				}
				else {
					$(eat.area.markers.tooltip).fadeOut(100);
				}

	            $(".entry.on").removeClass("on");
			}, 100);
		},
		
		onTooltip: function() {
			window.clearTimeout(this.tooltipTimer);
		},
        
		offTooltip: function(marker) {
			this.hideTooltip(marker);
		},
		
        showZoomAlert: function() {
        	$('#gmap-zoomalert').show();        
        },
        
        hideZoomAlert: function() {
        	$('#gmap-zoomalert').hide();
        },
        
        showHighlight: function(id){
            var map = eat.area.map.gMap;
            var marker = this.data[id];
            
			if(!!marker && marker[0]) {
	            var highlight = $('#gmap-highlight');
	            var point = map.getCurrentMapType().getProjection().fromLatLngToPixel(map.fromContainerPixelToLatLng(new GPoint(0, 0), true), map.getZoom());
	            var offset = map.getCurrentMapType().getProjection().fromLatLngToPixel(marker[0].getPoint(), map.getZoom());
	            var anchor = marker[0].getIcon().iconAnchor;
	            var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x - 6, offset.y - point.y - anchor.y - 5));
	            pos.apply(highlight[0]);
	            
	            highlight.show();
			};
        },
        
        hideHighlight: function(id){
            $('#gmap-highlight').hide();
        },
        
        parseJsonItem: function(arr){
            var obj = {
                id: arr[0],
                lat: arr[1],
                lng: arr[2],
                cty: arr[3],
                lbl: arr[4],
                cat: String(arr[5]),
                dsc: arr[6],
                rvw: arr[8],
                rtg: String(arr[9]),
                wbc: arr[10],
                spr: arr[11],
                msg: arr[12],
                lch: arr[13],
                deal: arr[14]
            };
			
			// parse categories
			var cat = [];
			
			if(arr[5]) {
				for(var a=0; a<obj.cat.length; a++) {
					cat.push(obj.cat.charAt(a));
				};	
			};
			
			obj.cat = cat;
			
			// parse ratings
			obj.rgo = (obj.rtg!="0")?obj.rtg.charAt(0)+'.'+obj.rtg.charAt(1):null;
			obj.rgq = (obj.rtg!="0")?obj.rtg.charAt(2)+'.'+obj.rtg.charAt(3):null;
			obj.rge = (obj.rtg!="0")?obj.rtg.charAt(4)+'.'+obj.rtg.charAt(5):null;
			obj.rgp = (obj.rtg!="0")?obj.rtg.charAt(6)+'.'+obj.rtg.charAt(7):null;
			
            // parse status integers
			switch (arr[7]) {
				case 1:
					obj.sts = 'open';
					break;
				case 2:
					obj.sts = 'lunch';
					break;
				case 3:
					obj.sts = 'brunch';
					break;
				case 4:
					obj.sts = 'closed';
					break;
				case 5:
					obj.sts = 'foreign';
					break;
				default:
					obj.sts = 'unknown';
					break;
			};
            
			// LOG: core.logger.logInfo('Parsed JSON '+obj.id, obj);
			
            return obj;
        },
		
		initTooltip: function(){
			this.tooltip = $('<div id="tooltip"></div>');			
			this.tooltip.hide();
			
			$("#body").append(this.tooltip);
		}
    },
	
	notes: {
		init: function() {
			var self = this;
			
			if ($('#welcome-note').length > 0) {
				window.setTimeout(function() {
					self.open('welcome-note');
				}, 3000);
			}
			else if ($('#register-note').length > 0) {
				window.setTimeout(function() {
					self.open('register-note');
				}, 3000);
			};
		},
		
		open: function(id) {
			if(core.browser.msie6) {
				$('#'+id).show();
			}
			else {
				$('#'+id).fadeIn(500);				
			}
		},
		
		close: function(id) {
			if(core.browser.msie6) {
				$('#'+id).hide();
			}
			else {
				$('#'+id).fadeOut(500, function() {
					$('#'+id).remove();	
				});				
			}
		}
	},
	
	layout: {
		update: function() {
		    if(core.browser.webkit) {
                var windowHeight = (window.innerHeight || document.body.offsetHeight) - $("#pagetop-ad").height();
                var lunchExtra = $("#lunch-list").is(":visible") ? 30 : 0;
                
                if(windowHeight > 930) {
                    $('#gmap').css('height', windowHeight-519);
                    $('#content-area').css('height', windowHeight-444);
                    $('#lists-wrapper').css('height', windowHeight-495);
                    $(eat.area.topList.opened).css('height', windowHeight-521-lunchExtra)
                        .find('.data').css('height', windowHeight-551-lunchExtra);
                }
                else {
                    $('#gmap').css('height', 410);
                    $('#content-area').css('height', 486);
                    $('#lists-wrapper').css('height', 435);
                    $(eat.area.topList.opened).css('height', 409-lunchExtra)
                        .find('.data').css('height', 378-lunchExtra);
                };
            };
		}
	},
	
	bestlunch: {
	    init: function() {
            if(eat.settings.bestlunch) {	 
            
                var map = eat.area.map.gMap;

                var marker = eat.area.markers.data[eat.settings.bestlunch.id];
	            var bestlunch = $('#bestlunch');
	            var point = map.getCurrentMapType().getProjection().fromLatLngToPixel(map.fromContainerPixelToLatLng(new GPoint(0, 0), true), map.getZoom());
	            var offset = map.getCurrentMapType().getProjection().fromLatLngToPixel(marker[0].getPoint(), map.getZoom());
	            var anchor = marker[0].getIcon().iconAnchor;
	            var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x - 312, offset.y - point.y - anchor.y - 60));
	            pos.apply(bestlunch[0]);
	            
                // create "best lunch" tooltip for the marker
                var html = '';
                
                html += '<div class="bestlunch">';
                html += '<div class="close"></div>';
                html += '<div class="header"></div>';
                html += '<div class="body">';	
                html += '<div class="data">';	
    
                html += '<div class="bl-rating">' + eat.settings.bestlunch.rating + '</div>';	
                html += '<div class="bl-name">' + eat.settings.bestlunch.name + '</div>';
                    
                html += '</div>';
                html += '</div>';
                
                html += '<div class="footer">';
                
                html += '<ul>';
                html += '<li><a href="' + eat.settings.restaurantLunchMenuUrl + '/' + eat.settings.bestlunch.id + '">Katso lounaslista »</a></li>';
                html += '<li><a href="' + eat.settings.bestlunch.restaurantUrl + '">Tutustu ravintolaan »</a></li>';
                html += '</ul>';
                
                html += '</div>';
                html += '</div>';
	            
	            bestlunch.html(html).show();
	            
	            $('.close', bestlunch).click(function() {
	                $('#bestlunch').remove();
	            });
            }
	    }
	},
	
    init: function() {
        eat.area.layout.update();
        eat.area.filterBar.init();
        eat.area.topList.init();
        eat.area.location.init();
        eat.area.map.init();
        eat.area.notes.init();
    }    
};

$(document).ready(function(){
    eat.area.init();
});eat.area.filterBar = {
	openFilter:null,
	dateChanged:false,
	
    data: {
        dateDay: null,
        dateMonth: null,
        dateYear: null,
        time: null,
		timeReadable: null,
        minPrice: 0,
        maxPrice: 1000,
        rating: 2,
        ratingType: 'overall',
        categories: [1, 2, 3, 4, 5, 6],
		noCategory: true,
		feature: 0,
        text: null
    },
	
    init: function() {
		var self = this;
		
		this.dateChanged = false;
		
		// general close
		$('body').bind('click', function() {
			self.closeControls();
			
			window.setTimeout(function() {
	            $('.filter-bar-button-update').addClass('disabled');
				self.renderData();
			}, 500);
		});
		
		// mouseover
		$('#filter-bar .filter')
		.bind('mouseover', function() {
            $(this).addClass('hover');
		})
		.bind('mouseout', function() {
            $(this).removeClass('hover');
		});
		
        // filter update button			
        $('.filter-bar-button-update').bind('click', function(){
			if(!$(this).is('.disabled')) {
				
				// let controls close first
				$('#'+self.openFilter+' .controls').fadeOut(250, function() {
		            self.updateData();
		            
		            // workaround to refresh the whole page if custom time is used                
		            if (self.dateChanged) {
		                document.location = document.location;
		            }
		            else {
		                eat.area.markers.loadData();
		                $('.filter-bar-button-update').addClass('disabled');
		            };
					
					self.renderData();				
					self.openFilter = null;
				});
			};
		});

        // text filter form, used only if enter is pressed	
        $('#textfilter-form').bind('submit', function(){
            self.updateData();
            eat.area.markers.loadData();
            $('.filter-bar-button-update').addClass('disabled');
			self.renderData();
			self.closeControls();	
            return false;
        });
		
		// textfilter reset
		$('#textfilter-reset').bind('click', function() {
            self.data.text = null;
			self.renderData();
            $('.filter-bar-button-update').removeClass('disabled');
	        $.cookie('eatfilter', JSON.stringify(self.data), { expires: 365, path: '/', domain: '.eat.fi' });
			$(this).hide();
		});
		
		// filter drawers
        $('.filter-bar-button-close').bind('click', function() {
			self.closeControls();
			
			window.setTimeout(function() {
	            $('.filter-bar-button-update').addClass('disabled');
				self.renderData();
			}, 500);
        });

		// filter controls
        $('#filter-bar .controls').bind('click', function(e) {
			e.stopPropagation();
        });
		
		// filter drawers
        $('#filter-bar .filter').bind('click', function(e) {
			e.stopPropagation();
		
			self.openControls(this);
        });
		
        /*
		// location
		$('#locationfilter').bind('click', function() {
	        eat.area.presets.init();
		});
		*/
		
        // categories
        $('#categoryfilter input[type=checkbox]').bind('click', function(){
			self.updateCategories();
			
            $('.filter-bar-button-update').removeClass('disabled');
        });
        
        // features
        $('#categoryfilter input[type=radio]').bind('click', function(){
			self.updateFeatures();
			
            $('.filter-bar-button-update').removeClass('disabled');
        });
        
        // price
        $('#pricefilter input[type=radio]').bind('click', function(){
            $('.filter-bar-button-update').removeClass('disabled');
        });
        
        // rating filter radio buttons			
        $('#ratingfilter input[type=radio]').bind('click', function(){
            $('.filter-bar-button-update').removeClass('disabled');
        });
        
        // rating filter type select			
        $('#ratingfilter-type').bind('change', function(){
            $('.filter-bar-button-update').removeClass('disabled');
        });
        
        // date filter text	inputs		
        $('#datefilter input[type=text]').bind('focus', function(){
            $('.filter-bar-button-update').removeClass('disabled');
			self.dateChanged = true;
        });
        
        // date filter switch			
        $('[name=datefilter-switch]').bind('click', function(){
            $('.filter-bar-button-update').removeClass('disabled');
            var dateSwitch = $('#datefilter-switch-custom').is(':checked');

            if (core.browser.msie) {
                if (dateSwitch) {
                    $('#datefilter-date-details').show();
                }
                else {
                    $('#datefilter-date-details').hide();
                };
            }
            else {
                if (dateSwitch) {
                    $('#datefilter-date-details').slideDown();
                }
                else {
                    $('#datefilter-date-details').slideUp();
                };
            };
			
			self.dateChanged = true;
        });
        
        // date filter time select			
        $('#datefilter select').bind('change', function(){
            $('.filter-bar-button-update').removeClass('disabled');
			self.dateChanged = true;
        });

        // text filter text			
        $('#textfilter-text').bind('focus', function(){
            $('.filter-bar-button-update').removeClass('disabled');
			$('#textfilter-reset').show();
        });
        
        // get filter from cookie
        var cookie = $.cookie('eatfilter');
        
        if (cookie) {
            this.data = JSON.parse(cookie);
        };
        
        this.renderData();
		
		self.updateCategories();
		self.updateFeatures();
    },
	
    updateData: function(){    
        this.data.categories = this.getCategories();
        this.data.noCategory = (($('#no-category:checked').length>0)?true:false);
        // core.logger.logInfo('Set filter categories: ' + this.data.categories);
        
        this.data.feature = this.getFeature();
        
        this.data.rating = this.getRating();
        this.data.ratingType = this.getRatingType();
        // core.logger.logInfo('Set filter rating limit and type: ' + this.data.rating + ' (' + this.data.rating + ')');
        
        var price = this.getPrice();
        this.data.minPrice = price[0];
        this.data.maxPrice = price[1];
        // core.logger.logInfo('Set filter price range: ' + price);
        
        var date = this.getDate();
        var dateArr = (date) ? date.split('.') : [null, null, null];
        this.data.date = date;
        this.data.dateDay = dateArr[0];
        this.data.dateMonth = dateArr[1];
        this.data.dateYear = dateArr[2];
        // core.logger.logInfo('Set filter date: ' + this.data.date);
        
        this.data.time = this.getTime();
        this.data.timeReadable = this.getTimeReadable();
        // core.logger.logInfo('Set filter time: ' + this.data.time);
        
        this.data.text = this.getText();
        // core.logger.logInfo('Set filter text: ' + this.data.text);
        
        $.cookie('eatfilter', JSON.stringify(this.data), { expires: 365, path: '/', domain: '.eat.fi' });
    },
    
    renderData: function() {
		var self = this;
		
		// feature fix
        if(!self.data.feature) {
            self.data.feature = 0;
        }
		
        // set category controls
        $('#categoryfilter input[type=checkbox]').each(function(){
            var obj = $(this);
            var val = obj.val();
            
            if ($.inArray(parseInt(val), self.data.categories) != -1) {
                obj.attr('checked', true);
            }
            else {
                obj.attr('checked', false);
            };
        });
		
		// set category data
		var icons = '';

		for(a in self.data.categories) {
            icons += '<div class="categoryfilter-category" id="categoryfilter-'+self.data.categories[a]+'" title="'+__('area.filter.categoryFilter.category'+self.data.categories[a])+'">&nbsp;</div>';
		};
        
        if(self.data.feature==0) {
            if(self.data.categories.length==7 && self.data.noCategory) {
                $('#categoryfilter .data').html(__('area.filter.category.any')).removeClass('feature').addClass('any dimmed');
            }
            else {
                $('#categoryfilter .data').html(icons).removeClass('feature').removeClass('any dimmed');    
            }
        }
        else {
            $('#categoryfilter .data').html(__('area.filter.categoryFilter.feature'+self.data.feature)).removeClass('any dimmed').addClass('feature');
        }
    		
		// set no category control
		if(self.data.noCategory) {
	        $('#no-category').attr('checked', true);				
		}
		else {
	        $('#no-category').attr('checked', false);	
		}
        
        // set restaurant features        
        $('#categoryfilter input[type=radio]').each(function() {
            if($(this).val()==self.data.feature) {
                $(this).attr('checked', true);
            }
            else {
                $(this).attr('checked', false);            
            }
        });
        
        // set rating value and type controls
        $('#ratingfilter input[value=' + this.data.rating + ']').attr('checked', true);
        $('#ratingfilter-type').val(this.data.ratingType);
		
		// set rating data
		if(this.data.rating==1) {
            $('#ratingfilter .data').html('<span class="ratingfilter-data" id="ratingfilter-data-any">('+__('area.filter.rating.'+this.data.ratingType)+')</span>').addClass('dimmed');
		}
		else {
            $('#ratingfilter .data').html('<span class="ratingfilter-data" id="ratingfilter-data-'+this.data.rating+'">'+__('area.filter.rating.'+this.data.ratingType)+'</span>').removeClass('dimmed');
		};
        
        // set date and time controls
        if (this.data.dateDay && this.data.dateMonth && this.data.dateYear && this.data.time) {
            $('#datefilter-date-dd').val(this.data.dateDay);
            $('#datefilter-date-mm').val(this.data.dateMonth);
            $('#datefilter-date-yyyy').val(this.data.dateYear);
            $('#datefilter-time').val(this.data.time);
            $('#datefilter-switch-custom').attr('checked', true);
            $('#datefilter-date-details').show();
			
			// set date and time data
            $('#datefilter .data').html(this.data.dateDay+'.'+this.data.dateMonth+'. '+__('area.filter.date.time')+' '+this.data.timeReadable).removeClass('dimmed');
        }
		else {
            $('#datefilter-switch-now').attr('checked', true);
            $('#datefilter-date-details').hide();
			
            $('#datefilter .data').html(__('area.filter.date.now')).addClass('dimmed');
		};
		
        // set price controls			
        $('#pricefilter input').each(function(){
            var obj = $(this);
            var val = obj.val().split('-');
            
            if (parseInt(val[0]) == parseInt(self.data.minPrice) && parseInt(val[1]) == parseInt(self.data.maxPrice)) {
                obj.attr('checked', true);
            }
            else {
                obj.attr('checked', false);
            };
        });
		
        // set price data
		if(self.data.maxPrice==1000) {
	        $('#pricefilter .data').html(__('area.filter.price.nomaximum')).addClass('dimmed');		
		}
		else {
	        $('#pricefilter .data').html(__('area.filter.price.maximum')+' <strong>'+self.data.maxPrice+'</strong> &euro;').removeClass('dimmed');	
		};
        
        // set textfilter controls
        if (this.data.text) {
            $('#textfilter-text').val(this.data.text);
        }
        else {
            $('#textfilter-text').bind('focus', function(){
                if ($(this).is('.dimmed')) {
                    $(this).val('');
                    $(this).removeClass('dimmed');
                };
            }).val(__('area.filter.other.example')).addClass('dimmed');
        };
		
        // set textfilter data
		if(this.data.text) {
	        //$('#otherfilter .data').html(__('area.filter.other.used'));
			$('#otherfilter .data').html('”'+this.data.text+'”');
	        $('#otherfilter .data').removeClass('dimmed');
			$('#textfilter-reset').show();
		}
		else {
	        $('#otherfilter .data').html(__('area.filter.other.notused'));
	        $('#otherfilter .data').addClass('dimmed');
		};
		
		this.updateCategories();
		this.updateFeatures();
    },
	
	openControls: function(obj) {
		var open = true;
		
		if (this.openFilter) {
			if (this.openFilter == obj.id) {
				open = false;	
			};
			
			this.closeControls();
		};

		if (open) {
			if(core.browser.msie6) {
				$('#' + obj.id + ' .controls').show();				
			}
			else {
				$('#' + obj.id + ' .controls').fadeIn(250);
			}

			this.openFilter = obj.id;
		};
	},
	
	closeControls: function() {
		if (core.browser.msie6) {
			$('#' + this.openFilter + ' .controls').hide();
		}
		else {
			$('#' + this.openFilter + ' .controls').fadeOut(250);			
		}
		
		this.openFilter = null;
	},
    
    getCategories: function(){
        var cats = [];
        
        $('#categoryfilter-categories input:checked').each(function(){
            if(!$(this).is('#no-category')) {
                cats.push(parseInt($(this).val()));
            }
        });
        
        return cats;
    },
	
	updateCategories: function() {
		$('#categoryfilter input[type=checkbox]').each(function() {
			if(!this.checked) {
				$(this).parents('.category-small').addClass('disabled');
			}
			else {
				$(this).parents('.category-small').removeClass('disabled');					
			};
		});
	},
	
    getFeature: function(){
        return $('#categoryfilter-features input[type=radio]:checked').val();
    },
    
	updateFeatures: function() {
	    if(core.browser.msie) {
            if($('#featurefilter-feature-disabled').attr('checked')) {
                $('#categoryfilter-categories').show();		
                $('#categoryfilter-feature-info').hide();
            }
            else {
                $('#categoryfilter-categories').hide();
                $('#categoryfilter-feature-info').show();
            }	    
	    }
	    else {
            if($('#featurefilter-feature-disabled').attr('checked')) {
                $('#categoryfilter-feature-info').slideUp(250, function() {
                    $('#categoryfilter-categories').slideDown(500);
                });		
            }
            else {
                $('#categoryfilter-categories').slideUp(500, function() {
                    $('#categoryfilter-feature-info').slideDown(250);
                });
            }
	    };
	},
    
    getRating: function(){
        var rating = $('#ratingfilter input:checked').val();
        return (rating != '') ? rating : 0;
    },
    
    getRatingType: function(){
        return $('#ratingfilter-type').val();
    },
    
    getPrice: function(){
        var price = [];
        
        $('#pricefilter input:checked').each(function(){
            price.push($(this).val());
        });
        
        return (price.length > 0) ? [price[0].split('-')[0], price.pop().split('-')[1]] : [0, 0];
    },
    
    getDate: function(){
        var dateSwitch = $('#datefilter-switch-custom').is(':checked');
        var dateDay = $('#datefilter-date-dd').val();
        var dateMonth = $('#datefilter-date-mm').val();
        var dateYear = $('#datefilter-date-yyyy').val();
        return (dateSwitch) ? dateDay + '.' + dateMonth + '.' + dateYear : null;
    },
    
    getTime: function(){
        var dateSwitch = $('#datefilter-switch-custom').is(':checked');
        var time = $('#datefilter-time').val();
        return (dateSwitch) ? time : null;
    },
	
    getTimeReadable: function(){
        var dateSwitch = $('#datefilter-switch-custom').is(':checked');
        var obj = $('#datefilter-time')[0];
		var time = obj.options[obj.selectedIndex].text;
        return (dateSwitch) ? time : null;
    },
    
    getText: function(){
        var text = $('#textfilter-text').val();
        return (!$('#textfilter-text').is('.dimmed')) ? text : null;
    }
};

eat.area.presets = {
	initialized: false,
	data:[],
	
	init: function() {
		var self = this;
		
		if(!this.initialized) {
			$('#preset-name').val(__('area.filter.locationFilter.userPresets.nameText'))
				.addClass('dimmed')
				.bind('focus', function() {
					if($(this).is('.dimmed')) {
						$(this).val('').removeClass('dimmed');
					}
				});
				
			$('#preset-save-form').bind('submit', function(){
				self.setPreset();
				return false;
			});
			
			this.update();
			
			this.initialized = true;
		}
	},
	
	update: function() {
		$('#preset-entries').html('');
		
		for(var a=0; a<this.data.length; a++) {
			$('#preset-entries').append(this.getPresetHTML(a, this.data[a].name));
		}
		
		if(this.data.length>0) {
			$('#presets-no-help').hide();
			$('#preset-entries').show();
		}
		else {
			$('#presets-no-help').show();
			$('#preset-entries').hide();
		}
		
	},
	
	setPreset: function() {
		var self = this;
		
		var preset = {
			map: eat.area.map.state,
			filter: eat.area.filterBar.data
		};
		
		if(!$('#preset-name').is('.dimmed') && $('#preset-name').val().length > 1 ) {
			preset.name = $('#preset-name').val();
			
            $.post(eat.settings.presetsAddUrl, { 'preset': JSON.stringify(preset) }, function(data) {
				alert(__('area.filter.locationFilter.userPresets.presetSaved'));

				self.data = data;

				self.update();
				
				$('#preset-name').val(__('area.filter.locationFilter.userPresets.nameText')).addClass('dimmed');
            }, "json");
		}
		else {
			alert(__('area.filter.locationFilter.userPresets.enterName'));
		}
	},
	
	getPreset: function(count) {
		var preset = null;
		
        for(var a=0; this.data[a]; a++) {
			if(a==count) {
				preset = this.data[a];
				break;
			}
		}
		
		if(preset) {
			eat.area.filterBar.closeControls();	
			
			eat.area.map.state = preset.map;
			eat.area.filterBar.data = preset.filter;
					
			// fix category ids
			for(var a=0; eat.area.filterBar.data.categories[a]; a++) {
				eat.area.filterBar.data.categories[a] = parseInt(eat.area.filterBar.data.categories[a]);
			}
					
			$('#filter-bar .filter .data').fadeOut(50, function() {
				eat.area.filterBar.renderData();
			});

			window.setTimeout(function() {
				$('#filter-bar .filter .data').fadeIn(750);
				
				$('#location-presets-flash').css('opacity',0.8).show().animate({opacity:0}, 750, function() {
					$('#location-presets-flash').hide();
				});
			}, 100);
							
			window.setTimeout(function() {
				eat.area.map.renderState();
			}, 1100);
		}
	},
	
	getPresetHTML: function(count, name) {
		var html = '';
		html += '<div class="preset-entry" id="preset-'+count+'">';
		html += '<div class="preset-link">';
		html += '<a href="javascript:eat.area.presets.deletePreset(\''+count+'\');">'+__('area.filter.locationFilter.userPresets.deleteLink')+'</a>';
		html += '</div>';
		html += '<div class="preset-text">';
		html += '<a href="javascript:eat.area.presets.getPreset(\''+count+'\');">'+name+'</a>';
		html += '</div>';
		html += '</div>';
		return html;
	},
	
	deletePreset: function(count) {
	    var self = this;
	    
		if(confirm(__('area.filter.locationFilter.userPresets.confirmDelete'))) {	    		
            $.post(eat.settings.presetsDeleteUrl, { 'preset':count }, function(data) {
				self.data = data;
				self.update();
            }, "json");
		}
		else {
			eat.area.filterBar.closeControls();	
		}
	}
};eat.area.topList = {
	data:null,
	html:null,
	hideClosed:0,
	opened:"#top-list",
	
    init: function() {
		var self = this;
		
		this.data = $('#top-list .data');
		
        var cookie = $.cookie('eattoplist');
        
        if (cookie) {
			this.hideClosed = parseInt(cookie);
        };
		
        $('#top-list-toggle').bind('click', function(){
			self.hideClosed = ($('#top-list-toggle').attr('checked'))?1:0;

            self.update();
        });
        
        $("#top-list h3").click(function() {
            eat.area.topList.toggleLists("#top-list", "#lunch-list");
        });
        
        $("#lunch-list h3").click(function() {
            var windowHeight = window.innerHeight||document.body.offsetHeight;
            $("#lunch-list .data").css({ height: (core.browser.webkit && windowHeight > 930 ? windowHeight-581 : 348) });
            
            eat.area.topList.toggleLists("#lunch-list", "#top-list");
        });
        
        $(".lunch-list-browse").click(function(e) {
            e.stopPropagation();
        });
        
        if(eat.settings.bestlunch) {
            eat.area.topList.toggleLists("#lunch-list", "#top-list");
        }
    },
    
    update: function() {
		var self = this;
		
    	if(this.html) {
    	
    		// insert pre-rendered toplist
    		this.data.html(this.html);
			
    	}
    	else {
    	
    		// render toplist live
			var undefKeys = [];
			var lowKeys = [];
			var highKeys = [];
			var lunchKeys = []
			
			for(marker in eat.area.markers.data) {
				if(!!eat.area.markers.data[marker]) {
				    var mrk = eat.area.markers.data[marker][0];
				    
					var label = mrk.data.lbl;
					var status = mrk.data.sts;
					var reviews = mrk.data.rvw;
					var reviewspad = ((reviews<100&&reviews>9)?"0"+reviews:((reviews<10)?"00"+reviews:reviews));
					var rating = null;
					
					switch(eat.area.filterBar.data.ratingType) {
						case "overall": rating = String(mrk.data.rgo); break;
						case "quality": rating = String(mrk.data.rgq); break;
						case "experience": rating = String(mrk.data.rge); break;
						case "price": rating = String(mrk.data.rgp); break;
					};
					
					if ($.inArray(parseInt(marker), eat.area.markers.shownIds) != -1) {
						if (this.hideClosed == 1 && status == 'closed') {
							//
						}
						else {
						
							// if less than 5 reviews, store in different list and display after the rest
							if (rating=='null') {
								undefKeys.push('norating' + label + '_' + reviewspad + '_' + marker);
							}
							else if (reviews < eat.settings.reviewLimit) {
								lowKeys.push(rating + '_' + reviewspad + '_' + marker);
							}
							else {
								highKeys.push(rating + '_' + reviewspad + '_' + marker);
							};
							
							if (mrk.data.lch && (this.hideClosed != 1 || status == "lunch")) {
							    lunchKeys.push(mrk.data.spr + "_" + (rating == "null" ? "0.0" : rating) + '_' + reviewspad + "_" + marker);
							}
						};
					};	
				};
			};
			
			// sort and reverse keys to have the best ratings first
			undefKeys.sort();
			highKeys.sort().reverse();
			lowKeys.sort().reverse();
            lunchKeys.sort().reverse();
			
			// merge key arrays
			var tmpKeys = $.merge(highKeys, lowKeys);
			var keys = $.merge(tmpKeys, undefKeys);

			// loop through the keys and print out the restaurant list
			var html = '';
			var lastReviewStatus = null;
			
            var lunchHtml = "";
            
			for(var a=0; keys[a]; a++) {
				var key = keys[a];
				var id = key.split('_')[2];
				var marker = eat.area.markers.data[id][0];
				var reviewStatus = (marker.data.rvw > 0) ? ((marker.data.rvw < eat.settings.reviewLimit) ? 'lowreviews' : '') : 'noreviews';
		
				var favoriteStatus = (marker.data.favorite) ? 'favorite' : '';
				var bookmarkStatus = (marker.data.bookmark) ? 'bookmark' : '';
				var openingStatus = marker.data.sts;
				var sponsorStatus = (marker.data.sponsor) ? 'sponsor' : '';
                var dealStatus = (marker.data.dealmsg) ? 'deal' : '';
				var rating = null;
				
				switch(eat.area.filterBar.data.ratingType) {
					case "overall": rating = (marker.data.rgo != undefined) ? marker.data.rgo : ''; break;
					case "quality": rating = (marker.data.rgq != undefined) ? marker.data.rgq : ''; break;
					case "experience": rating = (marker.data.rge != undefined) ? marker.data.rge : ''; break;
					case "price": rating = (marker.data.rgp != undefined) ? marker.data.rgp : ''; break;
				};
				
				if (reviewStatus != lastReviewStatus) {
					html += '<div class="divider">';

					if (reviewStatus == 'lowreviews') {
						html += '<h4>' + __('area.toplist.lowreviews') + ' <small>' + __('area.toplist.title.'+eat.area.filterBar.data.ratingType) + '</small></h4>';
					}
					else if (reviewStatus == 'noreviews') {
						html += '<h4>' + __('area.toplist.noreviews') + ' <small>' + __('area.toplist.title.'+eat.area.filterBar.data.ratingType) + '</small></h4>';
					}
					else {
						html += '<h4>' + __('area.toplist.goodreviews') + ' <small>' + __('area.toplist.title.'+eat.area.filterBar.data.ratingType) + '</small></h4>';
					};
					
					html += '</div>';
				};
				
				html += '<a id="toplist_entry_'+id+'" ';
				html += 'class="entry ' + bookmarkStatus + ' ' + favoriteStatus + ' ' + reviewStatus + ' ' + openingStatus + ' ' + sponsorStatus + ' ' + dealStatus + '" ';
				html += 'href="' + eat.settings.restaurantUrl + '/' + id +'">';
                
                if (marker.data.dealmsg) {
                    html += '<span class="deal" title="' + marker.data.dealmsg + '"></span>';
                }
				
			    if(marker.data.msg) {
                    html += '<div class="ad-message">';
                    html += '<div class="ad-message-header"></div>';
                    html += '<div class="ad-message-body">'+marker.data.msg+'</div>';
                    html += '<div class="ad-message-footer"></div>';
                    html += '</div>';
                }
				
				html += '<div class="rating">' + rating + '</div>';
				html += '<div class="icon"></div>';
				
				if(marker.data.cat) {
					for(b=0; b<marker.data.cat.length; b++) {
						html += '<div class="category" id="category-'+marker.data.cat[b]+'" title="'+__('area.filter.categoryFilter.category'+marker.data.cat[b])+'">&nbsp;</div>';
					};
				};
				
				// check if the label warrants a title
				if (marker.data.lbl.length > 20) {
					html += '<div class="label" title="' + marker.data.lbl + '"><span>' + marker.data.lbl;
				}
				else {
					html += '<div class="label"><span>' + marker.data.lbl;
				};
				
				;;;if (core.settings.debug) { html += id; };
				
				html += '</span></div>';
				
				html += '<div class="descr" title="'+__('area.toplist.status.'+openingStatus)+'">' + ((marker.data.dsc)?marker.data.dsc:__('area.toplist.descriptionMissing')) + '&nbsp;</div>';
				
				html += '</a>';
				
				lastReviewStatus = reviewStatus;
			}
			
			html += '<div class="entry ending"></div>';
			
			if(keys.length==0) {
				html += '<div class="entry-empty">'+__('area.toplist.noOpenRestaurants')+'</div>';
			};
			
			// update list html
			$('#top-list .data .main').html(html);
			

            
            // lunch menus
			var lunchIds = [];
            for(var a=0; lunchKeys[a]; a++) {
                var key = lunchKeys[a];
                var id = key.split('_')[3];
                lunchIds.push(id);
                var marker = eat.area.markers.data[id][0];
                var openingStatus = marker.data.sts;
                var sponsorStatus = (marker.data.sponsor) ? 'sponsor' : '';
                var dealStatus = (marker.data.dealmsg) ? 'deal' : '';
                var rating = null;
                
                switch(eat.area.filterBar.data.ratingType) {
                    case "overall": rating = (marker.data.rgo != undefined) ? marker.data.rgo : ''; break;
                    case "quality": rating = (marker.data.rgq != undefined) ? marker.data.rgq : ''; break;
                    case "experience": rating = (marker.data.rge != undefined) ? marker.data.rge : ''; break;
                    case "price": rating = (marker.data.rgp != undefined) ? marker.data.rgp : ''; break;
                };
                
                lunchHtml += '<a id="lunchlist_entry_' + id + '" href="' + eat.settings.restaurantLunchMenuUrl + '/' + id + '" class="entry ' + openingStatus + ' ' + sponsorStatus + ' ' + dealStatus + '">';
                
                if (marker.data.dealmsg) {
                    lunchHtml += '<span class="deal" title="' + marker.data.dealmsg + '"></span>';
                }

                lunchHtml += '<div class="rating">' + rating + '</div>';
                lunchHtml += '<div class="icon"></div>';
                
                if(marker.data.cat) {
                    for(b=0; b<marker.data.cat.length; b++) {
                        lunchHtml += '<div class="category" id="category-'+marker.data.cat[b]+'" title="'+__('area.filter.categoryFilter.category'+marker.data.cat[b])+'">&nbsp;</div>';
                    };
                };
                
                // check if the label warrants a title
                if (marker.data.lbl.length > 20) {
                    lunchHtml += '<div class="label" title="' + marker.data.lbl + '"><span>' + marker.data.lbl;
                }
                else {
                    lunchHtml += '<div class="label"><span>' + marker.data.lbl;
                };
                
                ;;;if (core.settings.debug) { lunchHtml += id; };
                
                lunchHtml += '</span></div>';
                
                lunchHtml += '<div class="descr" title="'+__('area.toplist.status.'+openingStatus)+'">' + ((marker.data.dsc)?marker.data.dsc:__('area.toplist.descriptionMissing')) + '&nbsp;</div>';
                lunchHtml += '</a>';
            }
            lunchHtml += '<div class="entry ending"></div>';

            $('#lunch-list h3 small').html("("+lunchIds.length+")");
            $("#lunch-list").show().find(".data .main").html(lunchHtml);
            $('#lunch-list').scrollTop(0);
            $(".lunch-list-browse").toggle(lunchIds.length > 0).attr("href", $("#lunch-list .data a").eq(0).attr("href"));
            eat.area.layout.update();
			
			$.cookie('eatlunch', JSON.stringify(lunchIds), { path: '/', domain: '.eat.fi' });
			
			// toggle controls
			if(this.hideClosed == 1) {
				$('#top-list-toggle').attr('checked','checked');
			}
			else {
				$('#top-list-toggle').attr('checked','');				
			};
			
			$('#top-list-controls').show();
			
			$.cookie('eattoplist', this.hideClosed, { expires: 365, path: '/', domain: '.eat.fi' });
		}
		
		// update list count
        $('#top-list h3 small').html("("+eat.area.markers.shownIds.length+")");

		// bind mouseovers			
		$('#lists-wrapper .data a')
		.bind('mouseover', function() {
			self.showHighlight(this.id.split('_')[2]);
		})
		.bind('mouseout', function() {
			self.hideHighlight();
		});
		
		// set scrolling to top
		$('#top-list').scrollTop(0);
			
		// flash updated
		$('#lists-wrapper .list-status').show();
			
		window.setTimeout(function() {
			$('#lists-wrapper .list-status').fadeOut(1000);
		}, 1000);
    },
	
	showHighlight: function(id) {
		eat.area.markers.showHighlight(id);			
	},
	
	hideHighlight: function(id) {
		eat.area.markers.hideHighlight(id);
	},
	
	toggleLists: function(openId, closeId, closeCallback) {
	    if (eat.area.topList.opened == openId && $(closeId).is(":visible")) {
	        eat.area.topList.toggleLists(closeId, openId);
	    } else if (eat.area.topList.opened != openId) {
            eat.area.topList.opened = openId;
            
            var windowHeight = window.innerHeight||document.body.offsetHeight;
            
            $(closeId).removeClass("open").animate({ height: 30 }, closeCallback || null);
            $(openId).addClass("open").animate({ height: (core.browser.webkit && windowHeight > 930 ? windowHeight-551 : 379) });
	    }
	}
};eat.area.location = {
	openLocation:null,
	
    init: function() {
		var self = this;
		
		// general close
		$('body').bind('click', function() {
			self.closeControls();
		});
		
		$('#location-navi li')
		.bind('mouseover', function() {
			$(this).addClass('hover');
		}).bind('mouseout', function() {
			$(this).removeClass('hover');
		});
		
		var naviCity = $('#location-navi-city').bind('click', function(e) {
			self.openControls(this, 'location-city');
			e.stopPropagation();
		});
		
		$('#locationfilter')
		.bind('mouseover', function() {
		    naviCity.addClass('hover');
        }).bind('mouseout', function() {
            naviCity.removeClass('hover');
        }).bind('click', function(e) {
            self.openControls(this, 'location-city');
            e.stopPropagation();
        });
		
		$('#location-navi-presets').bind('click', function(e) {
			self.openControls(this, 'location-presets');
			e.stopPropagation();
		});
		
		$('#location-navi-current').bind('click', function(e) {
			self.showCurrentLocation($(this));
			e.stopPropagation();
		});
		if ("geolocation" in navigator) {
			$('#location-navi-current').show();
		}
		
		$('#location-presets li, #location-city li')
		.bind('mouseover', function() {
			$(this).addClass('hover');
		}).bind('mouseout', function() {
			$(this).removeClass('hover');
		});
		
		$('#location-navi-address').bind('click', function(e) {
			self.openControls(this, 'location-address');
			e.stopPropagation();
		});

		$('#location-address, #location-presets, #location-city').bind('click', function(e) {
			e.stopPropagation();
		});
		
		$('.location-close').each(function() {
			$(this).bind('click', function() {
				self.closeControls();
			});
		});
		
        $('#address-input').val(__('area.location.address.example')).addClass('dimmed').bind('focus', function(){
            if ($(this).is('.dimmed')) {
                $(this).val('');
                $(this).removeClass('dimmed');
                $('#address-submit').attr('disabled', false);
            };
        });
        
        $('#address-submit').bind('click', function(){
            self.setAddress();
        }).attr('disabled', true);
        
        $('#address-form').bind('submit', function(){
            self.setAddress();
            return false;
        });

        this.citySearch.init();        
        this.otherCities.init();
    },
	
	openControls: function(obj, id) {
		var open = true;
		
		if (this.openLocation) {
			if (this.openLocation == id) {
				open = false;
			}
			
			this.closeControls();
		}

		if (open) {
			$('#'+id).show();
	
			$(obj).addClass('active');
			
			this.openLocation = id;		
		}
	},

	closeControls: function() {
		$('#'+this.openLocation).hide();				

		this.openLocation = null;
		
		$('#location li').removeClass('active');
	},
    
	setPreset: function(lat, lng, zoom) {
		this.closeControls();
		
		window.setTimeout(function() {
            eat.area.map.gMap.setCenter(new GLatLng(lat, lng), zoom);
		}, 250);
	},
	
    setAddress: function() {
		var self = this;
        var geocoder = new GClientGeocoder();
        var address = $('#address-input').val();
        
        if (address != '') {
            geocoder.getLocations(address, function(response){
                var map = eat.area.map.gMap;
                
				if(response.Placemark) {
					self.closeControls();
					
					window.setTimeout(function() {
	                    var place = response.Placemark[0];
	                    var point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
                    
    	                map.setCenter(point);
					}, 250);
				}
				else {
					alert(__('area.location.address.invalidaddress'));
				};
            });
        };
    },
    
    showCurrentLocation: function(el) {
		var el = el || $("#location-navi-current");
		
		el.addClass("progress");
		navigator.geolocation.getCurrentPosition(function(pos) {
			if (!!pos.coords) {
				$.get(eat.settings.areaCityUrl, { lat: pos.coords.latitude, lng: pos.coords.longitude }, function(data) {
					if (!!data.city && data.city != eat.area.map.state.city) {
						document.location = eat.settings.indexUrl + '?cityId=' + data.city + '&lat=' + pos.coords.latitude + 
							'&lng=' + pos.coords.longitude + '&zoom=16&showlocation=1';
					} else {
						eat.area.map.gMap.setCenter(new GLatLng(pos.coords.latitude, pos.coords.longitude), 16);
						el.removeClass("progress");
						
						var locEl = $("#current-location");
						if (locEl.length == 0) {
							locEl = $('<div id="current-location" title="'+eat.locale.strings['area.location.navi.currentLocation']+'">').appendTo($("#gmap"));
						}
						locEl.show();
						
						GEvent.addListener(eat.area.map.gMap, 'moveend', function() {
							locEl.remove();
						});
					}
				}, "json");
			}
		}, function(err) {
			fail();
		});
		
		// remove progress indicator after 10 seconds, even if loading has not finished
		window.setTimeout(function() { fail(); }, 10000);
		
		var fail = function() {
			if (el.hasClass("progress")) {
				alert(eat.locale.strings['area.location.currentLocation.error']);
			}
			el.removeClass("progress");
		};
	},
	
	recent: {
		cities:[],
		
		city: {
			name:null,
			link:null
		},
		
		init: function() {
			this.readCookie();
			this.update();
			
			if(this.cities.length>1) {
				$('#recent-locations').show();
			}
			else {
				$('#recent-locations').hide();
			};
			
			this.saveCookie();
			this.render();
		},
		
		update: function() {
			var city = this.city.name + '|' + this.city.link;
			
			if($.inArray(city, this.cities) == -1) {
				this.cities.push(city);	
			};

			if(this.cities.length>=eat.settings.recentCities) {
				this.cities.splice(0,this.cities.length-eat.settings.recentCities);	
			};
		},
		
		readCookie: function() {
			if($.cookie('eatcities')) {
    		    var cookie = JSON.parse($.cookie('eatcities'));
				this.cities = cookie.cities;
				this.isOpen = cookie.isOpen;	
			};
		},
		
		saveCookie: function() {
            $.cookie('eatcities', JSON.stringify({
					cities: this.cities,
					isOpen: this.isOpen
				}), { expires: 30, path: '/', domain: '.eat.fi' });
		},
		
		render: function() {
			var cities = this.cities.sort();			
			var select = $('#latest-cities-select');
			
			for(var a in cities) {
				var cityArr = cities[a].split('\|');
				
				select[0].options[parseInt(a)+1] = new Option(cityArr[0], cityArr[1]);
			};
			
			select.bind('change', function() {
			    document.location = $(this).val();
			});
		}
	},
	
	citySearch: {
	    init: function() {
	        $('#city-search-text')
	        .val(__('area.location.citySearch.default'))
	        .addClass('dimmed')
	        .bind('focus', function() {
	            if($(this).is('.dimmed')) {
    	            $(this).removeClass('dimmed').val('');
    	        }
	        });
	    }
	},
	
	otherCities: {
	    init: function() {	
			$('#other-cities-select').bind('change', function() {
			    document.location = $(this).val();
			});
	    }
	}
};eat.area.social = {
    dom: {},
    
	init: function() {	
		var self = this;

        this.personal.init();	
        this.activity.init();	
        this.recommend.init();	
        this.login.init();
	},
	
	personal: {
	    data: {
	        state:null
	    },
	    
	    dom: {},
	    
	    init: function() {
	        this.dom.core = $('#personal');
	        
	        this.data.state = eat.settings.personalState;
	    },
	    
	    render: function(state) {
	        var self = this;
	        
	        if(this.data.state != state) {
                if(state == 'loggedin') {
                    eat.area.social.login.close(function() {
                        self.dom.core.removeClass('unlogged');
                        self.dom.core.addClass('loggedin');
                    });
                }
                else {
                    self.dom.core.removeClass('loggedin');
                    self.dom.core.addClass('unlogged');
                }
            }
	    }
	},
	
	login: {
	    dom: {},
	    
	    data: {
	        username: null,
	        password: null,
	        remember: 0
	    },
	    
	    init: function() {
	        var self = this;
	        
	        this.dom.core = $('#login');
            this.dom.body = this.dom.core.find('.body');
	        this.dom.form = this.dom.core.find('form');
	        this.dom.progress = this.dom.core.find('#login-progress');
	        this.dom.usernameInput = this.dom.core.find('input[name=username]');
	        this.dom.passwordInput = this.dom.core.find('input[name=password]');
	        this.dom.rememberInput = this.dom.core.find('input[name=remember]');
            this.dom.submitInput = this.dom.core.find('#login-form-submit input');
            this.dom.providers = this.dom.core.find('#login-janrain');
	        
	        this.dom.form.bind('submit', function() {
                self.doLogin();
	            
	            return false;
	        });
	        
	        $(window).bind("resize", self.render);
	        self.render();
	    },
	    
	    render: function() {
	        var self = eat.area.social.login;
	        var w = self.dom.body.width();
	        
	        if (w - 254 > 400) {
	            self.dom.providers.width(w - 400);
	        } else {
	            self.dom.providers.width(254);
	        }
	    },
	    
	    doLogin: function() {
	        var self = this;
	        
	        this.data.username = this.dom.usernameInput.val();
	        this.data.password = this.dom.passwordInput.val();
	        this.data.remember = (this.dom.rememberInput.attr('checked')?1:0);
	        
	        this.progress('show', function() {
                self.dom.submitInput.attr('disabled', true);
      
                $.post(eat.settings.ajaxLoginUrl, self.data, function(data) {
                    if(data.success) {
                        if(data.action) {
                            switch(data.action) {
                                case 'redirect': document.location = data.url; break;
                            }
                        }
                        else {
                            eat.area.social.personal.render('loggedin');
                            
                            window.setTimeout(function() {	
                            
                                // personal feeds
                                eat.area.social.activity.load();
                                eat.area.social.recommend.load();
                                
                                // userbar
                                var userbar = eat.header.userbar;
                                userbar.data.username = self.data.username;
                                userbar.data.profile = data.profile;
                                userbar.render();
                                
                                // map
                                eat.area.markers.resetMarkers();
                
                            }, 1100);
                        }
                    }
                    else {
                        self.progress('hide', function() {                        
                            alert(__('area.social.login.error'));
                            
                            self.dom.submitInput.attr('disabled', false);
                        });
                    }
                }, "json");
            });
	    },
	    
	    progress: function(state, fn) {
            var self = this;
            
            if(state=='show') {
                this.dom.progress.fadeIn(250, fn);
            }
            else {
                window.setTimeout(function() {
                    self.dom.progress.fadeOut(250, fn);
                }, 1000);
            }
	    },
	    
	    open: function(fn) {
	        this.dom.core.fadeIn(1000, fn);
	    },
	    	    
	    close: function(fn) {
	        this.dom.core.fadeOut(1000, fn);
	    }
	},
	
	activity: {
	    data: {
	        items: []
	    },
	    
	    dom: {},
	    
	    init: function() {
	        this.dom.core = $('#activity');
	        this.dom.data = $('#activity-data');
	        this.dom.footer = $('#activity-footer');
	        this.dom.pager = $('#activity-pager');
	        this.dom.progress = $('#activity-progress');
	        
            this.pager(this.dom.pager, this.data.pager);
	    },
	    
	    load: function(url) {
	        var self = this;
	        
	        this.progress('show');
	        
	        if (!url) {
	            var url = eat.settings.activityUrl 
	        };
	        
            $.post(url, {type:'personal'}, function(data) {
    	        self.progress('hide', function() {
                    self.data.items = data.items;
                    self.data.empty = data.empty;
                    self.data.pager = data.pager;
                    self.render();
    	        });
	        }, "json");
	    },
	    
	    render: function() {
	        var self = this;

	        var html = '';
	        
	        if(this.data.items) {
	            if(this.data.items.length > 0) {
                    html += '<div class="page">';
	            
                    for(var a in this.data.items) {
                        var item = this.data.items[a];
                        
                        html += '<div class="entry entry-'+item.type+'">';
                            html += '<div class="entry-start"></div>';
                            html += '<div class="entry-body">';
                                html += '<div class="entry-image"><img src="'+item.image+'" alt="" /></div>';
                                html += '<div class="entry-text">' + item.text + '</div>';
                                html += '<div class="entry-date">' + item.date + '</div>';
                            html += '</div>';
                            html += '<div class="entry-end"></div>';
                        html += '</div>';
                    }
                    
                    html += '</div>';
                }
	        }
	        
            if(this.data.empty) {
                html += this.data.empty;
            }

            this.dom.data.append(html);            

	        this.dom.page = $('.page:last');
            
            this.pager(this.dom.pager, this.data.pager);
	        
            this.dom.page.fadeIn(1000, function() {
                self.dom.pager.fadeIn(500);
            });
	    },
	    
	    pager: function(obj, html) {
	        var self = this;
	        
	        if(html) {
	            obj.html(html);
	        }
	   
            $('a', obj).click(function(e) {
                e.preventDefault();
                
                obj.fadeOut(500, function() {
                    self.load($('a', obj).attr('href'));
                });
                
                return false;
            });
	    },
	    
	    progress: function(state, fn) {
            var self = this;
            
            if(state=='show') {
                this.dom.progress.fadeIn(250, fn);
            }
            else {
                window.setTimeout(function() {
                    self.dom.progress.fadeOut(250, fn);
                }, 1000);
            }
	    }
	},
	
	recommend: {
	    data: {
	        items: []
	    },
	    
	    dom: {},
	    
	    init: function() {
	        var self = this;
	        
	        this.dom.core = $('#recommend');
	        this.dom.data = $('#recommend-data');
	        this.dom.dataBody = $('#recommend-data-body');
	        this.dom.progress = $('#recommend-progress');
	        this.dom.cards = $('#recommend-cards');
	        this.dom.nextButton = $('#recommend-cards-next');
	        this.dom.prevButton = $('#recommend-cards-prev');	        
	        
	        if($('a', this.dom.cards).length > 0) {
                self.carousel.init();
	        }
	        
	        this.dom.data
	        .bind('mouseover', function() {
	            if($('.recommend-card', self.dom.core).length > 0) {
                    self.dom.prevButton.show();
                    self.dom.nextButton.show();
                }
	        })
	        .bind('mouseout', function() {
	            self.dom.prevButton.hide();
	            self.dom.nextButton.hide();
	        });
	        
	        this.dom.nextButton.click(function(e) {
	            e.preventDefault();
	            e.stopPropagation();
	            
	            self.carousel.nextCard(true);
	        });
	        
	        this.dom.prevButton.click(function(e) {
    	        e.preventDefault();
    	        e.stopPropagation();
    	        
	            self.carousel.previousCard(true);
	        });
	    },
	    
	    load: function() {
	        var self = this;
	        
	        this.progress('show');
	        
            $.post(eat.settings.recommendUrl, {type:'personal'}, function(data) {
    	        self.progress('hide', function() {
                    self.data.items = data;
                    self.render();
    	        });
	        }, "json");
	    },
	    
	    render: function() {
	        var self = this;
	        
	        this.dom.data.hide();
	        
	        if(this.data.items) {
	            if(this.data.items.length > 0) {
    	            var html = '';            

                    for(var a in this.data.items) {
                        var item = this.data.items[a];
                        
                        html += '<a href="'+item.link+'" class="recommend-card" id="recommend-card-'+item.id+'">';
                            if(item.image) {
                                html += '<div class="recommend-card-image"><img src="'+item.image+'" alt="" /></div>';
                            }
                            else {
                                html += '<div class="recommend-card-image"><img src="'+eat.settings.noRecommendationImage+'" alt="" /></div>';
                                html += '<div class="recommend-card-image-default">'+ __('area.social.recommend.noImage') + '</div>';
                            }
                        
                            html += '<div class="recommend-card-mask">';
                                html += '<div class="recommend-card-mask-image"></div>';
                            html += '</div>';
                            
                            html += '<div class="recommend-card-text">';
                                html += '<h4>'+item.name+'<small>'+item.type+'</small></h4>';
                                html += '<div class="recommend-card-quote">'+item.quote+'</div>';
                            html += '</div>';
                        html += '</a>';
                    }
                    
    	            this.dom.cards.html(html);
    	            
                    this.dom.data.fadeIn(1000, function() {
                        self.carousel.init();   
                    });
                }
                else {
    	            this.dom.cards.html(__('area.social.recommend.empty'));
                    this.dom.data.fadeIn(1000);
                }
	        }
            else {
                this.dom.cards.html(__('area.social.recommend.empty')).show();
                this.dom.data.fadeIn(1000);
            }
	    },
	    
	    progress: function(state, fn) {
            var self = this;
            
            if(state=='show') {
                this.dom.progress.fadeIn(250, fn);
            }
            else {
                window.setTimeout(function() {
                    self.dom.progress.fadeOut(250, fn);
                }, 1000);
            }
	    },
	    
	    carousel: {
	        timer: null,
	        
	        data: {
	            index:0,
	            total:0,
	            height:220
	        },
	        
	        dom: {},
	        
	        init: function() {
	            var self = this;
	            
    	        this.dom.core = $('#recommend-cards');
    	        this.dom.counter = $('#recommend h3 small');
    	        this.data.total = $('#recommend-cards a').length;
    	        
    	        this.render(true);
    	        
    	        this.timer = window.setTimeout(function() {
    	            self.nextCard();
    	        }, 10000);
	        },
	        
	        render: function(first, force) {
	            var self = this;

                if(first) {
                    this.dom.counter.html((this.data.index+1)+'/'+this.data.total);
                }
                else {
                    if(core.browser.msie6 || force) {
                        self.dom.core.css('top', parseInt('-'+(self.data.index*self.data.height)));
                        
                        this.timer = window.setTimeout(function() {
                            self.nextCard();
                        }, 10000);
                    }
                    else {
                        this.dom.core.fadeOut(1000, function() {
                            self.dom.core.css('top', parseInt('-'+(self.data.index*self.data.height))).fadeIn(1000, function() {
                                self.timer = window.setTimeout(function() {
                                    self.nextCard();
                                }, 10000);
                            });
                        });
                    }
                    
                    self.dom.counter.html((self.data.index+1)+'/'+self.data.total);
                }
	        },
	        
	        nextCard: function(force) {
	            clearTimeout(this.timer);
	            
	            this.data.index++;
	            
	            if(this.data.index == this.data.total) {
	                this.data.index = 0;
	            }
	            
	            this.render(false, force);
	        },
	        
	        previousCard: function(force) {
	            clearTimeout(this.timer);
	            
	            this.data.index--;
	            
	            if(this.data.index == -1) {
	                this.data.index = (this.data.total-1);
	            }
	            
	            this.render(false, force);
	        }
	    }
	}
};

$(document).ready(function(){
    eat.area.social.init();
});