// Get a style property (name) of a specific element (elem)
function getStyle( elem, name ) {
	// If the property exists in style[], then it's been set recently (and is current)
	if (elem.style[name])
		return elem.style[name];

	// Otherwise, try to use IE's method
	else if (elem.currentStyle)
		return elem.currentStyle[name];

	// Or the W3C's method, if it exists
	else if (document.defaultView && document.defaultView.getComputedStyle) {
		// It uses the traditional 'text-align' style of rule writing, instead of textAlign
		name = name.replace(/([A-Z])/g,"-$1");
		name = name.toLowerCase();

		// Get the style object and get the value of the property (if it exists)
		var s = document.defaultView.getComputedStyle(elem,"");
		return s && s.getPropertyValue(name);

	// Otherwise, we're using some other browser
	} else
		return null;
}

// Find the full, possible, width of an element (not the actual,
// current, width)
function fullWidth( elem ) {
    // If the element is being displayed, then offsetWidth
    // should do the trick, barring that, getWidth() will work
    if ( getStyle( elem, 'display' ) != 'none' )
        return elem.offsetWidth || getWidth( elem );

    // Otherwise, we have to deal with an element with a display
    // of none, so we need to reset its CSS properties to get a more
    // accurate reading
    var old = resetCSS( elem, {
        display: '',
        visibility: 'hidden',
        position: 'absolute'
    });

    // Figure out what the full width of the element is, using clientWidth
    // and if that doesn't work, use getWidth
    var w = elem.clientWidth || getWidth( elem );

    // Finally, restore the CSS properties back to what they were
    restoreCSS( elem, old );

    // and return the full width of the element
    return w;
};

// A function used for setting a set of CSS properties, which
// can then be restored back again later
function resetCSS( elem, prop ) {
    var old = {};

    // Go through each of the properties
    for ( var i in prop ) {
        // Remember the old property value
        old[ i ] = elem.style[ i ];

        // And set the new value
        elem.style[ i ] = prop[i];
    }

    // Retun the set of changed values, to be used by restoreCSS
    return old;
};

// A function for restoring the side effects of the resetCSS function
function restoreCSS( elem, prop ) {
    // Reset all the properties back to their original values
    for ( var i in prop )
        elem.style[ i ] = prop[ i ];
};

/*
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/
var getElementsByClassName = function (className, tag, elm){
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};

prevSib = function(sib) {
    while(sib = sib.previousSibling) {
        if(sib.nodeType != 3 && sib.nodeType != 8) 
            return sib;
    }
    return null;
};


nextSib = function(sib) {
    while(sib = sib.nextSibling) {
        if(sib.nodeType != 3 && sib.nodeType != 8) 
            return sib;
    }
    return null;
};

parentNd = function(node) {
    while(node = node.parentNode) {
        if(node.nodeType != 3 && node.nodeType != 8) 
            return node;
    }
    return null;
};

firstCh = function(node) {
    var res = node.firstChild;
    while(res) {
        if(res.nodeType != 3 && res.nodeType != 8) 
            return res;
        res = res.nextSibling;
    }
    return null;
};

parseQueryString = function(str) {
	// Build an empty URL structure in which we will store
	// the individual query values by key.
	var objURL = {};

	// Use the String::replace method to iterate over each
	// name-value pair in the query string. Location.search
	// gives us the query string (if it exists).
	str.replace(
		new RegExp( "([^?=&]+)(=([^&]*))?", "g" ),
		// For each matched query string pair, add that
		// pair to the URL struct using the pre-equals
		// value as the key.
		function( $0, $1, $2, $3 ){
			objURL[ $1 ] = $3;
		}
	);
	return objURL;
};

/**
 * Funktion zum setzen des Datums beim Anreiseformular
 */
setFormDates = function() {
	
	//Die Select Felder
	var a_d = document.getElementsByName("tx_powermail_pi1[uid99]");
	var a_m = document.getElementsByName("tx_powermail_pi1[uid100]");
	var a_y = document.getElementsByName("tx_powermail_pi1[uid101]");
		
	var d_d = document.getElementsByName("tx_powermail_pi1[uid102]");
	var d_m = document.getElementsByName("tx_powermail_pi1[uid103]");
	var d_y = document.getElementsByName("tx_powermail_pi1[uid104]");
	
				
	var qs = parseQueryString(window.location.search);
	
	var date_a = new Date();
	var date_d = new Date();
			
	if(qs[escape("tx_powermail_pi1[uid99]")]) {
	
		escp = function(v) { 
			return escape(v); 			
		};
		
	} else if(qs["tx_powermail_pi1[uid99]"]) {
		escp = function(v) { 
			return v; 
		}
	}
	
	if(typeof escp != "undefined") {
		//wenns GET daten gibt nehmen wir diese			
				
		date_a.setDate(qs[escp("tx_powermail_pi1[uid99]")]);
		date_a.setMonth(qs[escp("tx_powermail_pi1[uid100]")] - 1);
		date_a.setYear(qs[escp("tx_powermail_pi1[uid101]")]);

				
		date_d.setDate(qs[escp("tx_powermail_pi1[uid102]")]);
		date_d.setMonth(qs[escp("tx_powermail_pi1[uid103]")] - 1);
		date_d.setYear(qs[escp("tx_powermail_pi1[uid104]")]);
		
		
	} else {
		//ansonsten stellen wir beim anreise und abreisedatum das aktuelle datum ein
				
		date_a.setDate(date_a.getDate() + (6-date_a.getDay()));
						
		date_d.setDate(date_d.getDate() + 14);
				
	}	
		
	for(var i = 0; i < a_d.length; i++) {
		a_d[i].value = date_a.getDate();
		a_m[i].value = date_a.getMonth() + 1;
		a_y[i].value = date_a.getFullYear();			
	}
	
	
	for(var i = 0; i < d_d.length; i++) {
		d_d[i].value = date_d.getDate();
		d_m[i].value = date_d.getMonth() + 1;
		d_y[i].value = date_d.getFullYear();			
	}	
};

/* Lodge Kalender Navigation */

calBack = function(m, y, href) {
	var calWidth = 196;
	
	var yr = (m > 1) ? y : y - 1;
	var mn = (m > 1) ? m - 1 : 12; 
	
	if(m == 12) {
		href = href.replace(/&y=([0-9]{4})/, "&y=" + yr);
		if(href.indexOf("&m=") == -1) {
			href += "&m=" + m;
		} else {
			href = href.replace(/&m=([0-9]{1,2})/, "&m=" + m);
		}
		location.href = href;
		return false;
	}
	
	var cal = document.getElementById("listYear");	
	var margin = (((m-1) * calWidth) * -1);
	if(margin <= 0)
		cal.style.marginLeft = margin + "px";
					
	document.getElementById("calBack").onclick = function() {
		calBack(mn, yr, href);
		return false;
	};
	document.getElementById("calNext").onclick = function() {
		calNext(m+1, yr, href);
		return false;
	};
};

calNext = function(m, y, href) {
	var calWidth = 196;
	
	var yr = (m < 12) ? y : y + 1;
	var mn = (m < 12) ? m + 1 : 1; 
	
	if(m == 1) {
		href = href.replace(/&y=([0-9]{4})/, "&y=" + yr);
		if(href.indexOf("&m=") == -1) {
			href += "&m=" + mn;
		} else {
			href = href.replace(/&m=([0-9]{1,2})/, "&m=" + m);
		}
		location.href = href;
		return false;
	}	

	var cal = document.getElementById("listYear");	
	var margin = (((m-1) * calWidth) * -1);
	if(margin <= 0)
		cal.style.marginLeft = margin + "px";	

	document.getElementById("calNext").onclick = function() {
		calNext(mn, yr, href);
		return false;
	};
	document.getElementById("calBack").onclick = function() {
		calBack(m-1, yr, href);
		return false;
	};
	
};

calSetMonth = function(m) {
	var calWidth = 196;
	var tbl = document.getElementById("listYear");	
	var margin = (((m-1) * calWidth) * -1);
	tbl.style.marginLeft = margin + "px";	
};

//alt ...
appendLodges = function(click) {
	
	if(typeof click == "undefined")
		var click = true;
	
		
	if(!click) {	
		/* 
			wenns GET daten gibt (eine selektierte Lodge über den Anfrage-Link
			nehmen wir diese
		*/				
		var qStr = parseQueryString(window.location.search);						
		if(qStr["selectedLodge"]) {
			document.getElementsByName("lodges["+ qStr["selectedLodge"] +"]")[0].checked = true;
		}					
	}
					
	var boxes = document.getElementsByTagName("input");
	
	var tmpBoxes = [];
	for(var i in boxes) {						
		if(/lodges\[([0-9]+)\]/.test(boxes[i].name))
			tmpBoxes.push(boxes[i]);
	}
									
	
	var numChecked = 0;
	var lodgeStr = '';
	var lodgeStrHTML = '';
	for(var j = 0; j < tmpBoxes.length; j++) {									
		if(tmpBoxes[j].checked) {
			//Namen / Titel der Lodge suchen
			var el = firstCh(firstCh(nextSib(parentNd(tmpBoxes[j]))));
										
			lodgeStr += el.title + ", ";
			lodgeStrHTML += '<a href="'+ el.href +'" target="_blank">'+ el.title + '</a><br />';														
			numChecked++;							
		}					
	
	}
	var lr = document.getElementById("lodgesRow");
	var lf = document.getElementById("lodgesField");
	var lc = document.getElementById("selectedLodges");
	if(numChecked > 0) {
	/*	lr.style.display = '';*/
		lf.value = lodgeStr;
		lc.innerHTML = lodgeStrHTML;
	} else {
		lr.style.display = 'none';
		lf.value = '';
		lc.innerHTML = '';
	}				
	
	
};


appendLodge = function(sel, name) {
	
	var lr = document.getElementById("lodgesRow");
	var lf = document.getElementById("lodgesField");
	var lc = document.getElementById("selectedLodges");
	
	
	if(sel && name) {		
		lr.style.display = '';
		lf.value = name;
		lc.innerHTML = name;	
		return; 			
	} else if(!sel) {
		var name = document.getElementsByName("lodgeSelect")[0].value;
		if(name) {
	 		lr.style.display = '';
			lf.value = name;
			lc.innerHTML = name;
			return; 
		} 	
	}
	
	lr.style.display = 'none';
	lf.value = '';
	lc.innerHTML = '';
};
