﻿runtime_calc = {
	topobject : function (m, org) {
		var prices = {
			"1" : 200,
			"2" : 360,
			"3" : 480,
			"6" : 840,
			"12" : 1200	
		};
		var price = (m * org).toFixed(0);
		//var skonto = ((1- ((m-1) * 2)/100) * price).toFixed(0);
		var skonto = prices[m];
		return { "price" : price, "skonto" : skonto }
	}	
};

// Watermark Plugin
(function ($) {
    $.fn.watermark = function (watermark) {
        return this.each(function () {
            var ctrl = $(this);
            if (watermark == "" || watermark == null) watermark = $(this).attr("title");
			ctrl.data("watermarktext", watermark);
			
			// Bei sumbit enfernen
			var form = ctrl.parents("FORM").first();
			if(form.length>0) {
				form.submit(function(e) {
					removeWatermark(ctrl);
				});
			}

            ctrl.focus(function (event) {
            	removeWatermark($(this));
            }).blur(function (event) {
               	addWaterMark($(this));
            });
            
            addWaterMark(ctrl);
        });

		function updateWatermark(ctrl) {
			var txt = ctrl.val();
			ctrl.data("watermarked", txt  == "");
			if (ctrl.data("watermarked")) addWaterMark(ctrl);
		}
        function addWaterMark(ctrl, text) {
            if(ctrl.val() == "") ctrl.data("watermarked", true).val(ctrl.data("watermarktext")).addClass("watermark");
			else ctrl.data("watermarked", false);
        }
        function removeWatermark(ctrl) {
            if(ctrl.data("watermarked")) ctrl.removeClass("watermark").val("");
        }
    };
})(jQuery);

/* runtime selector */
(function($) {	
	var methods = {
		init : function (options) {			
			return this.each(function() {
				var settings = {
					selected : 1,
					selectedIndex : 0,
					months : [1,2,3],
					calculator : function(duration) { return -duration; },
					onchange : null,
					inputfield : null,
					cssclass : "runtime-selector"
				};
					
				var container = $(this);
				if(options) $.extend(settings, options); 
				container.addClass(settings.cssclass);
									
				$(settings.months).each(function(index, val){
					if(val == settings.selected) settings.selectedIndex = index;
					container.append($("<div></div>").text(val).addClass("lightshadow item glosstop"));
				});
				container.mouseleave(function() {
					$(this).runtimeselector("selectButton", settings.selectedIndex);
				});
				container.find("DIV").mouseenter(function() {
					var index = $(this).index();
					container.runtimeselector("selectButton", index);
				}).click(function() {
					var selIndex = $(this).index();
					container.data("settings").selectedIndex = selIndex;
					if(settings.inputfield) settings.inputfield.val(settings.months[selIndex]);
				});
			
				container.data("settings", settings);
				
				$(this).runtimeselector("selectButton", settings.selectedIndex);
			});	
		},
		
		getval : function () {
			var sett = $(this).data("settings");
			if(!sett) return null;
			return sett.selected;
		},
		
		update : function() {
			return this.each(function() {
				var sett = $(this).data("settings");
				$(this).runtimeselector("selectButton", sett.selectedIndex);
			});
		},
		// Einen Button wählen und Preis neu rechnen
		selectButton : function (pos) {
			return this.each(function() {
				var obj = $(this).find(".item").eq(pos);
				obj.prevAll().andSelf().addClass("ybg");
				obj.nextAll().removeClass("ybg");
				
				var settings = $(this).data("settings");
				settings.selected = settings.months[pos];
				$(this).data("settings", settings);
				var price = settings.calculator(settings.months[pos], this);
				if(settings.onchange) settings.onchange(price, this, settings.months[pos]);
				if(settings.inputfield) settings.inputfield.val(settings.months[pos]);
			});
		}	
	};
	
	$.fn.runtimeselector = function(method) {
	    if ( methods[method] ) {
	      return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
	    } else if ( typeof method === 'object' || ! method ) {
	      return methods.init.apply( this, arguments );
	    } else {
	      $.error( 'Method ' +  method + ' does not exist on jQuery.runtimeselector' );
	    }    
	}
})(jQuery);

/* countbox */
(function($) {
	$.fn.countbox = function(options) {
		var settings = {
			"initial" : 0,
			"val" : 0,
			"step" : 1,
			"min" : 0,
			"max" : null,
			"cssclass" : null,
			onchange : null,
			speed : 300
		};
		
		return this.each(function() {
			if(options) $.extend(settings, options);
			settings.val = settings.initial;
			
			var obj = $(this).addClass("countbox");
			if(settings.cssclass != null) obj.addClass(settings.cssclass);
			var height = settings.size;
			obj.css({	'-moz-user-select':'none',
	                    '-webkit-user-select':'none',
	                    'user-select':'none',
						"line-height": height+"px",
						"position" : "relative",
						"text-align" : "center",
						width : settings.size + "px",
						height : settings.size + "px"
					});
			// Container
			var cont = $("<div></div>").addClass("numholder").css({position:"absolute", left:0, top:0, right:0, bottom:0, overflow:"hidden"});
			cont.append(cont.clone().attr("class", null).addClass("num").text(settings.val));
			obj.empty().append(cont);
			
			// Buttons erzeugen
			var wtemp = Math.round(height*0.45) -1;
			var param = { cursor:"pointer", "font-size" : wtemp+"px", "line-height" : (wtemp*0.9)+"px",  height: wtemp+"px", width : wtemp + "px", top : -1, right : (-wtemp - 6)+"px",  position: "absolute"}
			var upbox = $("<div></div>").addClass("countbox-button countbox-up").css(param).text("+");
			delete param.top;
			param.bottom = "-1px";
			var downbox = $("<div></div>").addClass("countbox-button countbox-down").css(param).text("-");
			obj.append(upbox);
			obj.append(downbox);
			
			function updateValue(dir) {
				var org = cont.find(".num").addClass("removable");
				var clone = org.first().clone();
				clone.text(settings.val);
				clone.css("top", (-1*dir * height)+"px");
				cont.append(clone.removeClass("removable"));
				clone.animate({"top":0}, {	
											duration : settings.speed,
											step : function (now, fx) { org.css("top", (now + dir*height));},
											complete : function () { cont.find(".removable").remove(); }
										 });
				if(settings.onchange) settings.onchange(settings.val, obj);
			}
			
			upbox.click(function(e) {
				var next = settings.val + settings.step;
				if(settings.max != null && settings.max < next) return;
				settings.val = next;
				updateValue(1);
			});
			downbox.click(function() {
				var next =  settings.val - settings.step;
				if(settings.min != null && settings.min > next) return;
				settings.val = next;
				updateValue(-1);
			});
			
			updateValue(0);
		});
	}	
})(jQuery);

/* Starbox */
(function($) {
	$.fn.starbox = function(options, newval) {
		var settings = {
			onchange : null,
			onchanged : null,
			value : 0,
			name : "stars",
			max : 5,
			active_class : "selected"
		};
		
		function starboxSetValue(con, newval) {
			con.find("INPUT[name="+settings.name+"]").val(newval);
			con.mouseleave();
		}
		
		return this.each(function() {
			if(typeof(options) == "string") {
				if(options == "value") {
					if(newval == undefined) return $(this).find("INPUT[name="+settings.name+"]").val();
					else starboxSetValue($(this), newval);
				}
				return;
			}
			
			if(options) $.extend (settings,options);
			var con = $(this);
			if(con.hasClass("built")) return;
			con.addClass("starbox").addClass("built");
			var star = $("<div />").addClass("star");
			for(i=0;i<settings.max;i++) con.append(star.clone());
			var hidden = con.find("INPUT[name="+settings.name+"]");
			if (hidden.length > 0) {
				settings.value = hidden.val();	
				settings.name = hidden.attr("name");
			}
			else con.append($("<input />").attr("type","hidden").attr("name", settings.name).attr("id", settings.name).attr("value", settings.value));
			
			
			// Hover Effekt
			$(".star", con)
	    	.mouseenter(function(e) {
	    			$(this).prevAll(".star").andSelf().addClass("selected");
	    			$(this).nextAll(".star").removeClass("selected");
	    		})
	    	// Stern wählen
	    	.click(function(e) {
	    		var newVal = $(this).prevAll(".star").length + 1;
	    		var input = con.find("INPUT[name="+settings.name+"]");
	    		if(input.val() == newVal) newVal = 0;

				// prechange
				if(settings.onchange) if(!settings.onchange(con, newVal)) return;
	    		input.val(newVal);
	    		starboxSetValue(con, newVal);
				//postchange
				if(settings.onchanged) settings.onchanged(con,newVal);

	    	});
	    	
	    	con.mouseleave( function(e) {
				var con = $(this);
				var index = con.find("INPUT").val();
				var stars = con.find(".star").removeClass("selected");
				if(index > 0) stars.eq(index-1).prevAll(".star").andSelf().addClass("selected");
			}).mouseleave();
			
		});
	}
})(jQuery);

/* Highlight Plugin */
(function ($) {
	$.fn.highlight = function() {
		return this.each(function() {
			var off = $(this).offset();
			var img  = $("<img></img>").attr("src", "/content/img/icons/forward.png").css("position", "absolute").css("left", -64).css("top", off.top + $(this).height() / 2 - 32);
			$("BODY").append(img);
			img.animate({"left": off.left - 64}, 500).delay(1000).fadeOut("fast", function() { $(this).remove(); });
		});
	}
})(jQuery);

/*                    tinyTips Plugin                      */
/*                      Mike Merritt                       */
(function(a){a.fn.tinyTips=function(b){var c='<div class="tinyTip"><div class="content"></div></div>';var d=300;var e;var f;a(this).hover(function(){a("body").append(c);e=a("div.tinyTip");e.hide();if(b==="title"){var g=a(this).attr("title")}else{if(b!=="title"){var g=b}}a(".tinyTip .content").html(g);f=a(this).attr("title");a(this).attr("title","");var j=e.height()+17;var h=(((e.width()-10)/2))-(a(this).width()/2);var k=a(this).offset();var i=k;i.top=k.top +17;i.left=k.left-h;e.css("position","absolute").css("z-index","1000");e.css(i).fadeIn(d)},function(){a(this).attr("title",f);a("div.tinyTip").fadeOut(d,function(){a(this).remove()})})}})(jQuery);

// HILFSFUNKTIONEN

/* errorlabel erzeugen */
function createErrorLabel(ctrl, mess) {
	var ctrl = $(ctrl);
	// content
	var  lab = $("<div></div>").addClass("formerror-content");
	// arrow
	var arr = $("<div></div>").addClass("formerror-arrow"); for(var i = 10; i > 0 ; i--) arr.append($("<div />").addClass("formerror-line formerror-line"+i));
	var name = ctrl.attr("name");
	var label = $("<label></label>").addClass("formerror").attr("for", name).attr("generated", true);
	//  höhe bei textarea anpassen
	if(ctrl.is("TEXTAREA")) label.css("height", (ctrl.height()+ 42)+"px");
	label.append(lab);
	label.append(arr);
	// Text
	$(".formerror-content", label).text(mess);
	// aufklappen
	ctrl.parents(".moreopt").show();
	return label;
}

/* Fehlerlabel anzeigen */
function placeErrorLabel(label, element) {
	label.insertBefore(element);
}

// MAP

// geolayer verschieben
function geo_layer_static(sel) {
	return $("#geo_layer").css({ position:"relative", top:0, left: 0, "margin-bottom" : 12}).removeClass("lightshadow lightgradient hardborder").insertAfter(sel);
}	
// elemente anhand der ausgewählten locations filtern
function filter_by_loc(sel) {
	var visiblecount = 0;
	$(sel).each(function(index, val) {
		var lft = $(val).attr("data-loc-lft");
		var rgt = $(val).attr("data-loc-rgt");
		var visible = false;
		jQuery.each(selected_locations, function (index, val) {
			var loc = loc_find(val);
			if(loc[2] <= lft && loc[3] >= rgt) {
				visible = true;
				visiblecount ++;
				return false;
			}
		});	
		$(val).toggle(visible);
	});				
	return visiblecount;
}	
// Location finden
function loc_find(id) {
	return uidata["loc"][id];
}		
// Prüfen ob Location gewählt
function loc_is_selected(id) {
	return jQuery.inArray(id, selected_locations) != -1;
}
// Element in Geosuche wählen/abwählen
function loc_set_selectedclass(id, enabled) {
	var item = $("#location_"+id).removeClass("halfsel");
	if(enabled) item.addClass("sel");
	else item.removeClass("sel");
}
// Abwählen
function loc_unselect(item) {
	var pos = selected_locations.indexOf(item[0]);
	if(pos != -1) {		
		loc_set_selectedclass(item[0], false);
		selected_locations.splice(pos,1);
		checkParentCheckedStatus(item);
		loc_update_selected();
	}
}
// Alle abwählen
function loc_unselect_all() {
	jQuery.each(selected_locations, function(index,val) {
		 loc_unselect(loc_find(val));
	});
}
// Gewählte Locations ausgeben
function loc_update_selected() {
	var list = $("#gemeindewahl_selected").html("");
	
	var names = [];
	$.each(selected_locations, function(index, val) {
		var loc = uidata["loc"][val];
		var lnk = $("<img></img>").attr("src", "/content/img/cross_s.png")
									.attr("locid", loc[0]);
		lnk.click(function(e) { loc_unselect(loc_find($(this).attr("locid"))); });
		list.append($("<li></li>").append(lnk).append(loc[1]));
		list.append($("<input></input>").attr("type","hidden").attr("name", "location["+loc[0]+"]").attr("value", loc[2]+";"+loc[3]));
		names.push(loc[1]);
	});
	$("#search_location").val(names.join(";"));
	list.toggle(selected_locations.length > 0);
	// Callback
	if(typeof selected_loc_changed == 'function') selected_loc_changed(selected_locations);
}
// ID aus DOM ID ermitteln
function loc_id_fromdomid(id) {
	return parseInt(id.substring(9));
}
// Auswählen
function loc_select(item) {
	if(loc_is_selected(item[0])) return;
	
	// Falls Premiumobjekte angezeigt werden, das passenste zum Ort finden
	if(typeof poshowbyid != "undefined") findPremiumObject(item);
	
	var newSel = [];
	$.each(selected_locations, function (index, val) {
		var tmp = uidata["loc"][val];
		// Prüfen ob Element übergeordnet ist
		if(tmp[2] < item[2] && tmp[3] > item[3]) { loc_set_selectedclass(tmp[0], false); return; }
		// Prüfen ob Element untergeordnet
		if(tmp[2] > item[2] && tmp[3] < item[3]) { loc_set_selectedclass(tmp[0], false); return; }
		// Übernehmen
		newSel.push(val);
	});
	
	newSel.push(item[0]);
	loc_set_selectedclass(item[0], true);
	selected_locations = newSel;
	
	checkParentCheckedStatus(item);
	loc_update_selected();
}

// Passendes Premiumobjekt finden
function findPremiumObject(item) {
	var lft = item[2];
	var rgt = item[3];
	var found = false;
	$.each(premiumobjects, function (index, map) {
		// Prüfen ob enthalten
		if(map[1]>=lft && map[2]<=rgt) {
			poshowbyid(map[0]);
			found = true;
			return false;
		}
	}); 
	
	// Falls nichts gefunden, in der nächsthöheren Ebene suchen
	if (!found && item[4] != 0) {
		var parent = uidata["loc"][item[4]];
		findPremiumObject(parent);
	}
}	

// Check Status für eine Location anhand seiner gewählten Unterelemente ermitteln
function checkParentCheckedStatus(loc) {
	if(!loc[4]) return; // Kein Parent
	// Parent im Bild ?
	var parent = $("#location_"+loc[4]);
	if(parent.length == 0) return;
	
	// Siblings ermitteln
	var hasSel=false, hasUnsel=false;
	$.each(uidata["loc"], function(index, val) {
		// Wenn Element gleiches Elternelement hat
		if(val[4] == loc[4]) {
			var sel = loc_is_selected(val[0]);
			if(sel) hasSel = true;
			else	hasUnsel = true;
			if(hasSel && hasUnsel) return false;
		}
	});
	
	// Passende Klasse setzen
	if(hasSel && hasUnsel) parent.removeClass("sel").addClass("halfsel");
	else if(!hasUnsel) parent.removeClass("halfsel").addClass("sel");
	else if(!hasSel) parent.removeClass("sel").removeClass("halfsel");	
}
		
function priceLinToExp(val) {
	var val =  Math.floor(20000  * (Math.exp( val / 21.713 )-1));
	val = Math.floor(val/1000) * 1000;
	return val;
}		
function priceExpToLin(val) {
	return Math.ceil(21.713 * Math.log(val / 20000 + 1));
}
// SVG Unterstützung prüfen
function supportsSvg() {
	return  document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#BasicStructure', '1.1') ;
}
// Bezirke in SVG Map ein/ausblenden
function fadeInBezirk(bez) {
	bez.addClass("active").attr('transform', " translate(-100 -400) scale(2) rotate(30)").animate({svgTransform: 'translate(0 0) rotate(0) scale(1)'}, 350);
}
function fadeOutBezirk(bez) {
	bez.removeClass("active").animate({svgTransform: "scale(3) rotate(30) translate(100 200)"}, 300);
}

// indexOf für IE implementieren
if(!Array.indexOf){
	    Array.prototype.indexOf = function(obj){
	        for(var i=0; i<this.length; i++){
	            if(this[i]==obj){
	                return i;
	            }
	        }
	        return -1;
	    }
	}
