// LOGGING

// create a logger on window if the class is availible
/* if ( window.Logger ) {
	window.logger = new Logger('/services/js-logger.php');
} else {
	window.logger = new Object();
	window.logger.log = function ( msg ) {
		// ignore
	};
} */

// HANDY JS METHODS

// String Methods

function ucfirst ( str ) {
	var first = str.substring(0, 1);
	var rest = str.substring(1);
	return first.toUpperCase() + rest;
}

function trim(strText) { 
	if (strText){
		while (strText.charAt(0) == ' ') 
			strText = strText.substring(1, strText.length);
		while (strText.charAt(strText.length-1) == ' ')
			strText = strText.substring(0, strText.length-1);
	}
   return strText;
}


// DOM Methods

function $(el) {
  return document.getElementById(el);
}

function childElements ( parent ) {
	var children = new Array();
	for ( var n = 0; n < parent.childNodes.length; n++ ) {
		if ( parent.childNodes[n].nodeType == 1 ) {
			children.push( parent.childNodes[n] );
		}
	}
	return children;
}

function nodeListToArray ( nodeList ) {
	var array = new Array();
	for ( n = 0; n < nodeList.length; n++ ) {
		array.push( nodeList[n] );
	}
	return array;
}

// ie doesn't have importNode
if ( !document.importNode ) {
	document.importNode = function ( node, deep, table ) {
		
		var fresh = false;
		switch ( node.nodeType ) {
			case 1:
				switch ( node.nodeName.toLowerCase() ) {
					// tr can't insert in IE
					case 'tr':
						if ( table ) {
							fresh = table.insertRow();
							break;
						}
					default:
						fresh = document.createElement( node.nodeName );
				}
				
				for ( var a = 0; a < node.attributes.length; a++ ) {
					switch ( node.attributes[a].name ) {
						case 'class':
							fresh.className = node.attributes[a].value;
							break;
						case 'colspan':
							fresh.colSpan = node.attributes[a].value;
							break;
						case 'checked':
							if ( fresh.nodeName.toLowerCase() == 'input' ) {
								fresh.defaultChecked = true;
								break;
							}
						default:
							fresh.setAttribute( node.attributes[a].name, node.attributes[a].value );
					}
				}
				
				if ( deep ) {
					for ( var n = 0; n < node.childNodes.length; n++ ) {
						switch ( fresh.nodeName.toLowerCase() ) {
							// needed for tr
							case 'table':
								var child = document.importNode( node.childNodes[n], deep, fresh );
								break;
							default:
								var child = document.importNode( node.childNodes[n], deep );
						}
						if ( child ) {
							fresh.appendChild( child );
							
							// IE breaks radio input elements
							// this reimplements their function
							if ( child.type == 'radio' ) {
								
								// get other input with the same name
								var input = nodeListToArray( document.getElementsByTagName('input') );
								input = input.concat( nodeListToArray( fresh.getElementsByTagName('input') ) );
								var others = new Array();
								for ( var i = 0; i < input.length; i++ ) {
									if ( input[i].name == child.name ) {
										others.push( input[i] );
									}
								}
								
								// apply manual behaviour to others
								for ( var oA = 0; oA < others.length; oA++ ) {
									others[oA].onclick = function () {
										this.checked = true;
										for ( var oB = 0; oB < others.length; oB++ ) {
											if ( others[oB] != this ) {
												others[oB].checked = false;
											}
										}
									};
								}
							}
						}
					}
				}
				break;
			/* case 2:
				fresh = document.createAttribute( node.nodeName );
				fresh.nodeValue = node.nodeValue;
				break; */
			case 3:
				var text = node.nodeValue.replace( /\t/g, '' );
				text = text.replace( /\n/g, ' ' );
				fresh = document.createTextNode( text );
		}
		switch ( fresh.nodeName.toLowerCase() ) {
			case 'tr':
				if ( table ) {
					return null;
					break;
				}
			default:
				return fresh;
		}
	};
}

// Event Registration

function addEvent ( target, event, method ) {
	if ( target && event && method ) {
		if ( target.addEventListener ) {			
			target.addEventListener( event, method, false );
		} else if ( target.attachEvent ) {
				target.attachEvent( 'on' + event, method );
		} else {
			console.log( 'could not attach event ' + target + ' ' + event + ' ' + method );
		}
	}
}
	
	

function delEvent ( target, event, method ) {
	if ( target.removeEventListener ) {
		target.removeEventListener( event, method, false );
	} else if ( target.detachEvent ) {
		target.detachEvent( 'on' + event, method );
	} else {
		console.log( 'could not attach event ' + target + ' ' + event + ' ' + method );
	}
}

// Misc Methods

function newXmlHttpRequest () {
	var request = false;
	if ( window.XMLHttpRequest ) {
		try {
			request = new XMLHttpRequest();
		} catch ( e ) {
			request = false;
		}
	} else if ( window.ActiveXObject ) {
		try {
			request = new ActiveXObject('Msxml2.XMLHTTP');
		} catch ( e ) {
			try {
				request = new ActiveXObject('Microsoft.XMLHTTP');
			} catch ( e ) {
				request = false;
			}
		}
	}
	return request;
}

function AjaxCall(callback,page,postFields) {
    req = new newXmlHttpRequest();
    req.onreadystatechange = eval(callback);
    req.open("POST", page, true);
    req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      var reqStr="";
        for(var i=0;i<postFields.length;i++) {
            reqStr+=postFields[i].id+"="+postFields[i].value+"&";
        }
        reqStr=reqStr.substr(0,reqStr.length-1);
  //      alert(reqStr);
        req.send(reqStr);
}

function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp('(^|\\\\s)'+searchClass+'(\\\\s|$)');
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

// create google calendar style grey-out

function disableAll(flag){
    var shadow=$('shadow');
    var p=$('reEnable');
    p.style.width="40%";
    p.style.height="50%";
	p.style.display=(flag) ? 'block' : 'none';
    // attach events for resize and scrolling
    (flag) ? setShadow() : unsetShadow();
    (flag) ? addEvent(window,'resize',setShadow) : delEvent(window,'resize',setShadow);
    (flag) ? addEvent(window,'scroll',setShadow) : delEvent(window,'scroll',setShadow);
    shadow.style.visibility=(flag) ? 'visible' : 'invisible';
}

function setShadow(){
    var shadow=$('shadow');
    var p=$('reEnable');
    shadow.style.width=window.innerWidth+"px";
    shadow.style.height=window.innerHeight+"px";    
    shadow.style.left=window.pageXOffset+"px";
    shadow.style.top=window.pageYOffset+"px";    
    p.style.left=Math.round((shadow.offsetWidth/2)-(p.offsetWidth/2))+"px";
    p.style.top=Math.round((shadow.offsetHeight/2)-(p.offsetHeight/2))+"px";
}

function unsetShadow(){
    var shadow=$('shadow');
    shadow.style.width='0%';
    shadow.style.height='0%';    
}

// Legacy Stuff

// write text out based on browser version
function writeTextById(id, val) {
	if (document.getElementById) {
		if (document.getElementById(id)){
			document.getElementById(id).innerHTML = val;
		}
	} else if (document.all) {
		if (document.all.item(id)){
			document.all.item(id).innerHTML = val;
		}
	}
}