/*
Copyright will Farrell

Rules:
- If str or obj appears >1x in fct, replace with var
- Assign all global vars in var.global.js
- If a property is longer then 4 charsand apears >=3 times create a get/set function

Checks:
http://www.jslint.com/
http://closure-compiler.appspot.com/home
Run document.getElementsByTagName('*').length; in console. The fewer DOM elements the better.

Options:
JS Loader 

//http://getfirebug.com/wiki/index.php/Console_API
console.log
console.debug
console.warn
console.error
*/

/*global document*/
function log(str) { console.log(str); } // debug

/**
 * Make object, checks if Tag Name and ID.
 * If .class, grab by css class
 */
function $(str, o) { // id .class html[nth-child] (input[name=aaaa] - not included)
	var elem, arr, n, c, // n:name, c:child
			regex_n = /([\w\-]+)/, regex_c = /\[(\d)+\]/,
			d = document;
	o || (o = d); // if(!o) { o = document }
	//log(o);
	if (str) {
		arr = str.split(' ');
		n = regex_n.exec( arr[0] );
		if (n[1]) {
			
			if (arr[0].indexOf('.') !== -1) {// Class
				elem = o.getElementsByClassName(n[1]);
			} else { // Tag or ID
				elem = d.getElementById(n[1]); // o = document
				elem || ( elem = o.getElementsByTagName(n[1])); // if(!elem) { elem =  o.getElementsByTagName(n[1]); }
			}
			//alert(elem.type);
			c = regex_c.exec( arr[0] );
			if (c && c[1]) { elem = elem[c[1]]; }
			else { return elem; } // returns array
		}
		
		// more elements
		//return arr[1] ? (str = str.substring(str.indexOf(arr[1]), arr.length), $(str, elem)) : elem;
		if(arr[1]) {
			str = str.substring(str.indexOf(arr[1]), str.length);
			return $(str,elem);
		} else { return elem; }
		
	}
}

// Checks
function checkObj(o) { return typeof(o) === 'object' ? o: $(o); }// used in datepicker

// Get
function getName(o) { return o.name; }
function getValue(o) { return o.value; }
function getType(o) { return o.type; }
function getChecked(o) { return o.checked; }

function getLength(o) { return o.length; }
function getInnerHTML(o) { return o.innerHTML; }
function getClassName(o) { return o.className; }
function getParentNode(o) { return o.parentNode; }



// Get Style
function getStyle(o, p){
	o = o.style;
	return o[p]? o[p]: null;
}
/*function getStyle(o, p){ // with idiot check
	var elm = checkObj(o);
	
	if (elm != null){
		if(elm.style){
			elm = elm.style;
			if(elm[p]){
				return elm[p];
			} else {
				return null;
			}
		} else {
			return null;
		}
	}
}
*/
function getDisplay(o) { return getStyle(o, 'display'); }
//function getDisplay(o) { return o.style.display; }

// Set
function setValue(o, v) { o.value = v; }
function setSrc(o, v) { o.src = v; }
function setInnerHTML(o, v) { o.innerHTML = v; }
function setClassName(o, v) { o.className = v; }

// Set Display
function setStyle(o, p, v) { // from datepicker // without idiot check
	o = o.style;
	o[p] = v;
}
/*function setStyle(p, v, oid) { // from datepicker // with idiot check
	var elm = checkObj(oid);
	if((elm != null) && (elm.style != null)){
		elm = elm.style;
		elm[p] = v;
	}
}*/
function setDisplay(o, v) { setStyle(o, 'display', v?'block':'none'); } // v = 1 (block) or 0 (none)
//function setDisplay(o, v) { o.style.display = v?'block':'none'; } // v = 1 (block) or 0 (none)

// Other
function toggleDiv(o) { var z = (getDisplay(o) === 'none') ? setDisplay(o, 1) : setDisplay(o, 0); } // unused var z - appease JSlint
function addInnerHTML(o, t, p) { // object, text, pre/post = 0/1
	//var str = p?t+getInnerHTML(o):getInnerHTML(o)+t;
	//setInnerHTML(o, str);
	setInnerHTML(o, p?t+getInnerHTML(o):getInnerHTML(o)+t);
}

function toggleValue(o, text1, text2) {
	getInnerHTML(o) === text1 ?
		setInnerHTML(o, text2):
	getInnerHTML(o) === text2 &&
		setInnerHTML(o, text1);
}



/**
 *	Grabs variable from address bar
 *	@param	string
 *
function _GET(key) {
	var query = window.location.search.substring(1),
			vars = query.split("&");
	for (var i = 0, pair; i < vars.length; i++) {
		pair = vars[i].split("=");
		if (pair[0] == key) return pair[1];
	}
	return null;
}*/

/*
function (e) {
	e = e || event;
	var target = e.target || e.srcElement;
}
*/
