// -----------------------------------------------------------------------------------
//
//  JSLog v1.0
//  by Jeffrey Sambells <jeff@wecreate.com>
//  Copyright (c) 2006 Jeffrey Sambells (http://jeffreysambells.com)
//
//  For more information visit:
//  http://jeffreysambells.com/openprojects/JavaScript/JSLog/
//
//  Licensed under the Creative Commons Attribution 2.5 License
//  http://creativecommons.org/licenses/by/2.5/
//
//  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.//
//
// -----------------------------------------------------------------------------------


/*
//http://examples.oreilly.com/jscript3/text/7-3.txt
function stacktrace() {
	var s = '';
	for(var a = arguments.caller; a != null; a = a.caller) {
		func = a.callee.toString().match(/function (\w*)/)[1];
		func = ((s == null) || (s.length == 0)) ? 'anonymous' : func ;
		s += func + "\n";
		if (a.caller == a) break;
	}
	return s;
}
*/



function getWindowSize() {
 if (window.innerWidth) {
  winW = window.innerWidth;
  winH = window.innerHeight;
 } else {
  winW = document.body.offsetWidth;
  winH = document.body.offsetHeight;
 }
	return {w:winW,h:winH};

}

function getCookie( name ) {
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
		return null;
	}
	if ( start == -1 ) return null;
	var end = document.cookie.indexOf( ';', len );
	if ( end == -1 ) end = document.cookie.length;
	return unescape( document.cookie.substring( len, end ) );
}

function setCookie( name, value, expires, path, domain, secure ) {
	var today = new Date();
	today.setTime( today.getTime() );
	if ( expires ) {
		expires = expires * 1000 * 60 * 60 * 24;
	}
	var expires_date = new Date( today.getTime() + (expires) );
	document.cookie = name+'='+escape( value ) +
		( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) + //expires.toGMTString()
		( ( path ) ? ';path=' + path : '' ) +
		( ( domain ) ? ';domain=' + domain : '' ) +
		( ( secure ) ? ';secure' : '' );
}

var JSLogGetMousePosition = function (event) {
	if (window.event) {
		x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
		y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
	} else {
		x = event.clientX + window.scrollX;
		y = event.clientY + window.scrollY;
	}
	return {'x':x,'y':y};
}

function setSess() {
	var log = document.getElementById('JSLogWindow');
	setCookie( 'JSLogWindowSess', log.style.width+'|'+log.style.height+'|'+log.style.top+'|'+log.style.left);
}

var JSLogStartMotion = function(event) {
	var log = document.getElementById('JSLogWindow');

	var mouse = JSLogGetMousePosition(event);

	JSLog.startX = mouse.x;
	JSLog.startY = mouse.y;
	JSLog.startL = parseInt(log.style.left,10);
	JSLog.startT = parseInt(log.style.top,10);

	if (isNaN(JSLog.startL)) JSLog.startL = 0;
	if (isNaN(JSLog.startT))  JSLog.startT  = 0;

	if (document.attachEvent) {
		document.attachEvent("onmousemove", JSLogTrackMotion);
		document.attachEvent("onmouseup",   JSLogStopMotion);
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	} else {
		document.addEventListener("mousemove", JSLogTrackMotion, true);
		document.addEventListener("mouseup",   JSLogStopMotion, true);
		event.preventDefault();
	}
}

var JSLogTrackMotion = function (event) {
	var log = document.getElementById('JSLogWindow');

	var mouse = JSLogGetMousePosition(event);

	var left = (JSLog.startL + mouse.x - JSLog.startX);
	var top = (JSLog.startT  + mouse.y - JSLog.startY);
	if(left<3) left = 3;
	if(top<3) top = 3;

	log.style.left =  '' + left + "px";
	log.style.top  =  '' + top + "px";

	//modify opacity here so we only make transparent when dragging
	log.style.opacity = 0.5;

	if (window.event) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}  else {
		event.preventDefault();
	}

}

var JSLogStopMotion = function (event) {
	var log = document.getElementById('JSLogWindow');

	if (document.detachEvent) {
		document.detachEvent("onmousemove", JSLogTrackMotion);
		document.detachEvent("onmouseup",   JSLogStopMotion);
	} else if (document.removeEventListener) {
		document.removeEventListener("mousemove", JSLogTrackMotion,   true);
		document.removeEventListener("mouseup",   JSLogStopMotion, true);
	}
	log.style.opacity = 1;
	setSess();
}


var JSLogStartResize = function(event) {
	var log = document.getElementById('JSLogWindow');
	var mouse = JSLogGetMousePosition(event);

	JSLog.startX = mouse.x;
	JSLog.startY = mouse.y;
	JSLog.startL = parseInt(log.style.left,10);
	JSLog.startT = parseInt(log.style.top,10);
	JSLog.startW = parseInt(log.style.width,10);
	JSLog.startH = parseInt(log.style.height,10);

	if (isNaN(JSLog.startL)) JSLog.startL = 0;
	if (isNaN(JSLog.startT))  JSLog.startT = 0;
	if (isNaN(JSLog.startW)) JSLog.startW = 0;
	if (isNaN(JSLog.startH))  JSLog.startH = 0;

	if (document.attachEvent) {
		document.attachEvent("onmousemove", JSLogTrackResize);
		document.attachEvent("onmouseup",   JSLogStopResize);
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	} else {
		document.addEventListener("mousemove", JSLogTrackResize, true);
		document.addEventListener("mouseup",   JSLogStopResize, true);
		event.preventDefault();
	}
}


var JSLogTrackResize = function(event) {
	var log = document.getElementById('JSLogWindow');
	var logList = document.getElementById('JSLogList');
	var logListBackground = document.getElementById('JSLogListBackground');
	var logFooter = document.getElementById('JSLogFooter');

	var mouse = JSLogGetMousePosition(event);

	var addWidth = mouse.x - JSLog.startX;
	var addHeight = mouse.y - JSLog.startY;
	addWidth = (JSLog.startW + addWidth)<160 ? addWidth+(160-(JSLog.startW + addWidth)) : addWidth;
	addHeight = (JSLog.startH + addHeight)<70 ? addHeight+(70-(JSLog.startH + addHeight)) : addHeight;

	log.style.width =  '' + (JSLog.startW + addWidth) + "px";
	log.style.height  =  '' + (JSLog.startH + addHeight) + "px";

	logList.style.width = log.style.width;
	logList.style.height  =  '' + (JSLog.startH + addHeight - 32) + "px";

	logListBackground.style.width = log.style.width;
	logListBackground.style.height  =  '' + (JSLog.startH + addHeight - 20) + "px";

	logFooter.style.width = log.style.width;
	logFooter.style.top  =  '' + (JSLog.startH + addHeight - 12) + "px";

	if (window.event) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}  else {
		event.preventDefault();
	}
}

var JSLogStopResize = function(event) {
	if (document.detachEvent) {
		document.detachEvent("onmousemove", JSLogTrackResize);
		document.detachEvent("onmouseup",   JSLogStopResize);
	} else {
		document.removeEventListener("mousemove", JSLogTrackResize,   true);
		document.removeEventListener("mouseup",   JSLogStopResize, true);
	}

	setSess();

}

var JSLog = {
	log:null,
	logList:null,
	logListBackground:null,
	reverseSort:false,
	startX:0,
	startY:0,
	startL:'100px',
	startT:'100px',
	startW:'200px',
	startH:'204px',
	count:0,
	setupLog:function () {

		var sess = getCookie('JSLogWindowSess');
		if(sess && sess.length && sess.length > 0) {
			var sessParts = sess.split('|');
			//TODO clean and check data
			this.startW = sessParts[0]||this.startH;
			this.startH = sessParts[1]||this.startH;
			this.startT = sessParts[2]||this.startT;
			this.startL = sessParts[3]||this.startL;
			var winsize = getWindowSize();
			if(parseInt(this.startT) > (winsize.h-20)) this.startT =((winsize.h-50)||20) + 'px';
			if(parseInt(this.startL) > (winsize.w-20)) this.startL = ((winsize.w-50)||20) + 'px';
		}


		var log = document.createElement('div');
		this.log = log;
		log.setAttribute('id','JSLogWindow');
		log.style.width = this.startW;
		log.style.height = this.startH;
		log.style.overflow = 'hidden';
		log.style.position = 'fixed';
		log.style.top= this.startT;
		log.style.left= this.startL;

		log.style.border= '1px solid black';
		log.style.padding= '0';
		log.style.font = '10px/10px bold verdana, tahoma, sans';
		log.style.textAlign = 'left';


		var logTitle = document.createElement('div');

		logTitle.style.position = 'absolute';
		logTitle.style.top = '0';
		logTitle.style.left = '0';
		logTitle.style.width = '100%';
		logTitle.style.height = '14px'; //-6px of padding
		logTitle.style.overflow = 'hidden';
		logTitle.innerHTML = 'JSLog Debug Log';
		logTitle.style.font = '10px/10px bold verdana, tahoma, sans';
		logTitle.style.color = '#FFF';
		logTitle.style.backgroundColor = '#000';
		logTitle.style.padding= '3px';
		logTitle.onmousedown = function(event) { JSLogStartMotion(event); }
/*
		logReverse = document.createElement('span');
		logReverse.innerHTML = ' [Reverse]';
		logReverse.style.font = '9px/9px bold verdana, tahoma, sans';
		logReverse.style.color = '#666';
		logReverse.onclick = function() {
			JSLog.reverse();
		}
		logTitle.appendChild(logReverse);
*/
		var logClear = document.createElement('span');
		logClear.innerHTML = ' [clear]';
		logClear.style.font = '9px/9px bold verdana, tahoma, sans';
		logClear.style.color = '#666';
		logClear.onclick = function() { JSLog.clear();}
		logTitle.appendChild(logClear);

		var logHide = document.createElement('span');
		logHide.innerHTML = ' [hide]';
		logHide.style.font = '9px/9px bold verdana, tahoma, sans';
		logHide.style.color = '#666';
		logHide.onclick = function() { JSLog.hide(); }
		logTitle.appendChild(logHide);

		log.appendChild(logTitle);

		var logListBackground = document.createElement('div');
		this.logListBackground = logListBackground;
		logListBackground.setAttribute('id','JSLogListBackground');
		logListBackground.style.position = 'absolute';
		logListBackground.style.top = '20px';
		logListBackground.style.left = '0';
		logListBackground.style.width = '100%';
		logListBackground.style.height = (parseInt(this.startH) - 32) + 'px';
		logListBackground.style.overflow = 'hidden';
		logListBackground.style.background= 'transparent url(http://jeffreysambells.com/openprojects/images/black80.png)';

		var logListBackgroundFill = document.createElement('div');
		logListBackgroundFill.style.height = '100px';
		logListBackgroundFill.style.overflow = 'hidden';
		logListBackgroundFill.style.background= 'transparent url(http://jeffreysambells.com/openprojects/images/stripesRed.png)';
		logListBackground.appendChild(logListBackgroundFill);

		log.appendChild(logListBackground);

		var logList = document.createElement('UL');
		this.logList = logList;
		logList.setAttribute('id','JSLogList');
		logList.style.position = 'absolute';
		logList.style.top = '20px';
		logList.style.left = '0';
		logList.style.width = '100%';
		logList.style.height = (parseInt(this.startH) - 32) + 'px';
		logList.style.overflow = 'scroll';
		logList.style.overflowX = 'hidden';

		logList.style.padding= '0';
		logList.style.border= '0';
		logList.style.margin= '0';
		logList.style.listStyle= 'none';


		logList.prependChild = function (node) {
			if (this.firstChild) {
				this.insertBefore(node, this.firstChild);
			} else {
				this.appendChild(node);
			}
		}

		log.appendChild(logList);

		var logFoot = document.createElement('div');
		logFoot.setAttribute('id','JSLogFooter');
		logFoot.style.position = 'absolute';
		logFoot.style.top = (parseInt(this.startH) - 12) + 'px';
		logFoot.style.left = '0';
		logFoot.style.width = '100%';
		logFoot.style.padding = '1px';
		logFoot.style.height = '12px';
		logFoot.style.overflow = 'hidden';
		//logFoot.style.background = '#000 url(http://jeffreysambells.com/openprojects/images/drag.png) no-repeat right bottom';
		logFoot.style.background = '#000';
		logFoot.style.textAlign = 'left';
		logFoot.style.font = '9px/9px bold verdana, tahoma, sans';
		logFoot.style.color = '#666';
		logFoot.innerHTML = '<span style="margin-right:15px; padding:1px;"><span id="JSLogEntryCount">#</span> entries (disable JSDebug=false;)</span>';

		logFoot.onmousedown = function(event) { JSLogStartResize(event); }

		log.appendChild(logFoot);

		document.body.appendChild(log);

		//filter objects don't exist until AFTER the dom object has been added to the document.
		//if(typeof logList.filters != 'undefined')
		if(logListBackground.filters) {
			logListBackground.style.backgroundColor = 'transparent';
			logListBackground.style.backgroundImage = 'url(http://jeffreysambells.com/openprojects/images/blank.gif)';
			logListBackground.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://jeffreysambells.com/openprojects/images/black80.png',sizingMethod='scale')";
			//log.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").enabled = true;
			//log.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = 'http://jeffreysambells.com/openprojects/images/black80.png';
			//log.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").sizingMethod='scale';
		}
		if(logListBackgroundFill.filters) {
			logListBackgroundFill.style.backgroundColor = 'transparent';
			logListBackgroundFill.style.backgroundImage = 'url(http://jeffreysambells.com/openprojects/images/blank.gif)';
			logListBackgroundFill.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://jeffreysambells.com/openprojects/images/stripesRed.png',sizingMethod='crop')";
			//logList.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").enabled = true;
			//logList.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = 'http://jeffreysambells.com/openprojects/images/stripesRed.png';
			//logList.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").sizingMethod='crop';
		}

	},
	write: function (message) {

		if(typeof message == 'string' && message.length==0) {
			return this.logIt('JSLog: null message');
		}

		if (typeof message != 'string') {
			if(!message) { return this.logIt('message was false'); }
			else if(message.toString) return this.logIt(message.toString());
			else return this.logIt(typeof message);
		}
		messageEncoded=message;
		messageEncoded = messageEncoded.replace(/</g,"&lt;");
		messageEncoded = messageEncoded.replace(/>/g,"&gt;");
		return this.logIt(messageEncoded);
	},
	writeHTML: function (message) {
		return this.logIt(message);
	},
	logIt: function (message) {

		//disable the debugger
		if(typeof JSDebug != 'undefined' && !JSDebug) return null;

		if(!this.log) this.setupLog();
		this.log.style.display='block';
		var li = document.createElement('LI');
		li.style.padding= '2px';
		li.style.border= '0';
		li.style.borderBottom = '1px dotted black';
		li.style.margin= '0';
		li.style.color= '#FFF';
		li.style.font = '9px/9px verdana, tahoma, sans';
		li.innerHTML=message;

		li.onclick = function() {
			this.style.backgroundColor = (this.style.backgroundColor=='' ? '#288D02' : '');
			this.className = (this.className=='' ? 'JSLogKeeper' : '');
		}

		if(this.reverseSort) this.logList.prependChild(li);
		else this.logList.appendChild(li);

		this.count++;
		this.updateCounterMessage();
		return true;
	},
	header: function (message) {
		//disable the debugger
		if(typeof JSDebug != 'undefined' && !JSDebug) return null;
		if(!this.log) this.setupLog();
		this.log.style.display='block';
		var li = document.createElement('LI');
		li.style.padding= '2px';
		li.style.border= '0';
		li.style.borderTop = '1px solid black';
		li.style.margin= '0';
		li.style.color= '#000';
		li.style.backgroundColor = '#e3fe8d';
		li.style.font = '9px/9px verdana, tahoma, sans';

		li.innerHTML=message;

		if(this.reverseSort) this.logList.prependChild(li);
		else this.logList.appendChild(li);
		return true;
	},
	clear: function () {
		var list = document.getElementById('JSLogList');
		var listItems = list.getElementsByTagName('LI');
		var li = listItems.length;
		while(--li>=0) {
			if(listItems[li].className !='JSLogKeeper') listItems[li].parentNode.removeChild(listItems[li]);
		}
		this.count = listItems.length;
		this.updateCounterMessage();
	},
	hide: function () {
		document.getElementById('JSLogWindow').style.display = 'none';
	},
	reverse: function () {
		if(this.reverseSort == false) {
			this.reverseSort = true;
		} else {
			this.reverseSort = false;
		}
		this.write('Set reverse to: ' + this.reverseSort);
	},
	updateCounterMessage: function() {
		document.getElementById('JSLogEntryCount').innerHTML = this.count;

	}
};

/*
var JLog = JSLog;
function testing(a) {
	for (i in args) {
		JSLog.write(i);
	}
}
function debugTest() {
	testing('test');
}
addEvent(window,'load',debugTest);
*/

window['JSLog'] = JSLog;

})();

