/*
* Really easy field validation with Prototype
* http://tetlaw.id.au/view/javascript/really-easy-field-validation
* Andrew Tetlaw
* Version 1.5.4.1 (2007-01-05)
* 
* Copyright (c) 2007 Andrew Tetlaw
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* 
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
* 
*/
var Validator = Class.create();

Validator.prototype = {
	initialize : function(className, error, test, options) {
		if(typeof test == 'function'){
			this.options = $H(options);
			this._test = test;
		} else {
			this.options = $H(test);
			this._test = function(){return true};
		}
		this.error = error || 'Validation failed.';
		this.className = className;
	},
	test : function(v, elm) {
		return (this._test(v,elm) && this.options.all(function(p){
			return Validator.methods[p.key] ? Validator.methods[p.key](v,elm,p.value) : true;
		}));
	}
}
Validator.methods = {
	pattern : function(v,elm,opt) {return Validation.get('IsEmpty').test(v) || opt.test(v)},
	minLength : function(v,elm,opt) {return v.length >= opt},
	maxLength : function(v,elm,opt) {return v.length <= opt},
	min : function(v,elm,opt) {return v >= parseFloat(opt)}, 
	max : function(v,elm,opt) {return v <= parseFloat(opt)},
	notOneOf : function(v,elm,opt) {return $A(opt).all(function(value) {
		return v != value;
	})},
	oneOf : function(v,elm,opt) {return $A(opt).any(function(value) {
		return v == value;
	})},
	is : function(v,elm,opt) {return v == opt},
	isNot : function(v,elm,opt) {return v != opt},
	equalToField : function(v,elm,opt) {return v == $F(opt)},
	notEqualToField : function(v,elm,opt) {return v != $F(opt)},
	include : function(v,elm,opt) {return $A(opt).all(function(value) {
		return Validation.get(value).test(v,elm);
	})}
}

var Validation = Class.create();

Validation.prototype = {
	initialize : function(form, options){
		this.options = Object.extend({
			onSubmit : true,
			stopOnFirst : false,
			immediate : false,
			focusOnError : true,
			useTitles : false,
			onFormValidate : function(result, form) {},
			onElementValidate : function(result, elm) {}
		}, options || {});
		this.form = $(form);
		if(this.options.onSubmit) Event.observe(this.form,'submit',this.onSubmit.bind(this),false);
		if(this.options.immediate) {
			var useTitles = this.options.useTitles;
			var callback = this.options.onElementValidate;
			Form.getElements(this.form).each(function(input) { // Thanks Mike!
				Event.observe(input, 'blur', function(ev) { Validation.validate(Event.element(ev),{useTitle : useTitles, onElementValidate : callback}); });
			});
		}
	},
	onSubmit :  function(ev){
		if(!this.validate()) Event.stop(ev);
	},
	validate : function() {
		var result = false;
		var useTitles = this.options.useTitles;
		var callback = this.options.onElementValidate;
		if(this.options.stopOnFirst) {
			result = Form.getElements(this.form).all(function(elm) { return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); });
		} else {
			result = Form.getElements(this.form).collect(function(elm) { return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); }).all();
		}
		if(!result && this.options.focusOnError) {
			Form.getElements(this.form).findAll(function(elm){return $(elm).hasClassName('validation-failed')}).first().focus()
		}
		this.options.onFormValidate(result, this.form);
		return result;
	},
	reset : function() {
		Form.getElements(this.form).each(Validation.reset);
	}
}

Object.extend(Validation, {
	validate : function(elm, options){
		options = Object.extend({
			useTitle : false,
			onElementValidate : function(result, elm) {}
		}, options || {});
		elm = $(elm);
		var cn = elm.classNames();
		return result = cn.all(function(value) {
			var test = Validation.test(value,elm,options.useTitle);
			options.onElementValidate(test, elm);
			return test;
		});
	},
	test : function(name, elm, useTitle) {
		var v = Validation.get(name);
		var prop = '__advice'+name.camelize();
		try {
		if(Validation.isVisible(elm) && !v.test($F(elm), elm)) {
			if(!elm[prop]) {
				var advice = Validation.getAdvice(name, elm);
				if(advice == null) {
					var errorMsg = useTitle ? ((elm && elm.title) ? elm.title : v.error) : v.error;
					advice = '<div class="validation-advice" id="advice-' + name + '-' + Validation.getElmID(elm) +'" style="display:none">' + errorMsg + '</div>'
					switch (elm.type.toLowerCase()) {
						case 'checkbox':
						case 'radio':
							var p = elm.parentNode;
							if(p) {
								new Insertion.Bottom(p, advice);
							} else {
								new Insertion.After(elm, advice);
							}
							break;
						default:
              new Insertion.After(elm, advice);
				    }
					advice = Validation.getAdvice(name, elm);
				}
				
				//WP+ add; for fields on single row (eg. Plz, Ort), add error message after the last field
				if (elm && (elmidafter = elm.className.match(/showidafter_([^ ]+)/)))
			  {
          advice.remove();
				  new Insertion.After($(elmidafter[1]), advice);
        }
        
        if(typeof Effect == 'undefined') {
					advice.style.display = 'block';
				} else {
					new Effect.Appear(advice, {duration : 1 });
				}
			}
			elm[prop] = true;
			elm.removeClassName('validation-passed');
			elm.addClassName('validation-failed');
			return false;
		} else {
			var advice = Validation.getAdvice(name, elm);
			if(advice != null) advice.hide();
			elm[prop] = '';
			elm.removeClassName('validation-failed');
			elm.addClassName('validation-passed');
			return true;
		}
		} catch(e) {
			throw(e)
		}
	},
	isVisible : function(elm) {
		while(elm.tagName != 'BODY') {
			if(!$(elm).visible()) return false;
			elm = elm.parentNode;
		}
		return true;
	},
	getAdvice : function(name, elm) {
		return $('advice-' + name + '-' + Validation.getElmID(elm)) || $('advice-' + Validation.getElmID(elm));
	},
	getElmID : function(elm) {
		return elm.id ? elm.id : elm.name;
	},
	reset : function(elm) {
		elm = $(elm);
		var cn = elm.classNames();
		cn.each(function(value) {
			var prop = '__advice'+value.camelize();
			if(elm[prop]) {
				var advice = Validation.getAdvice(value, elm);
				advice.hide();
				elm[prop] = '';
			}
			elm.removeClassName('validation-failed');
			elm.removeClassName('validation-passed');
		});
	},
	add : function(className, error, test, options) {
		var nv = {};
		nv[className] = new Validator(className, error, test, options);
		Object.extend(Validation.methods, nv);
	},
	addAllThese : function(validators) {
		var nv = {};
		$A(validators).each(function(value) {
				nv[value[0]] = new Validator(value[0], value[1], value[2], (value.length > 3 ? value[3] : {}));
			});
		Object.extend(Validation.methods, nv);
	},
	get : function(name) {
		return  Validation.methods[name] ? Validation.methods[name] : Validation.methods['_LikeNoIDIEverSaw_'];
	},
	methods : {
		'_LikeNoIDIEverSaw_' : new Validator('_LikeNoIDIEverSaw_','',{})
	}
});

Validation.add('IsEmpty', '', function(v) {
				return  ((v == null) || (v.length == 0)); // || /^\s+$/.test(v));
			});

Validation.addAllThese([
	['required', 'This is a required field.', function(v) {
				return !Validation.get('IsEmpty').test(v);
			}],
	['validate-number', 'Please enter a valid number in this field.', function(v) {
				return Validation.get('IsEmpty').test(v) || (!isNaN(v) && !/^\s+$/.test(v));
			}],
	['validate-digits', 'Please use numbers only in this field. please avoid spaces or other characters such as dots or commas.', function(v) {
				return Validation.get('IsEmpty').test(v) ||  !/[^\d]/.test(v);
			}],
	['validate-alpha', 'Please use letters only (a-z) in this field.', function (v) {
				return Validation.get('IsEmpty').test(v) ||  /^[a-zA-Z]+$/.test(v)
			}],
	['validate-alphanum', 'Please use only letters (a-z) or numbers (0-9) only in this field. No spaces or other characters are allowed.', function(v) {
				return Validation.get('IsEmpty').test(v) ||  !/\W/.test(v)
			}],
	['validate-date', 'Please enter a valid date.', function(v) {
				var test = new Date(v);
				return Validation.get('IsEmpty').test(v) || !isNaN(test);
			}],
	['validate-email', 'Please enter a valid email address. For example fred@domain.com .', function (v) {
				return Validation.get('IsEmpty').test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v)
			}],
	['validate-url', 'Please enter a valid URL.', function (v) {
				return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v)
			}],
	['validate-date-au', 'Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006.', function(v) {
				if(Validation.get('IsEmpty').test(v)) return true;
				var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/;
				if(!regex.test(v)) return false;
				var d = new Date(v.replace(regex, '$2/$1/$3'));
				return ( parseInt(RegExp.$2, 10) == (1+d.getMonth()) ) && 
							(parseInt(RegExp.$1, 10) == d.getDate()) && 
							(parseInt(RegExp.$3, 10) == d.getFullYear() );
			}],
	['validate-currency-dollar', 'Please enter a valid $ amount. For example $100.00 .', function(v) {
				// [$]1[##][,###]+[.##]
				// [$]1###+[.##]
				// [$]0.##
				// [$].##
				return Validation.get('IsEmpty').test(v) ||  /^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v)
			}],
	['validate-selection', 'Please make a selection', function(v,elm){
				return elm.options ? elm.selectedIndex > 0 : !Validation.get('IsEmpty').test(v);
			}],
	['validate-one-required', 'Please select one of the above options.', function (v,elm) {
				var p = elm.parentNode;
				var options = p.getElementsByTagName('INPUT');
				return $A(options).any(function(elm) {
					return $F(elm);
				});
			}]
]);

//
//
//

Validation.addAllThese([
	['validate-url-http', 'Please enter a valid URL like http://www.demo.com', function (v) {
				return Validation.get('IsEmpty').test(v) || v == 'http://' || Validation.get('validate-url').test(v)
			}],
	['validate-url-nohttp', 'Please enter a valid URL like www.demo.com', function (v) {
				return Validation.get('IsEmpty').test(v) || /^(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v)
			}],
	['validate-not-X', 'Please enter a value', function (v) {
				return v != 'X';
			}],
	['validate-plz', 'Please give valid plz (4 or 5 digits only)', function (v) {
				return v.length >= 4 && v.length <= 5 && !/[^\d-]/.test(v);
			}],
	['validate-digits-dash', 'Please give digits only and -', function (v) {
				return !/[^\d-]/.test(v);
			}],
	['validate-minlen-3', 'Please enter a value with at least 3 characters', function (v) {
				return v.length >= 3;
			}],
	['validate-abo-blz', 'Please enter 8 digits', function (v) {
				return !/[^\d-]/.test(v) && v.length == 8;
			}],
	['validate-abo-kontonummer', 'Please enter 4 to 10 digits', function (v) {
				return !/[^\d-]/.test(v) && v.length <= 10 && v.length >= 4;
			}],
	["validate-abo-cc", "Please give a valid card number", function (v) {
      var ct = null;
      switch($("CardType").value)
      {
        case "VisaCard":
          ct = "visa";
        break;
        case "EuroCard":
          ct = "eurocard";
        break;
        default:
          ct = null;
      }
      
      return ct && isValidCreditCardNumber(v, ct);
	}],
	["validate-abo-cc-date", "Please correct expiration date.", function (v) {
      var today = new Date();
      var edate = new Date($("ExpYear").value, $("ExpMon").value, 1);
      return (edate > today);
	}]	
]);

Object.extend(Validation, {
  //get query string for all fields in a form
  getFormQueryString : function(formid){
    return $H($(formid).serialize(true)).toQueryString()
  },
  hideErrorMsg : function(elmid, name){
    var elm = $(elmid);
		var prop = '__adviceMsgForId'+name.camelize();

		var advice = Validation.getAdvice(name, elm);
		if(advice != null) advice.hide();
		elm.removeClassName('validation-failed');
		elm.addClassName('validation-passed');
  },
  showErrorMsg : function(elmid, errName, errorMsg){
    var elm  = $(elmid);
    var name = errName;
		var prop = '__adviceMsgForId'+name.camelize();

		var advice = Validation.getAdvice(name, elm);
		if(advice == null) {
			advice = '<div class="validation-advice" id="advice-' + name + '-' + Validation.getElmID(elm) +'" style="display:none">' + errorMsg + '</div>'
			switch (elm.type.toLowerCase()) {
				case 'checkbox':
				case 'radio':
					var p = elm.parentNode;
					if(p) {
						new Insertion.Bottom(p, advice);
					} else {
						new Insertion.After(elm, advice);
					}
					break;
				default:
					new Insertion.After(elm, advice);
		    }
			advice = Validation.getAdvice(name, elm);
		}
		
    new Effect.Appear(advice, {duration : 1 });
		elm.removeClassName('validation-passed');
		elm.addClassName('validation-failed');
  }
  
});


var WPUtils = Class.create({
  
  initialize: function() {
  },
      
  /**
   * Load any javascript that may be found on html code
   *    
   * @param  String   html    The html code where to look for javscripts
   */   
  loadJavascriptFromHtml: function(html){
    var pageJsScripts = html.extractScripts();
    pageJsScripts.map(function(script){
      scr = script.gsub("\n", " ");
      scr = scr.gsub("\r\n", " ");
      WPUtils.loadJavascriptCode(scr);
    });
  },
  
  /**
   * Load js code in current DOM; NO evaluation is done.
   *    
   * @param  String   code    The js code to add
   */   
  loadJavascriptCode: function(code){
    
    var script = document.createElement('script');
    script.setAttribute('type', 'text/javascript');
    (Prototype.Browser.IE? (script.text = code) : (script.innerHTML = code));
    
    // InsertBefore for IE.
    // IE crashes on using appendChild before the head tag has been closed.
    var head = document.getElementsByTagName('head').item(0);
    head.insertBefore(script, head.firstChild);
  },

  /**
   * Load js from external file in current DOM
   *    
   * @param  String   code    The js file to load
   */   
  loadJavascriptFile: function(file){
    var script = document.createElement("script");
    script.setAttribute("type", "text/javascript");
    script.setAttribute("src", file);
    document.documentElement.firstChild.appendChild(script);
  },

  /**
   * Show a message inside an existent element
   *
   * @param string  msg  The message   
   * @param string  id   The html element id where show the message
   */ 
  showMessage: function(msg, id) {
    var divContent = $(id);
    
    if (!divContent)
      return false;
    
    divContent.innerHTML = msg;
    divContent.addClassName('tabmessage');
    divContent.hide();
    
		new Effect.Appear(divContent, {duration : 1 });
    
    new PeriodicalExecuter(function(pe){
      pe.stop();
      divContent.hide();
    }, 3);
    
    return true;
  },
  
  /**
   * Confirm exit, if user has unsaved data and wants to close the page
   *
   */
  confirmExit: function(){
    /*
  	for (var i in widgetForms) {
  		widgetForm = getWidgetForm(i);
  		if (widgetForm.NumChanged) {
  			return 'You have unsaved changes.';
  		}
  	}
    */
    return;
  }
  
});

//ie bugfix; instantiate class
WPUtils = new WPUtils();


//utils functions for anmelden
var WPAnmeldenCls = Class.create({

  /**
   * Anmelden tabs short texts
   */
  anmTabShortTexts : new Array(),

  /** List of EU countries  */
  anmEULands : new Array(),
  
  /**
   * is true, if current tab is expanded
   */
  anmTabIsExpanded : new Array(),
  
  /**
   * is true, if a tab is loading
   */
  anmTabIsLoading : false,
  
  /**
   * is true, reload ALWAYS the tab short description
   */
  anmTabAutoReloadDescr : new Array(),
  
  /**
   * list of messages from wl ; translation table; set here values as needed
   */
  wl : new Array(),
  
  /**
   * list of defines from php code
   */
  defines : new Array(),

  /**
   * prefix for ids of tabs; id of tab = prefix + class_name_in_php
   */
  ANMELDEN_TAB_PREFIX : 'jstabid_',

  /**
   * template for source code for geosuche offered by WP+ on ohter sites
   */
  ANMELDEN_GEOSUCHE_SOURCE_CODE_TPL : '',

  
  /**
   * Show a message inside a tab,
   *
   * @param string  msg  The message   
   * @param string  id   (optional)The tab id where to show the message
   *                      (default) :TODO: The current opened tab, from where function is called      
   */ 
  tabShowMessage: function(msg, id) {
    var tabContent = $(WPAnmelden.ANMELDEN_TAB_PREFIX+id).down('div.kastencontent');
    
    var tabContentMessage = document.createElement('div');
    tabContentMessage.innerHTML = msg;
    tabContentMessage.addClassName('tabmessage');
    tabContentMessage.hide();
    tabContent.insert(tabContentMessage);
    
		new Effect.Appear(tabContentMessage, {duration : 1 });
    
    new PeriodicalExecuter(function(pe){
      pe.stop();
      tabContentMessage.hide();
      //tabContentMessage.remove();
    }, 3);
    
    return true;
  },

  /**
   * Get the html object with a tab content
   */ 
  tabContent: function(tabid) {
    tc = $(WPAnmelden.ANMELDEN_TAB_PREFIX+tabid).down('div.kastencotent');
    return tc;
  },

  /**
   * Set the html to a tab co
   */ 
  setTabContent: function(tabid, htmlcontent) {
    tc = $(WPAnmelden.ANMELDEN_TAB_PREFIX+tabid).down('div.kastencontent');
    tc.update(htmlcontent);
  },

  /**
   * Return true if the tab is expandable, can be expanded, has a "+" link
   */
  tabIsExpandable: function(tabid) {
    var tabOpenCloseLink = $(WPAnmelden.ANMELDEN_TAB_PREFIX+tabid).down('a.tabopen');
    return (tabOpenCloseLink == 'undefined' || !tabOpenCloseLink)? false : true;
  },
  
  /**
   * Show/hide the link to open/close tab
   * Return previous image   
   */ 
  tabShowOpenCloseLink: function(tabid, show) {
    var tabOpenCloseLink = $(WPAnmelden.ANMELDEN_TAB_PREFIX+tabid).down('a.tabopen');
    if (show == 'undefined')
      show = true;
    
    if (show)
      tabOpenCloseLink.show();
    else
      tabOpenCloseLink.hide();
    
    return show;
  },

  /**
   * Set the open/close link of a tab with a certain text (ussualy an image)
   * Return previous image   
   */ 
  tabSetOpenCloseLinkImage: function(tabid, htmlimg) {
    var tabOpenCloseLink = $(WPAnmelden.ANMELDEN_TAB_PREFIX+tabid).down('a.tabopen');
    if (tabOpenCloseLink == 'undefined' || !tabOpenCloseLink)
      return '';
    
    var prevhtmlimg      = tabOpenCloseLink.innerHTML;
    tabOpenCloseLink.innerHTML = htmlimg;
    return prevhtmlimg;
  },

  /**
   * Set the loading image for open/close link of a tab
   * Return previous image   
   */ 
  tabSetLoadingImage: function(tabid) {
    return WPAnmelden.tabSetOpenCloseLinkImage(tabid, WPAnmelden.defines["TAB_IMG_LOADING"])
  },
  
  /**
   * Load the content of a anmelden tab via ajax
   *
   */ 
  tabLoad: function(id, pageParams, tabParams) {
    //alert(WPAnmelden.anmTabShortTexts[id]);
    //var tabContent = $(WPAnmelden.ANMELDEN_TAB_PREFIX+id).down('div.kastencontent');
    
    if (WPAnmelden.anmTabIsLoading)
    {
      alert("A function is already loading. Please wait.");
      return false;
    }
    
    pageParameters = {'tabid' : id, 'dummy' : new Date().getTime()};
    if (pageParams)
    {
      for(k in pageParams)
        pageParameters[k] = pageParams[k];
    }
    
    WPAnmelden.anmTabIsLoading = true;
    var tabPrevImg = WPAnmelden.tabSetOpenCloseLinkImage(id, WPAnmelden.defines["TAB_IMG_LOADING"]);
    if (!tabParams || !tabParams['openCloseLink'])
    {
      tabParams = {};
      tabParams['openCloseLink'] = tabPrevImg;
    }
    
    new Ajax.Request("get/tabcontent", {
      method: "get",
      parameters: pageParameters,
      onSuccess: function(transport, json) {
        WPAnmelden.setTabContent(id, transport.responseText);

        //set the icon +/-/loading
        WPAnmelden.tabSetOpenCloseLinkImage(id, tabParams['openCloseLink']);
        
        WPAnmelden.anmTabIsLoading = false;
        
        /* scripts are loaded with tab content via ajax; reloading them here will giver errors on IE, Opera
        * script is already loaded with html content got from get_tab_content
        */
        //WPUtils.loadJavascriptFromHtml(resp);
      }
    });
  },

  /**
   * Reload the content of a anmelden tab via ajax (toggle tab open/close)
   *
   */ 
  tabRefresh: function(id, params) {
    if (!params || params == 'undefined')
    {
      WPAnmelden.tabLoad(id);
    }
    else if (params['duration'] > 0)
    {
      new PeriodicalExecuter(function(pe){
        pe.stop();
        WPAnmelden.tabLoad(id);
      }, params['duration']);
    
    }
        
  },
  
  /**
   * Refresh the "short desrcription" content of a anmelden tab (no toggle tab open/close)
   *
   */
  tabRefreshContent: function(id) {
  	pageParameters = {'tabid' : id, 'reload_description' : 1, 'dummy' : new Date().getTime()};
  	
    new Ajax.Request("get/tabcontent", {
      method: "get",
      parameters: pageParameters,
      onSuccess: function(transport, json) {
        WPAnmelden.setTabContent(id, transport.responseText);
      }
    });
	},

  /**
   * Go to a tab, and if not expanded already, expand it
   */ 
  tabJumpTo: function(id, params) {
    WPAnmelden.tabGoToAnchor(id, params); 
    
    if (!WPAnmelden.anmTabIsExpanded[id])
      WPAnmelden.tabExpand(id, params);
    
    return false;
  },

  /**
   * Go to a tab, scroll page to tab position
   */ 
  tabGoToAnchor: function(id, params) {
    var tabHeadId = $(WPAnmelden.ANMELDEN_TAB_PREFIX+id).down('div.kastenhead');
    new Effect.ScrollTo(tabHeadId, {offset: -2});
    
    //$('tabmenus').style.position = 'absolute';
    //$('tabmenus').style.top = tabHeadId.offsetTop;
  },
  
  /**
   * Expand/close a tab inside anmelden, via AJAX
   *
   */ 
  tabExpand: function(id, pageParams) {
    var tabContent        = $(WPAnmelden.ANMELDEN_TAB_PREFIX+id).down('div.kastencontent');
    var tabAsocMenu       = $('menu_' + id);
    
    if (!pageParams)
      pageParams = {};
      
    if (!WPAnmelden.anmTabIsExpanded[id])
    {
      WPAnmelden.anmTabIsExpanded[id] = true;
      WPAnmelden.anmTabShortTexts[id] = tabContent.innerHTML;
      
      WPAnmelden.tabLoad(id, pageParams, {'openCloseLink' : WPAnmelden.defines["TAB_IMG_MINUS"]});
      
      if (WPAnmelden.tabIsExpandable(id))
      {
        tabAsocMenu.removeClassName('col3_menu');
        tabAsocMenu.addClassName('col3_menu_on');
      }
    }
    else
    {
      if (WPAnmelden.anmTabAutoReloadDescr[id] == 1)
      {
        pageParams['reload_description'] = 1;        
        WPAnmelden.tabLoad(id, pageParams, {'openCloseLink' : WPAnmelden.defines["TAB_IMG_PLUS"]});
      }
      else
        tabContent.innerHTML = WPAnmelden.anmTabShortTexts[id];

      WPAnmelden.anmTabIsExpanded[id] = false;      

      tabAsocMenu.addClassName('col3_menu');
      tabAsocMenu.removeClassName('col3_menu_on');
    }
    
    //go to anchor
    //var x = $(WPAnmelden.ANMELDEN_TAB_PREFIX+id).offsetTop
    //window.scrollBy(0, x + 120);
        
    return false;
  },

  profileEditToggleUstid: function() {
    var selcid = $('Land').value;
    if (WPAnmelden.anmEULands[selcid] == 1)
      $('ustid_div').show();
    else
      $('ustid_div').hide();  
  },

  profileEditAddEmailField: function() {
    var emailIdx = WPAnmelden.editEmailCount;
    
    //check if max count of emails reached
    if (emailIdx >= WPAnmelden.editEmailMaxNr)
      return false;
    
    if ($('editAddEmailLinkId'))
    {
      $('editAddEmailLinkId').remove();      
    }
    
    var prevEmailField = $('Email' + (WPAnmelden.editEmailCount-1));
    if (prevEmailField)
      prevEmailField.removeClassName("showidafter_editAddEmailLinkId");
    
    var html = '';
    html += '<label class="formated" for="Email' + emailIdx + '">' + WPAnmelden.wl["EMAIL_ADDR"] + ' ' + emailIdx + '(*)</label>';
    html += '<input type="text" name="Email' + emailIdx + '" id="Email' + emailIdx + '" class="validate-email showidafter_editAddEmailLinkId" size="25" />';
    if (emailIdx < WPAnmelden.editEmailMaxNr - 1)
      html += ' <a id="editAddEmailLinkId" href="#" onClick="return WPAnmelden.profileEditAddEmailField()">' + WPAnmelden.wl["txt_add_email"] + '</a>';

    var divMailElem = document.createElement('div');
    divMailElem.innerHTML = html;
    divMailElem.addClassName('clear');
    
    $('addMoreFieldSpan').insert(divMailElem);
    
    WPAnmelden.editEmailCount++;
    return false;
  },

  profileEditToggleFinePayment: function() {
    var control = $('Zahlungsweise');
    if ( control ) 
      selcid = control.value;
    else
      selcid = ''; 
    var bankArray = ['Bankinstitut_Row', 'Bankleitzahl_Row', 'Kontonummer_Row', 'Kontoinhaber_Row'];
    var ccArray = ['Kartentyp_Row', 'Kartennummer_Row', 'expiration_Row'];
    var m = Math.max( ccArray.length, bankArray.length );
    if (selcid == 'fine_ab')
    {
      for (i= 0 ; i < m ; i++ )
      {
        control1 = $(ccArray[i]);
        control2 = $(bankArray[i]);
        if ( control1 ) control1.hide();
        if ( control2 ) control2.show();
      }
    }
    else
    {
      for (i= 0 ; i < m ; i++ )
      {
        control1 = $(ccArray[i]);
        control2 = $(bankArray[i]);
        if ( control1 ) control1.show();
        if ( control2 ) control2.hide();
      }
    }
  },

  /**
   * Edit old/add new weinlotse entry in weinlotse tab
   * 
   * @param integer schl  (optional)The weinlotse entry id
   *                      (default)If no id, add new entry      
   * @param integer number  (optional)The kontakte number for which edit entry
   *                        (default)Current logged user   
   */ 
  lotseShowEdit: function(schl, number) {
    var editLotseDiv = $('divEditLotse');
    editLotseDiv.show();
    editLotseDiv.innerHTML = '';
    
    if (!schl)
      schl = "";
    if (!number)
      number = "";

    //get weinlotse entry edit form
    new Ajax.Request("save/form/lotselink", {
      method: 'post',
      parameters: "schl=" + schl + (number? '&number='+number : ''),
      onSuccess: function(transport, json) {
        editLotseDiv.innerHTML = transport.responseText;
        WPUtils.loadJavascriptFromHtml(transport.responseText);
      }
    });
    
    return true;
  },
  
  /**
   * Get array of lotse groups fom a certain vater (list of kennungs)
   * Subgroups for a group in lotse_gruppen   
   * 
   * @param integer     beridx  The index where load the new list of subgrups of vater
   */ 
  lotseGetKennungsForVater: function(beridx) {
    var nextidx = beridx + 1;
    var divCur  = $('divLotseCombos' + beridx);
    var divNext = $('divLotseCombos' + nextidx);
    var selVater= $('lotseCombo' + beridx);
    
    //get weinlotse entry edit form
    new Ajax.Request("save/form/lotselink", {
      method: "post",
      parameters: "action=getkennungs&beridx="+beridx+"&vater=" + selVater.value,
      onSuccess: function(transport, json) {
        divNext.innerHTML = transport.responseText;
        
        //remove error messages for current select
        Validation.hideErrorMsg('lotseCombo' + beridx, 'required');
        
        //remove below combos selects
        while( ++nextidx < WPAnmelden.WEINLOTSE_GRUPPEN_MAX_LEVEL && $('divLotseCombos' + nextidx) )
        {
          $('divLotseCombos' + nextidx).innerHTML = '';
        }
      }
    });

    return true;
  },

  lotseHideEdit: function() {
    $('divEditLotse').hide();
    return false;
  },
  
  lotseDelete: function(schl){
    if (!confirm(WPAnmelden.wl["JS_delete_sure"]))
      return false;
    
    //delete lotse entry 
    new Ajax.Request("save/form/lotselink", {
      method: 'post',
      parameters: "schl=" + schl + "&action=delete",
      onSuccess: function(transport, json) {
		    new Effect.Fade($('lotserow' + schl), {duration : 1});
        WPAnmelden.tabRefresh(WPAnmelden.WEINLOTSE, {duration : 1});
        return true;
      }
    });
  },
  
  lotseGetNextFreePosition: function(position) {
    var lotseComboLs = {};
    for(i=0; i < WPAnmelden.defines["WEINLOTSE_GRUPPEN_MAX_LEVEL"]; i++)
    {
      if ($('lotseCombo' + i))
      {
        lotseComboLs['lotseCombo' + i] = $('lotseCombo' + i).value;
      }
    }
    comboparams = $H(lotseComboLs).toQueryString();
    
    //get next empty position in lotse category where schl is found 
    new Ajax.Request("save/form/lotselink", {
      method: 'post',
      parameters: "action=getnextfreeposition" + "&position=" + position + '&' + comboparams,
      onSuccess: function(transport, json) {
        //new Effect.Highlight($('position'), {delay: .1, duration: 3, startColor:'#fff', endColor:'#f00'});
        new Effect.Appear($('position'), {duration : 1});
        
        $('position').value = json.nextFreePosition;
        
        return true;
      }
    });
    
  },
  
  //respider a web site
  direktabfrageNewSpider : function(knummer, site_prio) {
    
    //get weinlotse entry edit form
    new Ajax.Request("save/form/direktabfrage", {
      method: "post",
      parameters: "spider_kontakte_number="+knummer+"&spider_priority=" + site_prio,
      onSuccess: function(transport, json) {
        //divNext.innerHTML = transport.responseText;
        WPAnmelden.tabRefresh(WPAnmelden.DIREKTABFRAGE);        
      }
    });

  },
  
  
  saveFahnderKonditionen: function (knummer) {
		new Ajax.Request("save/form/direktabfrage",
		{
			method: 'get',
			parameters: "versandkonditionen="+$('versandkonditionen_txt').value+"&knummer="+knummer,
			onSuccess: function(transport,json) {
				$('versandkonditionen').innerHTML = transport.responseText;
			}
		}
		
		);
  },
  
  //get selected banner
  exchangeGetBanner : function(idbanner) {
    new Ajax.Request("get/tabcontent", {
      method: "post",
      parameters: "action=action_getbanner&tabid="+WPAnmelden.BANNERTAUSCH+"&idbanner=" + idbanner,
      onSuccess: function(transport, json) {
        $('bannerImageAndCode').innerHTML = transport.responseText;
      }
    });

  },

  /**
   * Edit old/add new kontakte entry (event) in termine tab
   * 
   * @param integer number  (optional)The termine entry id
   *                        (default)If no id, add new entry      
   */ 
  termineShowEdit: function(number) {
    var editTermineDiv = $('divEditTermine');
    editTermineDiv.show();
    editTermineDiv.innerHTML = '';
    
    if (!number)
      number = "";

    //get termine entry edit form
    new Ajax.Request("save/form/termine", {
      method: 'post',
      parameters: "number=" + number,
      onSuccess: function(transport, json) {
        editTermineDiv.innerHTML = transport.responseText;
        WPUtils.loadJavascriptFromHtml(transport.responseText);
      }
    });
    
    return true;
  },
  
  termineDelete: function(number) {
    if (!confirm(WPAnmelden.wl["JS_delete_sure"]))
      return false;
    
    //delete termine entry 
    new Ajax.Request("save/form/termine", {
      method: 'post',
      parameters: "number=" + number + "&action=delete",
      onSuccess: function(transport, json) {
		    new Effect.Fade($('terminerow' + number), {duration : 1});
        WPAnmelden.tabRefresh(WPAnmelden.KALENDER, {duration : 1});
        return true;
      }
    });
    
  },
  
  termineHideEdit: function() {
    $('divEditTermine').hide();
    return true;
  },  
    

  /**
   * Edit old/add new telegram alert
   */ 
  vertelegramShowEdit: function(number) {
    var editTermineDiv = $('divEditVerTelegram');
    editTermineDiv.show();
    editTermineDiv.innerHTML = '';
    
    if (!number)
      number = "";

    //get termine entry edit form
    new Ajax.Request("save/form/verkostungstelegram", {
      method: 'post',
      parameters: "vtelNummer=" + number,
      onSuccess: function(transport, json) {
        editTermineDiv.innerHTML = transport.responseText;
        WPUtils.loadJavascriptFromHtml(transport.responseText);
      }
    });
    
    return true;
  },
  
  vertelegramDelete: function(number) {
    if (!confirm(WPAnmelden.wl["JS_delete_sure"]))
      return false;
    
    //delete termine entry 
    new Ajax.Request("save/form/verkostungstelegram", {
      method: 'post',
      parameters: "vtelNummer=" + number + "&vtelaction=delete",
      onSuccess: function(transport, json) {
		    new Effect.Fade($('vertelrow' + number), {duration : 1});
        WPAnmelden.tabRefresh(WPAnmelden.VERKOSTELEGRAM, {duration : 1});
        return true;
      }
    });
    
  },
  
  vertelegramHideEdit: function() {
    $('divEditVerTelegram').hide();
    return true;
  },
  
  
  /**
   * Bezug add months to a wine, edit bezug data for a wine
   */     
  bezugAddMonths: function(bezugRecNo, monthsNr) {
    monthsNr = $('months' + bezugRecNo).value;
    if (monthsNr < 0)
      monthsNr = 0;
    
    //update 
    new Ajax.Request("save/form/bezug", {
      method: 'post',
      parameters: "action=addmonths&bezugRecNo=" + bezugRecNo + '&months=' + monthsNr,
      onSuccess: function(transport, json) {
        //new Effect.Opacity($('bezugrow' + bezugRecNo), {duration:1.0, from:0, to:1.0});
        //new Effect.Highlight($('bezugrow' + bezugRecNo), {delay: .1, duration: 3, startColor:'#fff', endColor:'#f00'});
        WPAnmelden.tabRefresh(WPAnmelden.BEZUGSQUELLE);
        
        return true;
      }
    });
    
  }, 

  bezugEdit: function(bezugRecNo) {
    if ($("bezugedit"+bezugRecNo).visible())
    {
      $("bezugedit"+bezugRecNo).hide();
      return false;
    }
    
    //update 
    new Ajax.Updater("bezugedit"+bezugRecNo, "save/form/bezug", {
      method: 'post',
      parameters: "action=showedit&bezugRecNo=" + bezugRecNo,
      onSuccess: function(transport) {
        $("bezugedit"+bezugRecNo).show();
      }      
    });
  },
  
  bezugHideEdit: function(bezugRecNo) {
    $("bezugedit"+bezugRecNo).hide();
  },
  
  bezugSaveEdit: function(bezugRecNo) {
    //save data form; 
    new Ajax.Request("save/form/bezug", {
      method: "post",
      parameters: Validation.getFormQueryString("editBezug" + bezugRecNo),
      onSuccess: function(transport, json) {
        WPAnmelden.bezugHideEdit(bezugRecNo);
		    //new Effect.Fade($('bezugrow' + bezugRecNo), {duration : 1});
      }
    });
    
  },



  /**
   * Show announcement to edit
   */       
  announceShowEdit: function(anounceNo) {
    //save data form; 
    new Ajax.Request("save/form/announcements", {
      method: "post",
      parameters: "annummer=" + anounceNo + "&anaction=anEdit",  
      onSuccess: function(transport, json) {
        $('divEditAnnounce').innerHTML = transport.responseText;
        WPUtils.loadJavascriptFromHtml(transport.responseText);
        $('divEditAnnounce').show(); 
      }
    });
    
  }, 

  announceDelete: function(announceNo) {
    if (!confirm(WPAnmelden.wl["JS_delete_sure"]))
      return false;
    
    //delete termine entry 
    new Ajax.Request("save/form/announcements", {
      method: 'post',
      parameters: "annummer=" + announceNo + "&anaction=anDel",
      onSuccess: function(transport, json) {
		    new Effect.Fade($('annrow' + announceNo), {duration : 1});
        WPAnmelden.tabRefresh(WPAnmelden.ANNOUNCEMENTS, {duration : 1});
        return true;
      }
    });
    
  }, 
  
  announceHideEdit: function() {
    $('divEditAnnounce').hide();
    return true;
  },


  /**
   * Honorar 
   */          
  honorarGetDetails: function(art) {
    //get details on an autohonorar
    new Ajax.Updater("honorarMainDiv", "save/form/autorenhonorar", {
      method: 'post',
      parameters: "art=" + art,
      onSuccess: function(transport, json) {
      }
    });
    
  },



  /**
   * Abo functions
   */ 
  aboGetZahlungsweiseList: function(abotype) {

    //get list
    new Ajax.Request("save/form/abo", {
      method: 'post',
      parameters: "action=getpaylist&abotype=" + abotype,
      onSuccess: function(transport, json) {
        $("aboPayMethodsDiv").innerHTML = transport.responseText;
      }
    });
    
    return true;
  },



  /**
   * Edit old/add new weinfuehrer files
   * 
   * @param integer number  (optional)The file id in erzeuger_gallery table
   *                        (default)If no id, add new file       
   */ 
  weinfuehrerFileShowEdit: function(number) {
    var editFileDiv = $('divEditWeinfuehrer');
    editFileDiv.show();
    editFileDiv.innerHTML = '';
    
    if (!number)
      number = "";

    //get termine entry edit form
    new Ajax.Request("save/form/weinfuehrer", {
      method: 'post',
      parameters: "nummer=" + number,
      onSuccess: function(transport, json) {
        editFileDiv.innerHTML = transport.responseText;
        WPUtils.loadJavascriptFromHtml(transport.responseText);
      }
    });
    
    return true;
  },
  
  weinfuehrerFileDelete: function(number) {
    if (!confirm(WPAnmelden.wl["JS_delete_sure"]))
      return false;
    
    //delete entry 
    new Ajax.Request("save/form/weinfuehrer", {
      method: 'post',
      parameters: "nummer=" + number + "&action=delete",
      onSuccess: function(transport, json) {
		    new Effect.Fade($('erzfilerow' + number), {duration : 1});
        WPAnmelden.tabRefresh(WPAnmelden.WEINFUEHRER, {duration : 1});
        return true;
      }
    });
  },
  
  
  // functions for new Anzeigenbörse
	
anzeigenInitiateCreation: function () {
  		new Ajax.Request(
	  	"../anmelden_inc/anzeigen.php?action=loadCategories",
	  	{
	  		method: 'get',
	  		onSuccess: function (transport,json) {
	  			$('announces_container').innerHTML = transport.responseText;
	  		}
	  	}
	  	);	
  	},
  	
  	anzeigenCategoryChanged: function () {
  		var a_category	= $('announce_category').value;
  		if (a_category != 0) {
	  		new Ajax.Request("../anmelden_inc/anzeigen.php?action=categoryChanged&category="+ a_category, {
	  			method: 'get',
			  	onSuccess: function (transport,json) {
			  		$('AnnounceCreationContainer').innerHTML = transport.responseText;
			  }	
	  		});
  		}
  	},
  	
  	anzeigenCreateAnnouncement: function () {
  		if (arguments.length > 0) {
  			var moreActions		= arguments[1];
  			var whichAnzeige 	= "_"+arguments[0];
	  	} else {
	  		var whichAnzeige = '';
	  	}
	  	if (whichAnzeige > '_')
  			var parameters = $('announceCreationForm'+ whichAnzeige).serialize();
		else
			var parameters = $('announceCreationForm').serialize();
  		if (moreActions > '') {
  			var whichContainer 	= 'announceContainer'+arguments[0];
  			var url = "../anmelden_inc/anzeigen.php?action=createAnnouncement&"+ parameters +"&moreActions="+ moreActions +"&whichAnzeige="+ whichAnzeige;
		} else {
			var whichContainer = 'AnnounceCreationContainer';
			var url = "../anmelden_inc/anzeigen.php?action=createAnnouncement&"+ parameters;
		}
		new Ajax.Request(url, {
  			method: 'get',
  			onComplete: function (transport,json) {
  				$(''+whichContainer+'').innerHTML = transport.responseText;
  			}
  		}
	  	);
			
  	},
  	anzeigenLoadAnnouncement: function (id) {
      if ($('announceContainer'+id).style.display == 'none') {
		  var url = "../anmelden_inc/anzeigen.php?action=loadSingleAnnouncement&whichAnnouncement="+id;
		  new Ajax.Request(url,{
		  		method: 'get',
		  		onLoading: function () {
		  			$('announceContainer'+id).innerHTML = "Loading...<img src='http://www.wein-plus.de/images/indicator.gif'/>";
		  			$('announceContainer'+id).show();	
		  		},
		  		onSuccess: function (transport,json) {
		  			$('announceContainer'+id).innerHTML = transport.responseText;
		  		}
		  });	
	  } else {
	  	$('announceContainer'+id).hide();
	  }
  	},
  	extendedAnnounceSearch: function () {
  		if ($('category').value != '0') {
	  		var url = "../anmelden_inc/anzeigen.php?action=buildExtendedSearch&category="+ $('category').value;
	  		  new Ajax.Request(
			  url,
			  {
			  	method: 'get',
			  	onComplete: function(transport,json) {
			  		$('searchCategorySelect').style.width = '155px';
			  		$('extendedSearch').innerHTML = transport.responseText;
			  		$('universalSearch').hide();
			  	}
			  }
			  );   	
	 	} else {
	 		$('searchCategorySelect').style.width = '100px';
	 		$('universalSearch').show();
	 		$('extendedSearch').innerHTML = '';
	 	}
  	},

	anzeigenDeactivateAnnouncement: function (id) {
		var checkConfirm = confirm("Anzeigen wirklich deaktivieren? Dieser Vorgang kann nicht rÃ¼ckgÃ¤ngig gemacht werden.");
		var url = "../anmelden_inc/anzeigen.php?action=deactivateAnnouncement&announce_id="+id;
		if (checkConfirm == true) {
			new Ajax.Request(
			url,
			{
				method: 'get',
				onComplete: function() {
					alert("Anzeige erfolgreich deaktiviert.");
				}
			}
			);
		}
	},
	
	// Functions for Visitenkarte New
	editVisit: function (id) {
		var indicator = '<img src="http://www.wein-plus.de/images/indicator.gif">';
		new Ajax.Request(
		"../anmelden_inc/inside-visit-body.php3?LoadData="+id+"",
		{
			method: 'get',
			onLoading: function () {
				$(''+id+'').innerHTML = indicator;	
				if ($(''+id+'').style.display == 'none') {
					$(''+id+'').style.backgroundColor = 'white';
					$(''+id+'').appear();
				} else {
					$(''+id+'').hide();
				}
			},
			onSuccess: function (transport, json) {
				$(''+id+'').innerHTML = transport.responseText;
			}
		}
		);
	},
	
	saveVisitData: function (form_id) {
		var indicator = '<img src="http://www.wein-plus.de/images/indicator.gif">';
		var params = Form.serialize(''+ form_id +'');
		var url = "../anmelden_inc/ajax-save-visit-new.php3";
		new Ajax.Request (
			url,
			{
				method: 'post',
				parameters: params,
				onLoading: function () {
					$('insideTabVisit').innerHTML = indicator;
				},
				onSuccess: function (transport, json) {
					$('insideTabVisit').hide();
					$('insideTabVisit').innerHTML = transport.responseText;	
					$('insideTabVisit').appear();
				}				
			}
		);	
	},
	
	/*
	* BDO Data Edit
	*
	*/
	
	BDOswapImage: function (id) {
		var down = '<img src="http://www.wein-plus.de/images/pfeil_runter.gif" border="0">';
		var norm = '<img border="0" src="../images/pfeil.gif">';
		var curImg = $('img_'+id+'').innerHTML;
		
		if (curImg == down) {
			$('img_'+id+'').innerHTML = norm;
		} else {
			$('img_'+id+'').innerHTML = down;
		}
		if ($('content_'+id+'').style.display == 'none') {
			$('content_'+id).show();
		} else {
			$('content_'+id).hide();
		}
	},
	
	BDOEditData: function (id) {
		if ($('content_'+id+'').style.display != 'none') {
			WPAnmelden.BDOswapImage(id);
			return;
		}
		if (id == 's3') {
			var mitnum = $('mitnum').value;
			WPAnmelden.loadJobList(mitnum);
		}
		var args = '';
		for (var i = 0; i < WPAnmelden.BDOEditData.arguments.length; i++) {
		 	if (i != 0) {
		 	 	if (args.length == 0) {
		 	 		if ($(''+WPAnmelden.BDOEditData.arguments[i]+''))
					  args = WPAnmelden.BDOEditData.arguments[i] +"="+ $(''+WPAnmelden.BDOEditData.arguments[i]+'').innerHTML;
					if (document.getElementsByName(WPAnmelden.BDOEditData.arguments[i]))
					  args = WPAnmelden.BDOEditData.arguments[i] +"="+ document.getElementsByName(WPAnmelden.BDOEditData.arguments[i]).value;
				}
				else {
					if ($(''+WPAnmelden.BDOEditData.arguments[i]+''))
						args = args + "&" + WPAnmelden.BDOEditData.arguments[i] +"="+ $(''+WPAnmelden.BDOEditData.arguments[i]+'').innerHTML;
					if (document.getElementsByName(WPAnmelden.BDOEditData.arguments[i]))
						args = args + "&" + WPAnmelden.BDOEditData.arguments[i] +"="+ document.getElementsByName(WPAnmelden.BDOEditData.arguments[i]).value;		
				}					
			}
		}
		if (args.length > 0) {
			new Ajax.Request(
			"../anmelden_inc/inside-bdo-edit.php3?edit&" + args,
			{
				method: 'get',
				onLoading: function () {
					$('content_'+id+'').innerHTML = '<img src="../images/indicator.gif" /> Lade Daten...';	
					WPAnmelden.BDOswapImage(id);
				},
				onSuccess: function (transport, json) {
					new Effect.Highlight('content_'+id+'', {startcolor: '#ffff99', endcolor:'#ffffff'});
					$('content_'+id+'').innerHTML = transport.responseText;
				}
			}
			);
		}
	},
	
	BDOsaveForm: function (id) {
		var params = Form.serialize(''+id+'');
		new Ajax.Request(
		"../anmelden_inc/ajax-save-bdo.php3",
		{
			method: 'get',
			parameters: params,
			onSuccess: function (transport, json) {
			 	new Ajax.Request(
					"../anmelden_inc/inside-bdo.php3",
					{
						method: 'get',
						onSuccess: function (transport, json) {
							$('bdo_area').innerHTML = "<h2>&Auml;nderungen erfolgreich gespeichert</h2>" + transport.responseText;
						}
					} 
				);
			}
		}
		);	
	},
	
	// BDO js-functions for "Betriebsdaten"
	loadJobList: function (mitnum)
	{
	$('joblist').innerHTML = 'Loading...';
		new Ajax.Request('../vertrieb/bdo_editres.php3', {
			method: 'post',
			parameters: 'action=loadjoblist&bdo_number=' + mitnum,
			onSuccess: function(transport, json) {
				$('joblist').innerHTML = transport.responseText;
				alert(transport.responseText);
			}
		});
	},
	
	showEditFormJob: function (mitnum, jobid)
	{
	if (jobid == 'undefined')
		jobid = 0;
	
	$('editjob').innerHTML = 'Loading...';
		new Ajax.Request('../vertrieb/bdo_editres.php3', {
			method: 'post',
			parameters: 'action=editjob&bdo_number=' + mitnum + '&jobid=' + jobid,
			onSuccess: function(transport, json) {
				$('editjob').innerHTML = transport.responseText;
			}
		});
	},
	
	saveFormJob: function (form, mitnum, jobid)
	{
	if (jobid == 'undefined')
		jobid = 0;
		
		var moreparams = $H(form.serialize(true)).toQueryString();
		
		new Ajax.Request('../vertrieb/bdo_editres.php3', {
			method: 'post',
			parameters: moreparams + '&action=saveeditjob&bdo_number=' + mitnum + '&jobid=' + jobid,
			onSuccess: function(transport, json) {
				$('editjob').innerHTML = transport.responseText;
				loadJobList(mitnum);
			}
		});
	},
	
	deleteFormJob: function (jobid)
	{
	if (jobid == 'undefined')
		jobid = 0;
		
		new Ajax.Request('../vertrieb/bdo_editres.php3', {
			method: 'post',
			parameters: 'action=deleditjob&jobid=' + jobid,
			onSuccess: function(transport, json) {
				loadJobList(currentMitnum);
			}
		});
	},
	
	cancelFormJob: function () {
		$('editjob').innerHTML = '';
	},
	
	languageAddNew: function () {
		var lng = $('addlang').value;
		if (lng)
		{
			if ($('Fremdsprachen').value)
					$('Fremdsprachen').value += ', ';
				$('Fremdsprachen').value += $('addlang').value;  		
		}
	},

	/**
	*	Presse-Section
	*/
		
	genPreviewImage: function() {
		$('previewImage').submit();	
	},
	
	genPressePreview: function(ftype) {
		var options = $('presseForm').serialize();
		new Ajax.Request("../anmelden_inc/inside-presse-body.php3?preview=1&ftype="+ ftype , {
			method: 'post',
			parameters: options,
			onComplete: function (transport,json) {
				$('preview').innerHTML = transport.responseText;
				$('preview').show();
			}
		}
		);	
	}, 
	
	PresseCheckForm: function() {
		var e = $('nachricht');
		var allowedLength = 7000;
		var allowedLengthShort = 350;
		var msg = " Zeichen nicht Ã¼berschreiten.\nBitte kÃ¼rzen Sie den Inhalt.";
		
		if ($('kurztitel').value == '' || $('langtitel').value == '' || $('kurznachricht').value == '' || $('nachricht').value == '') {
			alert('Bitte fÃ¼llen Sie alle Felder aus.');
			return false;
		}
		if (e.value.length > allowedLength) {
			alert("Der Inhalt von \"Langtext\" ("+  e.value.length  +" Zeichen) darf "+ allowedLength + msg);
			return false;
		} 
		
		if ($('kurznachricht').value.length > allowedLengthShort) {
			alert("Der Inhalt von \"Kurztext\" ("+  $('kurznachricht').value.length  +" Zeichen) darf "+ allowedLengthShort + msg);
			return false;
		}
		
		var options = $('presseForm').serialize();
		new Ajax.Request("save/form/presse",{
			parameters: options,
			onComplete: function (transport,json) {
				$('presseContainer').innerHTML = transport.responseText;
			}
		});
	},
	
  /**
   * Edit update geosuche coord
   */ 
  geosucheUpdateJsNewCoords: function() {
    if (!$('geoupdWidth'))
      return;
    
    /** update textarea with gmap source code with new coordinates */
    var tplVars = {width: $('geoupdWidth').value, height: $('geoupdHeight').value, heightp15: parseInt($('geoupdHeight').value) + 15};
    var sc      = WPAnmelden.ANMELDEN_GEOSUCHE_SOURCE_CODE_TPL;
    var isFirstTime = false;
    if (!sc)
    {
      sc = WPAnmelden.ANMELDEN_GEOSUCHE_SOURCE_CODE_TPL = $('geoupdSourceCode').value;
      isFirstTime = true;
    }
    var tpl     = new Template(sc);
    var res     = tpl.evaluate(tplVars);
    
    $('geoupdSourceCode').value = res;
    if (!isFirstTime)
    {
      new Effect.Opacity('geoupdSourceCode', {duration:1.0, from:0.5, to:1.0});
    }
  },
   
  /** Geocoding function; get location (lat,lng) for an address */ 
  geosucheShowAddress: function() {
    var locationField = document.getElementById("location");  
    var street = document.getElementById("street").value;
    var plz = document.getElementById("plz").value;
    var ort = document.getElementById("ort").value;
    var land = document.getElementById("Land").value;
    land = arrayLandEng[land];
    var btnSave = document.getElementById("btnSave");
    
    if (street) street += ', ';
    if (plz) plz += ', ';
    if (ort) ort += ', ';
    
    var address = street + plz + ort + land;
    //alert(address);
  
    // ====== Create a Client Geocoder ======
    var geo = new GClientGeocoder(new GGeocodeCache()); 
    
    // ====== Array for decoding the failure codes ======
    var reasons=[];
    reasons[G_GEO_SUCCESS]            = "Success";
    reasons[G_GEO_MISSING_ADDRESS]    = "Missing Address: The address was either missing or had no value.";
    reasons[G_GEO_UNKNOWN_ADDRESS]    = "Unknown Address:  No corresponding geographic location could be found for the specified address.";
    reasons[G_GEO_UNAVAILABLE_ADDRESS]= "Unavailable Address:  The geocode for the given address cannot be returned due to legal or contractual reasons.";
    reasons[G_GEO_BAD_KEY]            = "Bad Key: The API key is either invalid or does not match the domain for which it was given";
    reasons[G_GEO_TOO_MANY_QUERIES]   = "Too Many Queries: The daily geocoding quota for this site has been exceeded.";
    reasons[G_GEO_SERVER_ERROR]       = "Server error: The geocoding request could not be successfully processed.";
    
    // ====== Perform the Geocoding ======        
    geo.getLatLng(address, function (point) {
      // ===== If that was successful, plot the point and centre the map ======
      if (point) {
        markerD.setPoint(point);
        map.setCenter(point,14);
        locationField.value = point.lat() + "," + point.lng();
      }
      // ====== Decode the error status ======
      else {
        // ==Look to see if the query was cached ==
        var result=geo.getCache().get(address);
        if (result) {
          var reason="Code "+result.Status.code;
          if (reasons[result.Status.code]) {
            reason = reasons[result.Status.code]
          }
        } else {
          var reason = "";
        } 
        //alert('$txtAddressNotFound "'+address+ '" ' + reason);
        alert(WPAnmelden.wl["JS_txtAddressNotFound"]);
      }
    });
  }
  
});


//ie bugfix; instantiate class
WPAnmelden = new WPAnmeldenCls();


/**
 * Functions for generating an ajax region select
 * 
 * 
 */ 
var WPRegionsCls = Class.create({

  /**
   * Ids/names for land,anbau,bereich html select fields eg. <select id="jkeyland">....
   */
  regSelLand : 'jkeyland', 
  regSelAnbau : 'jkeyanbau', 
  regSelBereich : 'jkeyber', 
  regSelErzeuger : 'jkeyerz', 

  /**
   * Ids/names for land,anbau,bereich html parents; eg <tr id="jDivLand"><td>Land</td><td>select...</td></tr> 
   */
  regDivLand : 'jDivLand',  
  regDivAnbau : 'jDivAnbau', 
  regDivBereich : 'jDivBereich', 
  regDivErzeuger : 'jDivErzeuger', 
  
  /**
   * Get list of subregions / erzeugers for vertelgram
   */
  regionGetVertelgramSubregionsFor: function(marker, selAnb, selBer, selErz) {
    selAnb = selAnb? selAnb : $F(WPRegions.regSelAnbau);
    selBer = selBer? selBer : $F(WPRegions.regSelBereich);
        
    if (marker.name == WPRegions.regSelLand || !selAnb)
    { //show anbaus
      if (!$(WPRegions.regSelLand).value || $(WPRegions.regSelLand).value == 'ALLE')
      {
        $(WPRegions.regDivAnbau).hide();
        $(WPRegions.regDivBereich).hide();
        $(WPRegions.regDivErzeuger).hide();
        return;
      }
      
      $(WPRegions.regDivAnbau).show();
      $(WPRegions.regDivBereich).hide();
      $(WPRegions.regDivErzeuger).hide();
      
      new Ajax.Updater("jSelAnbau", "getfunction/vtelegramregions", {
        parameters: "selItem=" + selAnb + "&marker=" + $(WPRegions.regSelLand).value + "&selName=" + WPRegions.regSelAnbau
      });
      
      return;
    }

    $(WPRegions.regDivBereich).show();
    $(WPRegions.regDivErzeuger).show();
    
    //show bereichs, erzeugers
    if (marker.name == WPRegions.regSelAnbau)
    {
      new Ajax.Updater("jSelBereich", "getfunction/vtelegramregions", {
        parameters: "selItem=" + selBer + "&marker=" + selAnb + "&selName=" + WPRegions.regSelBereich
      });
    }
    cmarker = selBer? selBer : selAnb;
    new Ajax.Updater("jSelErzeuger", "getfunction/vtelegramregions", {
      parameters: "geterz=1&selItem=" + selErz + "&marker=" + cmarker + "&selName=" + WPRegions.regSelErzeuger
    });
    
  },
  
  /**
   * Get list of subregions for a region (a marker in regionen table) 
   * Marker is html object the list of subregions will be added dynamicly 
   *   
   * @param object    marker    The html object with region marker for which get its list of subregions
   */
  regionGetSubregionsFor: function(marker) {
    var divn = null; //div
    var seln = null; //select
    
    if (marker.name == WPRegions.regSelLand)
    { //show anbaus
      divn  = WPRegions.regDivAnbau;
      seln  = WPRegions.regSelAnbau;
      $(WPRegions.regDivAnbau).hide();
      $(WPRegions.regDivBereich).hide();
    }
    
    if (marker.name == WPRegions.regSelAnbau)
    { //show bereichs
      divn  = WPRegions.regDivBereich;
      seln  = WPRegions.regSelBereich;
      $(WPRegions.regDivBereich).hide();
    }
    
    //get subregions only
    new Ajax.Request("getfunction/subregions", {
      method: "get",
      parameters: "marker=" + marker.value + "&selName=" + seln,
      onSuccess: function(transport, json) {
        var innerHTML = transport.responseText;
                
        if ($(seln) && $(seln).up()) {
          ($(seln).up()).innerHTML = innerHTML;
          
          if (json.RegionCount > 0)
            $(divn).show();
        }
        
      }
    });
    
    return true;
  }
  
});

//ie bugfix; instantiate class
WPRegions = new WPRegionsCls();





//
// -----------------------------------------------------------------------------
//

/** load geosuche gmap for anmelden geosuche tab */
geosucheLoadMap = function () 
{
  if (GBrowserIsCompatible()) 
  {
    map = new GMap2(document.getElementById("gmap"));
    map.setCenter(new GLatLng(WPAnmelden.GEOSUCHE_LAT, WPAnmelden.GEOSUCHE_LNG), 16, G_HYBRID_MAP);
    
    map.enableContinuousZoom();
    map.enableDoubleClickZoom();
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl(),
    new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10, 10)));  
    
    /////Draggable marker
    var point = new GLatLng(WPAnmelden.GEOSUCHE_LAT, WPAnmelden.GEOSUCHE_LNG);
    markerD = new GMarker(point, {icon:G_DEFAULT_ICON, draggable: true}); 
    markerD.enableDragging();
    map.addOverlay(markerD);
        
    GEvent.addListener(markerD, "drag", function(){
      document.getElementById("location").value = markerD.getPoint().toUrlValue();
    });
    
  }
}

isValidCreditCardNumber = function(cardNumber, cardType)
{
  var isValid = false;
  var ccCheckRegExp = /[^\d ]/;
  isValid = !ccCheckRegExp.test(cardNumber);

  if (isValid)
  {
    var cardNumbersOnly = cardNumber.replace(/ /g,"");
    var cardNumberLength = cardNumbersOnly.length;
    var lengthIsValid = false;
    var prefixIsValid = false;
    var prefixRegExp;

    switch(cardType)
    {
      case "eurocard":
        lengthIsValid = (cardNumberLength == 16);
        prefixRegExp = /^5(1|2|3|4|5)/;
        break;

      case "mastercard":
        lengthIsValid = (cardNumberLength == 16);
        prefixRegExp = /^5[1-5]/;
        break;

      case "visa":
        lengthIsValid = (cardNumberLength == 16 || cardNumberLength == 13);
        prefixRegExp = /^4/;
        break;

      case "amex":
        lengthIsValid = (cardNumberLength == 15);
        prefixRegExp = /^3(4|7)/;
        break;

      default:
        prefixRegExp = /^$/;
        alert("Card type not found");
    }

    prefixIsValid = prefixRegExp.test(cardNumbersOnly);
    isValid = prefixIsValid && lengthIsValid;
  }

  if (isValid)
  {
    var numberProduct;
    var numberProductDigitIndex;
    var checkSumTotal = 0;

    for (digitCounter = cardNumberLength - 1; 
      digitCounter >= 0; 
      digitCounter--)
    {
      checkSumTotal += parseInt (cardNumbersOnly.charAt(digitCounter));
      digitCounter--;
      numberProduct = String((cardNumbersOnly.charAt(digitCounter) * 2));
      for (var productDigitCounter = 0;
        productDigitCounter < numberProduct.length; 
        productDigitCounter++)
      {
        checkSumTotal += 
          parseInt(numberProduct.charAt(productDigitCounter));
      }
    }

    isValid = (checkSumTotal % 10 == 0);
  }

  return isValid;
}
