// JAVASCRIPT der konoform-Extension
//
//
//var konoform = Class.create({
//	fehlerfarbe = '#b30000',
//	normfarbe = '#000',
//	
//});

var fehlerfarbe = '#b30000',  normfarbe = '#000';


document.observe("dom:loaded", function() {
	
	
	
	
	
    var form = $$('form').find(function(form) {
        return form.id.indexOf("konoform_") == 0;
    });
    if(form) {
    
    	$$('label.kf_help_label').each(function(label) {
    		new Tooltip(label, label.id.replace(/_label/, "_help"));
    	});
    	
        function check_dependencies(field, value) {
        return function (event) {
                if(this.value == value) {
                    // bei Radio und Check  ist dies eh imer der Fall:
                    var tagName = this.tagName.toLowerCase() ;
                    var required = field.up("div.konoform_object").down("span.konoform_required");
                    
                    if(tagName == "input" && (this.type == 'checkbox' || this.type == 'radio')) {
                        if(this.checked) {
                            field.enable();
                            required.show();
                        } else {
                            field.disable();
                            required.hide();
                        }
                    } else {
                        field.enable();
                        required.show();
                    }
                } else {
                    field.disable();
                    required.hide();
                }
            }
        }
        
        // nach Abhängigkeiten suchen:
        var form_id = form.name.substr(form.name.lastIndexOf("_") + 1);
        var fields = form.getElements().find(function(field) {
            var matches =  field.className.match(/kf_required_\\([^ ]+)/);
            if(matches) {
                var rule = matches[1];
                var matches = rule.match(/([^(]+)\((.+)\)/);
                var fieldname = matches[1];
                var value = matches[2];
                var field_id = "tx_konoform_pi1_" + fieldname + form_id + value;
                var checker = check_dependencies(field, value);
                checker.bind($(field_id)).call();
                form.select("*[name='" + $(field_id).name + "']").invoke("observe","change", checker.bind($(field_id)));
                return true;
            }
            return false;
       });
    }
});


function konoform_check_form(cssId) {
    var fehler = false, value, actualYear, radio;
	//fehler zurücksetzen:
    var form = $(cssId);
    cssId.getElements().each(function(el){
        el.error=false;
        
        if(el.disabled) {
			return;
		}
        if(el.hasClassName('kf_required')) {
            fehler |= checkRequiredField(el);
        }
        
        if(el.hasClassName('kf_email')) {
            if($F(el) != '' && !$F(el).match(/.*@.*/)) {
                red_label(el, "kf_email_error");
                fehler = true;
            } else  if(!el.error){
                black_label(el, "kf_email_error");
            }
        }
        
        if(el.hasClassName('kf_number')) {
            value = $F(el).replace(",", ".");
            if(value != '' && isNaN(value)) {
                red_label(el, "kf_number_error");
                fehler = true;
            } else if(!el.error){
                el.value= ((Math.floor(value * 100) / 100) + "").replace(".", ",");
                black_label(el, "kf_number_error");
            }
        }
        
        if(el.hasClassName('kf_integer')) {
            value = $F(el);
            if(value != '' && parseInt(value) != value) {
                red_label(el, "kf_integer_error");
                fehler = true;
            } else if(!el.error){
                black_label(el, "kf_integer_error");
            }
        }
        
        if(el.className.indexOf('kf_minlength(') > -1) {
            var matches = el.className.match(/kf_minlength\((\d+)\)/);
            if(matches) {
                var minlength = matches[1];
                if($F(el).length < 1 * minlength) {
                    red_label(el, "kf_minlength_error");
                    fehler = true;
                } else if(!el.error){
                    black_label(el, "kf_minlength_error");
                }
            }
         }
         
          if(el.className.indexOf('kf_maxlength(') > -1) {
            var matches = el.className.match(/kf_minlength\((\d+)\)/);
            if(matches) {
                var maxlength = matches[1];
                if($F(el).length > 1 * maxlength) {
                    red_label(el, "kf_maxlength_error");
                    fehler = true;
                } else if(!el.error){
                    black_label(el, "kf_maxlength_error");
                }
            }
         }
         
          if(el.hasClassName('kf_zipcode')) {
            value = $F(el);
            if(value != '' && (isNaN(value) || value.length != 5)) {
                red_label(el, "kf_zipcode_error");
                fehler = true;
            } else if(!el.error){
                black_label(el, "kf_zipcode_error");
            }
        }
         
         
     });

    
    
	
	
/*

	cssId.down(".kf_day").each(function(el){
	if(el.disabled) {
			return;
		}
		value = $F(el);
		if(value != '' && (isNaN(value) || value < 1 || value > 31)) {
			red_label(el, "day_error");
			fehler = true;
		} else  if(!el.error){
			black_label(el, "day_error");
		}
	});

	cssId.down(".kf_month").each(function(el){
	if(el.disabled) {
			return;
		}
		value = $F(el);
		if(value != '' && (isNaN(value) || value < 1 || value > 12)) {
			red_label(el, "month_error");
			fehler = true;
		} else  if(!el.error){
			black_label(el, "month_error");
		}
	});

	cssId.down(".kf_year").each(function(el){
        if(el.disabled) {
			return;
		}
		value = $F(el);
		actualYear = new Date().getFullYear();
		if(value != '' && (isNaN(value) || value < 1900 || value > actualYear+1)) {
			red_label(el, "year_error");
			fehler = true;
		} else  if(!el.error){
			black_label(el, "year_error");
		}
	});
	cssId.down(".kf_dependend").each(function(el){

		radio  = $(el).getAttribute("idref");
		if($(radio).checked) {
			if($F(el) == '') {
				red_label(el, "dependend_error");
				fehler = true;
			} else if(!el.error){
				black_label(el, "dependend_error");
			}
		}
	});
	cssId.down(".kf_number").each(function(el){
        if(el.disabled) {
			return;
		}
		value = $F(el).replace(",", ".");
		if(value != '' && isNaN(value)) {
			red_label(el, "number_error");
			fehler = true;
		} else if(!el.error){
			el.value= ((Math.floor(value * 100) / 100) + "").replace(".", ",");
			black_label(el, "number_error");
		}
	});
*/
	if(fehler && $('success') != null) {
		$('success').hide();
	}

	return !fehler;
}



function red_label(el, errorid) {
//	alert(el.id + "_" + errorid);
    // console.info(el.id + "_" + errorid, $(el.id + "_" + errorid))
	kf_js_error(el.id + "_" + errorid);
	el.addClassName("kf_error"); // style.border="1px solid " + fehlerfarbe;
//		alert(el.id + "_label");
	if($(el.id + "_label") != null) {
		$(el.id + "_label").addClassName("kf_error"); // style.color=fehlerfarbe;
		// new Effect.Highlight(el.id + "_label", {duration:8, startcolor:'#ffffff', endcolor:'#D5E9FD'});
	}
	el.error=true;
	
	el.up("div.konoform_object").addClassName("kf_error");
    var names = el.name.match(/\[([^[]+)\]$/);
    if(names) {
        el.up("div.konoform_object").addClassName("kf_error_" + names[1]);
    }
    
	
}
function black_label(el, errorid) {
	if($(el.id + "_" + errorid) != null) {
        $(el.id + "_" + errorid).removeClassName("kf_error"); // style.color=fehlerfarbe;
		$(el.id + "_" + errorid).hide();
	}
	el.removeClassName("kf_error");
    
	if($(el.id + "_label") != null) {
        $(el.id + "_label").removeClassName("kf_error"); //		$(el.id + "_label").style.color=normfarbe;
	}
	
	el.up("div.konoform_object").removeClassName("kf_error");
    var names = el.name.match(/\[([^[]+)\]$/);
    if(names) {
        el.up("div.konoform_object").removeClassName("kf_error_" + names[1]);
    }
}



	function checkRequiredField(el) {
		var fehler = false, ok, radios, name;
		if(el.tagName == "INPUT" && el.type=="radio") {
			var radios = $$("input[name="+el.name +"]");
			var ok = radios.find(function(el) {return r.checked;});

			var name = el.name.replace("[", "_").replace("]", "_");
			if(!ok) {
				$( name + "_kf_required_error").hide();
				if($(el.id + "_label") != null) {
					$(el.id + "_label").addClassName("kf_error"); // style.color=fehlerfarbe;
					new Effect.Highlight(el.id + "_label", {duration:8, startcolor:'#ffffff', endcolor:'#D5E9FD'});
				} 
				fehler = true;
				radios.invoke("removeClassName", "kf_error"); // each(function(r) {r.style.backgroundColor=fehlerfarbe;});
			} else {
				$(name + "_kf_required_error").hide();
				radios.invoke("removeClassname", "kf_error"); //radios.each(function(r) {r.style.backgroundColor=normfarbe;});
				if($(el.id + "_label") != null) {
					$(el.id + "_label").removeClassName("kf_error"); // style.color=normfarbe;
				}
			}
		} else if(el.tagName == "INPUT" && el.type=="checkbox") {
			if(! el.checked) {
				red_label(el, "kf_required_error");
				fehler = true;
			} else {
				black_label(el, "kf_required_error");
			}
		} else
		if(el.tagName=='INPUT' && (el.type=="text" || el.type == 'hidden') || el.tagName=="SELECT" || el.tagName == 'TEXTAREA') {
			if($F(el) == null || $F(el) == '' ||  $F(el) == '0' ) {
				red_label(el, "kf_required_error");
				fehler = true;
			}
			else  if(!el.error){
				black_label(el, "kf_required_error");
			} else {
            }
		}
		return fehler;
	}
	
	function kf_js_error(error_label) {
		if($(error_label) != null) {
			$(error_label).show();
			var tooltipp = $(error_label + "_text");
			if(tooltipp){
				var tt =  new Tooltip(error_label, tooltipp);
			}
		}
	}

function duplicate_group(elem) {
	var fieldset1 = elem.up("fieldset");
	var fieldset2 = fieldset1.clone(true);
	var inputs1 = fieldset2.select("input[type='text']", "textarea", "select").invoke("setValue", "");
	var inputs2 = fieldset2.select("input[type='checkbox'", "input[type='radio'").pluck("checked", false);
	elem.remove();
	var inputs = inputs1.concat(inputs2);
	var matches = inputs1[0].name.match(/\[(\d+)\]/);
	var index = matches[1];
	var index2 = (1 * index) + 1;
	fieldset2.id = fieldset2.id + index2;
	var legend = fieldset2.down("legend");
	fieldset2.down("span.group_delete").update("<img src='fileadmin/graphics/icons/delete.png' />").observe("click", function(event) {
		var fieldset = this.up("fieldset");
		var link = fieldset.down('a.duplicate_group_link');
		if(link) {
			//Vorgänger finden und dort den Link aktivieren
			link.remove();
			var fieldset2 = fieldset.previous("fieldset");
			if(fieldset2) {
				fieldset2.insert(link);
			}
		}
		fieldset.remove();
	});
	
	var legendText = (legend.textContent ? legend.textContent : legend.innerText);
	legendText = legendText.replace(/^([\d]+\. )/, '');
	fieldset2.down("legend").update((1 + index2) + ". " + legendText);
	fieldset1.insert({after:fieldset2});
	inputs.each(function(el) {
		el.name = el.name.replace("["+index+"]", "["+index2+"]");
		var label = el.up("div.konoform_object").down("label[for='"+el.id+"']");
		if(label) {
			label.id = label.id.replace("_"+index+"_", "_"+index2+"_");
			label.setAttribute("for", label.getAttribute("for").replace("_"+index+"_", "_"+index2+"_"));
			label.removeClassName("kf_error");
		}
		el.id = el.id.replace("_"+index+"_", "_"+index2+"_");
		el.removeClassName("kf_error");
	});
	
}




/*
 * Copyright (c) 2006 Jonathan Weiss <jw@innerewut.de>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */


/* tooltip-0.1.js - Small tooltip library on top of Prototype 
 * by Jonathan Weiss <jw@innerewut.de> distributed under the BSD license. 
 *
 */

var Tooltip = Class.create();
Tooltip.prototype = {
  initialize: function(element, tool_tip) {
    var options = Object.extend({
      default_css: false,
      margin: "0px",
	  padding: "5px",
	  backgroundColor: "#d6d6fc",
	  delta_x: 10,
	  delta_y: -10,
      zindex: 10000
    }, arguments[1] || {});

    this.element      = $(element);
    this.tool_tip     = $(tool_tip);

    this.options      = options;

    // hide the tool-tip by default
    this.tool_tip.hide();
    // this.tool_tip.absolutize();
    this.eventMouseOver = this.showTooltip.bindAsEventListener(this);
    this.eventMouseOut   = this.hideTooltip.bindAsEventListener(this);

    this.registerEvents();
  },

  destroy: function() {
    Event.stopObserving(this.element, "mouseover", this.eventMouseOver);
    Event.stopObserving(this.element, "mouseout", this.eventMouseOut);
  },

  registerEvents: function() {
    Event.observe(this.element, "mouseover", this.eventMouseOver);
    Event.observe(this.element, "mouseout", this.eventMouseOut);
  },

  showTooltip: function(event){
	Event.stop(event);
	// get Mouse position
    var mouse_x = Event.pointerX(event);
	var mouse_y = Event.pointerY(event);
	
	
	// decide if wee need to switch sides for the tooltip
	var dimensions = Element.getDimensions( this.tool_tip );
	var element_width = dimensions.width;
	var element_height = dimensions.height;
	 //console.info(event);
	if ( (element_width + mouse_x) >= ( this.getWindowWidth() - this.options.delta_x) ){ // too big for X
		mouse_x = mouse_x - element_width;
		// apply delta to make sure that the mouse is not on the tool-tip
		mouse_x = mouse_x - 2 * this.options.delta_x;
       // console.info("1", mouse_x);
	} else {
		mouse_x = mouse_x + this.options.delta_x;
        // console.info("2", mouse_x);
	}
	
	if ( (element_height + mouse_y) >= ( this.getWindowHeight() - this.options.delta_y) ){ // too big for Y
		mouse_y = mouse_y - element_height;
	    // apply delta to make sure that the mouse is not on the tool-tip
		mouse_y = mouse_y - this.options.delta_y;
	} else {
		mouse_y = mouse_y + this.options.delta_y;
	} 
	
	// now set the right styles
	this.setStyles(mouse_x, mouse_y);
	
		
	// finally show the Tooltip
	//new Effect.Appear(this.tool_tip);
	new Element.show(this.tool_tip);

  },
  
  setStyles: function(x, y){
    var offset = $('wrapper').cumulativeOffset();
    x = x - offset[0];
    // set the right styles to position the tool tip
	Element.setStyle(this.tool_tip, { 
                                      position:'absolute',
	 								  left:x + "px",
                                      // top: y + "px",
									  zIndex:this.options.zindex
	 								});
	
	// apply default theme if wanted
	if (this.options.default_css){
	  	Element.setStyle(this.tool_tip, { margin:this.options.margin,
		 								  padding:this.options.padding,
		                                  backgroundColor:this.options.backgroundColor,
										  zIndex:this.options.zindex
		 								});	
	}	
  },

  hideTooltip: function(event){
	//new Effect.Fade(this.tool_tip);
	new Element.hide(this.tool_tip);
  },

  getWindowHeight: function(){
    var innerHeight;
	if (navigator.appVersion.indexOf('MSIE')>0) {
		innerHeight = document.body.clientHeight;
    } else {
		innerHeight = window.innerHeight;
    }
    return innerHeight;	
  },
 
  getWindowWidth: function(){
    var innerWidth;
	if (navigator.appVersion.indexOf('MSIE')>0) {
		innerWidth = document.body.clientWidth;
    } else {
		innerWidth = window.innerWidth;
    }
    return innerWidth;	
  }

}
