/*
CSS Browser Selector v0.4.0 (Nov 02, 2010)
Rafael Lima (http://rafael.adm.br)
http://rafael.adm.br/css_browser_selector
License: http://creativecommons.org/licenses/by/2.5/
Contributors: http://rafael.adm.br/css_browser_selector#contributors
*/
function css_browser_selector(u){var ua=u.toLowerCase(),is=function(t){return ua.indexOf(t)>-1},g='gecko',w='webkit',s='safari',o='opera',m='mobile',h=document.documentElement,b=[(!(/opera|webtv/i.test(ua))&&/msie\s(\d)/.test(ua))?('ie ie'+RegExp.$1):is('firefox/2')?g+' ff2':is('firefox/3.5')?g+' ff3 ff3_5':is('firefox/3.6')?g+' ff3 ff3_6':is('firefox/3')?g+' ff3':is('gecko/')?g:is('opera')?o+(/version\/(\d+)/.test(ua)?' '+o+RegExp.$1:(/opera(\s|\/)(\d+)/.test(ua)?' '+o+RegExp.$2:'')):is('konqueror')?'konqueror':is('blackberry')?m+' blackberry':is('android')?m+' android':is('chrome')?w+' chrome':is('iron')?w+' iron':is('applewebkit/')?w+' '+s+(/version\/(\d+)/.test(ua)?' '+s+RegExp.$1:''):is('mozilla/')?g:'',is('j2me')?m+' j2me':is('iphone')?m+' iphone':is('ipod')?m+' ipod':is('ipad')?m+' ipad':is('mac')?'mac':is('darwin')?'mac':is('webtv')?'webtv':is('win')?'win'+(is('windows nt 6.0')?' vista':''):is('freebsd')?'freebsd':(is('x11')||is('linux'))?'linux':'','js']; c = b.join(' '); h.className += ' '+c; return c;}; css_browser_selector(navigator.userAgent);


// TODO: Move global defs to config system getting js-relevant config parameters from server side.
// window.onerror = globalErrorHandler;
// TODO: Move function to global service
window.errorQueue = Array();
window.holder = new Object();

// Extending String to support formatting
String.prototype.format = function() {
  var pattern = /\{\d+\}/g;
  var args = arguments;
  return this.replace(pattern, function(capture){ return args[capture.match(/\d+/)]; });
}

function globalInit() {
  if( $('errorPanel').length>0 ) {

    runUpdateErrorPanel();
    $('errorPanel').setStyle({
	    left : '300px',
	    top : '200px'
    });

    window.holder.dragErrorPanel = new Draggable('errorPanel', {
	    ghosting: false,
	    onEnd : function (obj, mEvent) {
		// TODO: Store in user profile and reuse pos on post; mEvent.clientX,mEvent.clientY;
	    }
    });

    // If any paste print errors, show panel
    if($('paste-debug-prints').length>0 && $('paste-debug-prints').innerHTML.length>0) {
	$('wdgPanel').show();
    }
  }
}

function globalErrorHandler(desc, page, line, chr) {
  queueError(
    '<h3>While running client side javascript an error occurred: </h3>'
    +'<p>Error description: '+desc+'</p>'
    +'<p>Page address: '+page+'</p>'
    +'<p>Line number: '+line+'</p>'
  )
  return true;
}

function runUpdateErrorPanel() {
    showQueuedErrors();
    setTimeout(runUpdateErrorPanel,1000);
}

function queueError(msg) {
    window.errorQueue.push(msg);
}

function showQueuedErrors() {
    if(window.errorQueue.length>0) {
	var tempQ = window.errorQueue;
	window.errorQueue = Array(); // Clear queue
	var errorMsg = '<h2>Error message: {0} client side error{1} occurred:</h2>'.format( tempQ.length, (tempQ.length>1?'s':'') );
	for(var i=0;i<tempQ.length;i++) {
	    errorMsg += '<p>{0}</p>'.format(tempQ[i]);
	}
	showError(errorMsg);
    }
}

function showError(msg) {
    $('errorContent').update($('errorContent').innerHTML+msg);
    $('errorPanel').show();
}

function closeErrorPanel() {
    $('errorPanel').hide();
    $('errorContent').update('');
}

