// ************************************************************************
//
//   StageTrack Core JS Library
//   written by Digital Propulsion Labs
//   Copyright 2009-2010 Digital Propulsion Labs *unless otherwise specified*
//	 version 0.4 - 07/14/2010
//
//
//   v0.4	- Added Global Init function (gInit)
//			editProfile, 
//   v0.3	- Added field validation procs
//   v0.2	- Fixed 'no result' bug in displayJSONTweets
//		 	- 
//   v0.1	- Created (Inital Release)
//
// ************************************************************************

//var emailPat = /^(.+)@(.+)(\.[a-z]+){1,2}$/;

// ** FUTURE this will be moved to the main load and a general function created
//

function gInit()
{
/*
*/
	$.ajaxSetup({
		error:function(x,e) {
			var msg;
			if (x.status==0) {
				//msg='You are offline!!\n Please Check Your Network.';
			} else if (x.status==404) {
				msg='Requested URL not found.\n'+x.responseText;
			} else if (x.status==500) {
				msg='Internel Server Error.\n'+x.responseText;
			} else if (e=='parsererror') {
				msg='Error Parsing JSON/Script Request failed.\n';//+x.responseText;
			} else if (e=='timeout'){
				msg='Request Time out.';
			} else {
				msg='Unknow Error.\n'+x.responseText;
			}
			if ($('#panel-status').length && msg)
			{
				$('#panel-status').html(msg.replace('\n','<br>\n')).addClass('alert');
			}
		}
	});
	
	$(document).keyup(function (e) { if (e.keyCode==27 && $('DIV.popup-main:visible').length) $('DIV.popup-main:visible').each(function(){ $(this).removeClass('popup-main-show'); stagetrack.hideBlanket(); }); });
	
	// round corners 'round-corners'
	$('DIV.round-corners').each(function() { roundCorners($(this).attr('id')); });
	
	// set up resize event handler
	$(window).resize(function() {
		// resize the popup-blanket if its visable
		// ** BUG; z-index shouldn't change for resize
		//if ($('#popup-blanket:visible').size()) stagetrack.blanketResize();
		return;
	});
	
	// auto-load the panel if exists based on url hash
	var lhash = window.location.hash;
	if (lhash.length && $(lhash+'-panel').size())
	{
		var $ptb = $('.menu-buttons-panel ul li'+lhash.replace('#','#tab-'));
		if ($ptb.size())
			$ptb.click();
		else
			changeTab(lhash+'-panel',($(lhash+'-panel').children().size()==0?lhash.replace('#',''):false));
	}
	// TODO: add validation for the fields depending on the available classes 
	//$('.standard-form').children('input.validate').bind('onblur',function() { });

	loadUIEnhancements();
	
	return;
}

function loadUIEnhancements()
{

	$('table.stripe tr:odd').addClass('stripe'); // ** TODO; needs work?
	$('.draggable').draggable();
	$('.datepicker').datepicker();
	
	// general search fields
	$('.search-field input').focus(function() { if ($(this).val()=="Search") $(this).val(''); });
	$('.search-field input').blur(function() { if ($(this).val().length==0) $(this).val('Search'); });

	$('input').has('.gfusion-point').each(function() {
		// attach a fusion button to it
		$(this).parent().append('<img src="/images/gfusion-icon.png" height="24" />').css('gfusion-btn').click(function() { 
			//if ($(this).val().length==0) $(this).val('Search');
			// is there data to use?
			if (gFusionTables)
			{
				var fd = new stagetrack.ui.gFusionDialog({ datasource:gFusionTables, valuecol:3, onsave:function(data) {
						$(this).val(data.type);
					}
				});
				
			}
		});
	});

	// required fields
	/*
	$('.required').each(function()
		{
			
			$fd = $(this).find('label [for='+$(this).attr('name')+']');
			
			alert($fd.size());

			$(this)
				.blur()
				.focus() // clear label
		
		}
	);
	*/

}

function loginPrompt(anchorElem)
{
	stagetrack.displayPanel('login', { width: "260px", eh: anchorElem, draggable: true, onopen: function () { $('input:visible:first').focus(); } });
}

function loginUser(fobj)
{
	var pform = (typeof(fobj)!="object"?$('#'+fobj):$(fobj));
	var error_message;
	if (pform.attr('action').length > 0)
	{
		if (!$('#form_msg').length)
			pform.prepend("<p id='form_msg'></p>");
		// submit login information
		if ($('#usrname').val().length > 0 && $('#passwd').val().length > 0)
		{
			// ** needs a better 'processing screen'
			// ** this should hide the actual form and display a loading image
			$('#form_msg').html("Logging in...");

			if (pform.find('#remember:checked').size())
				storeField(fobj,pform.find('#remember:checked').attr('id'),'usrname');
			else
				setcookie('usrname', '', 720, '');
				
			$.post(
				pform.attr('action'), //  pform.action,
				{ json: true, usrname:$('#usrname').val(), passwd:$('#passwd').val(), locref: pform.children("input[name='ref']").val() },
				function (data,textStatus) {
					// process JSON response
					if (data.login_status == "error")
					{
						$('#form_msg').css({color:"red"});
						$('#form_msg').html("Invalid Username or Password");
						// set timer to hide message
					}
					else
					{
						// log dat boi in, display loading, redirect
						window.location = ((data.redirect)?data.redirect:"../");
					}
				},
			"json");
			return false;
		}
		else if (!$('#usrname').val().length)
		{
			error_message = "Username field is blank";
		}
		else if (!$('#passwd').val().length)
		{
			error_message = "Password field is blank";
		}
		if (error_message)
		{
			$('#form_msg').css({color:"red"});
			$('#form_msg').html(error_message);
			//alert($('#login_form_fields').siblings('#form_msg').css("color"));
			return false;
		}
	}
	return;
}

function changeTab(panel,cont,opts)
{
	if (!cont) cont = null;
	$('#panel-status').fadeOut('normal');
	$('#panel-menu ul li[onclick*='+panel+']').addClass('highlight').siblings().removeClass('highlight');
	if (panel && typeof(panel)!="function")
	{
		stagetrack.displayForm(panel,cont,null,opts);
	}
	else if (panel)
	{
		panel();
	}
	window.location.hash = panel.replace("-panel","");
}

function anchorToElement(tgtElem,anchorElem,pos)
{
	var position = { left: 0, top: 0 };
	if (typeof(anchorElem) != "undefined")
	{
		pos = pos || "top-left";
		var aeOffset = $(anchorElem).offset();
		var width = $(anchorElem).width();
		var height = $(anchorElem).outerHeight();
		if (pos == "top-right")
			$(tgtElem).css( { "left": (aeOffset.left-($(tgtElem).width()-width)) + "px", "top":(aeOffset.top - $(tgtElem).height()) + "px" } );
		else if (pos == "top-left")
			$(tgtElem).css( { "left": (aeOffset.left+width) + "px", "top":(aeOffset.top - $(tgtElem).height()) + "px" } );
		else if (pos == "bottom-right")
			$(tgtElem).css( { "left": (aeOffset.left-($(tgtElem).width()-width)) + "px", "top":(aeOffset.top + height) + "px" } );
		else if (pos == "bottom-left")
			$(tgtElem).css( { "left": (aeOffset.left) + "px", "top":(aeOffset.top + height) + "px" } );
		
		position.left = parseInt($(tgtElem).css('left'));
		position.top = parseInt($(tgtElem).css('top'));
	}
	return position;
}

function centerOverlay(oid,tgt)
{
	//$(oid).center();
	var ct = (typeof(oid)=="string"?$(ct):oid);
	if (typeof tgt != "undefined")
	{
		var toffset = $(tgt).offset();// + toffset.left
		var lpos = ($(tgt).width() / 2) - ($(oid).width()/2);  
		var tpos = ($(tgt).height() / 2) - ($(oid).height()/2);
	}
	else
	{
		var lpos = ($(document.body).width() / 2) - ($(oid).width()/2);  
		var tpos = (window.innerHeight / 2) - ($(oid).height()/2);
	}
	ct.css( { "left": lpos + "px", "top": (tpos<0?0:tpos) + "px" } );
	//$(oid).css( { left: "50%", top: "50%", margin: "-"+($(oid).height() / 2)+'px 0 0 -'+($(oid).width() / 2)+'px' } );
	/*
	*/
}

//   loadlib("stagetrack");
function loadlib(lib,version)
{
   var e = document.createElement("script");
   e.src = lib+version+".js";
   e.type="text/javascript";
   document.getElementsByTagName("head")[0].appendChild(e);
}

// make string method?  String.prototype.validate = function() {}
function validate(strInp,regPatt)
{
	if (typeof(regPatt) == 'string') regPatt = validationRegExp[regPatt];
	return (strInp.match(regPatt) == null) ? false : true;
}

// v1.0
function validateField(field,vtype,efield)
{
	if (!field || !field.value) return;
	if (!validate(field.value,vtype))
	{
		// highlight field
		
		
		// if panel-status, display error
		if (efield)
		{
			
		}
		
	}
}

function formatDateTime(dateFer)
{
	var dawt = new Date();
	dawt.setTime(Date.parse(dateFer));
	var timeDisp = (dawt.getHours() > 12 ? dawt.getHours()-12 : dawt.getHours()) + ":" + (String(dawt.getMinutes()).length == 1 ? "0"+String(dawt.getMinutes()) : dawt.getMinutes())+(dawt.getHours() > 12 ? "pm" : "am");
	return dDays[dawt.getDay()] + ", " + dMonthsShort[dawt.getMonth()] + " " + dawt.getDate() + ", " + dawt.getFullYear() + " " + timeDisp;
}

function getElapsedTime(datetime)
{
	var tdiff = stagetrack.elapsedTimeDiffMinutes(datetime);
	if (tdiff >= 1440) tse = Math.round(tdiff/1440)+" days ago"; // in days
	else if (tdiff > 60) tse = Math.round(tdiff/60)+" hours ago"; // in hours
	else tse = Math.round(tdiff)+" minutes ago";
	return tse;
}

/*
function popBlanket()
{
	if ($("#popup-blanket").height() > 0 || popBlanket.arguments[0] == "hide")
	{
		$("#popup-blanket").fadeOut('normal').css( { "height": "0px", "width": "0px" } );
	}
	else
	{
		$("#popup-blanket").fadeIn('normal').css( { "height": $(document).height() + "px", "width": $(document.body).innerWidth() + "px" } );
	}
}
*/

function expandPanel(ctrlId)
{
	if ($(ctrlId).hasClass('expanded-panel'))
	{
		$(ctrlId).removeClass('expanded-panel');
		$('#ctrl').html('<b>&gt;</b>');
		$(ctrlId).width(250);
		// needs to shrink width of immediate children
	}
	else
	{
		$(ctrlId).addClass('expanded-panel');
		$('#ctrl').html('<b>&lt;</b>');
		$(ctrlId).width(350);
		// needs to expand width of immediate children
	}
	$(window).resize();
}

// appends a note to the system-log panel, currently used for debugging
function noteUpdate(type)
{
	var a_p = "";
	var d = new Date();	
	var curr_hour = d.getHours();
	
	if (curr_hour < 12)
		a_p = "AM";
	else
		a_p = "PM";

	if (curr_hour == 0)
		curr_hour = 12;
	if (curr_hour > 12)
		curr_hour = curr_hour - 12;	
	var curr_min = d.getMinutes();

	$('#system-log').html($('#system-log').html()+"Updated "+type+" @ "+curr_hour+":"+curr_min+":"+d.getSeconds()+"<br>");
}

/*
function populateList(ctrl,data,fieldmap)
{
	var opHndl, dlen;
	if (typeof(data.length) == "function")
	{
		dlen = data.length();
		data = data.fetch();
	}
	else
	{
		dlen = data.length;
	}
	for (c=0; c < dlen; c++) {
		opHndl = document.createElement('option');
		opHndl.text = (fieldmap ? data[c][fieldmap.text] : data[c]);
		opHndl.value = (fieldmap ? data[c][fieldmap.value] : data[c]);
		//opHndl.text = eval("data[c]"+ (fieldmap.text ? "."+fieldmap.text : ""));
		//opHndl.value = eval("data[c]"+ (fieldmap.value ? "."+fieldmap.value : ""));
		ctrl.appendChild(opHndl);
	}
	
}
*/
function populateList(ctrlid,dataobj)
{
	var selcname = 'select[id='+ctrlid+']';
	$(selcname).find('option').remove().end().append($("<option></option>").attr("value",0).text("Loading...")); 
	$.getJSON('/bin/stmapdata.php?'+dataobj.qstring,function(data) { 
		$(selcname).find('option').remove().end().append($("<option></option>").attr("value",0).text("------")); 
		$.each(data[dataobj.retobj], function(key,obj)
		{
			if (dataobj.splitvalue)
			{
				var opts = obj[dataobj.key].split(dataobj.splitvalue);
				for (i in opts)
					$(selcname).
						append($("<option></option>").
							attr("value",opts[i]).
							text(opts[i]));
			} else {
				$(selcname).
					append(
						$("<option></option>").
						attr("value",obj[dataobj.value]).
						//text(obj[dataobj.key])
						text(formatString(obj,dataobj.key,dataobj.format))
						);
			}
		});
		$('select[id='+ctrlid+']').length;
	 });
	
}

function formatString(dObj,keys,format)
{
	//var keys = strKeys.split(',');
	var fs = "";
	//alert("formatString: "+typeof(keys)+" // "+dObj[keys].toString());
	
	if (typeof(keys)!="object") return dObj[keys].toString();
	
	if (format)
	{
		fs = format;
		for (x=0;x<keys.length;x++)
		{
			var reg = new RegExp("\\{" + x + "\\}", "gm");             
			fs = fs.replace(reg, dObj[keys[x]]);
		}
	}
	else
	{
		for (x=0;x<keys.length;x++)
		{
			fs =+ (dObj[keys[x]] + "");
		}
	}
	return fs;
}

// ** FUTURE; should be moved
String.format = function()
{
	var s = arguments[0];
	for (var i = 0; i < arguments.length - 1; i++)
	{       
		var reg = new RegExp("\\{" + i + "\\}", "gm");             
		s = s.replace(reg, arguments[i + 1]);
	}
	return s;
}

/*
 * submitForm
 * 
 * opts:
 * 	success:function()
 *  submsg:string
 * 	statuspanel:elemid
 * 
 */


// FUTURE; move to stagetrack.ui
function submitForm(fdid,opts)
{
	if (!opts) opts = new Object;
	var $stp = $(opts.statuspanel ? opts.statuspanel : "#panel-status");
	var reqflds = stagetrack.checkRequiredFields(fdid+' input:visible.required,'+fdid+' textarea:visible.required',function() { $stp.html('Please fill-in all required fields').addClass('alert').fadeIn('slow'); setTimeout(function() { $stp.fadeOut('slow').removeClass('alert'); },3500); });
	if (!reqflds)
	{
		if (opts.error) opts.error();
		return;
	}
	
	// display status
	$stp.removeClass('alert').html((opts.submsg?opts.submsg:'Saving...')).fadeIn('slow');

	// ** FUTURE: needs to handle file fields?
	//var frmdata = compileFormData($(fdid).attr('name'),"object");

	// submit form data to handler
	$.post($(fdid).attr('action'), $(fdid).serialize(),
		function (result,textStatus) {
			if (opts.debug) 
				alert("DEBUG MODE: "+result+"//"+JSON.stringify(result)+" // "+$(fdid).attr('action')+" // "+JSON.stringify($(fdid).serialize()));
			var data = (result.data?result.data:result);
			//if (data && typeof(data) != "undefined" && data.length > 0 && (data[0].db_result > 0 || data[0].insertid > 0 || data[0].result))
			if (data && data.length > 0 && (data[0].db_result > 0 || data[0].insertid > 0 || data[0].result))
			{
				//if (data.length>0 && !(data.result || data.db_result)) data = data[0];
				if (data[0].db_result && data[0].db_result > 0)
					$stp.html(data[0].db_error?data[0].db_error:"Save successful");
				else
					$stp.html(data.result?data.result:"Save successful");

				setTimeout(function() { $stp.fadeOut('slow'); },3500);
				if (opts.success) opts.success(data,textStatus);
			}
			else
			{
				// ** FUTURE: need univ error handler, pass to...
				if (data && typeof(data) != "undefined" && data.length > 0 && data[0].db_error)
				{	$stp.addClass('alert').html(data[0].db_error);	}
				else if (data && typeof(data) != "undefined" && data.error)
				{	$stp.addClass('alert').html(data.error);	}
				else
				{	$stp.addClass('alert').html("An error occured while saving.");	}
				setTimeout(function() { $stp.fadeOut('slow'); },15000);
				if (opts.error) opts.error(data);
			}
		}, "JSON");

	return;
}

function searchPageContent(opts)
{
	if (!opts || !opts.target || !opts.source) return;
	//if (!opts.filter) opts.filter = "";
	var sval = $(opts.source).val().toLowerCase();
	if (sval.length > 1)
	{
		// ** FUTURE; add shortcodes, example; year:2011 matches date formatted fields
		
		// ** TODO; search page content: 'extended search' needs improvement
		var $otgt = $(opts.target).parent();
		if (!$otgt.children('').size()) $otgt.append("<div id=\"search\">"+opts.nomatch?opts.nomatch:" Searching... "+"</div>").hide();
		if (!$otgt.children('').size()) $otgt.append("<div id=\"search\">"+opts.nomatch?opts.nomatch:"No matches found"+"</div>").hide();

		$(opts.target+':hidden').each(function () { var ct=(opts.filter?$(this).find(opts.filter).text():$(this).text()); if (ct.toLowerCase().indexOf(sval)>=0) { $(this).show('slow'); } });
		$(opts.target+':visible').each(function () { var ct=(opts.filter?$(this).find(opts.filter).text():$(this).text()); if (ct.toLowerCase().indexOf(sval)<0) { $(this).hide('slow'); } });
		if (!$(opts.target+':visible').size())
		{
			var extsearch = $(opts.source).parent().attr('action');
			if (extsearch.length)
			{
				// display 'searching...'
				//$(opts.target).parent().children('').show();
				
				/*
				$.get(extsearch+sval,function() {
					// if paging isn't complete then query for additional records
					// else display 'no records found'
				});
				*/
	
			}
			else
			{
				// display no results msg
				//(opts.target).parent().children('').show();
			}
		}
	}
	else
	{
		if (sval.length < 1) $(opts.target).show();
	}
}

function mailto(rname,ename)
{
	if (typeof(document.getElementById) != "undefined")
	{
		cont = document.getElementById("mainContent");
		a = String.fromCharCode(64);
		lt = String.fromCharCode(60);
		cont.innerHTML = cont.innerHTML.replace(rname,lt+"a href='mail"+"to:"+ename+a+"digitalpropulsionlabs.com'>"+rname+lt+"/a>");
	}
}

/*
function appendToModified()
{
	if ()
	{
		
	}
}	
*/

// load tweets via native JSON, if possible
// change to displayJSONTweets
function displayJSONTweets(jsonObj)
{
	// were there results returned?
	if (jsonObj.results.length > 0)
	{
	
		var tStatus = jsonObj.results[0];
		var dispCont = "";
		var dispLyr = getCtrlHandle("twitterstatus");
		// format date
		
		dispCont += formatDateTime(tStatus.created_at) + " \"" + tStatus.text + "\"";
		dispLyr.innerHTML = dispCont;
		if (loadTweetsTimer) clearTimeout(loadTweetsTimer);
	
	}
	return;
}

function fetchTweets()
{
	var args = fetchTweets.arguments;
	if (args.length == 0)
	{
		return simpleXMLRequest("http://www.bigredracing.net/bin/twitterproxy.php?surl=0","fetchTweets","twitterstatus",1);
	}

	var metho = args[0];
	var htrep = args[1];
	if (args[2]) var displyr = getCtrlHandle(args[2]);

	switch (metho)
	{
		case "pre":
			var displyr = getCtrlHandle(args[2]);
			displyr.innerHTML += "...";
			// nothing to do
			break;
		case "error":
			var displyr = getCtrlHandle(args[2]);
			displyr.innerHTML = "Hmmm, looks like our Twitter feed has an issue. Don't worry though, we'll automatically keep trying again soon.";
			setTimeout("fetchTweets()", 30000);
			break;
		case "success":
		default :
			try {
				// FUTURE: move to 'htrep = parseCheckXML(args[1]);' function
				if (!args[1].responseXML && DOMParser) {
					var rXHndl = (new DOMParser()).parseFromString(args[1].responseText, "text/xml");
				} else {
					var rXHndl = args[1].responseXML;  //alert(args[1].responseText);
				}
				var dispcnt = args[3] ? args[3] : 5;
				var displyr = getCtrlHandle(args[2]);
				var dispCont = "";
				for (x=0;x<dispcnt;x++) {
					r = rXHndl.getElementsByTagName("item")[x];
					dispCont += formatDateTime(getElementTextNS("", "pubDate", r, 0)) + ": " + getElementTextNS("", "title", r, 0) + "<p>";
				}
				displyr.innerHTML = dispCont;
				//toggleDisplay(displyr, "show");
				setTimeout("fetchTweets()", 30000);
			}
			catch (e) {
				if (displyr) {
					//displyr.innerHTML = "<i>Information is Temporarily Unavailable.</i><br><br>";
					displyr.innerHTML = "Hmmm, looks like our Twitter feed has an issue. Don't worry though, we'll automatically keep trying again soon.";
					//if (debug) alert("notificationDetail Error: "+e.message+" ("+metho+")");
					//if (debug) alert((args[1].responseText ? args[1].responseText : ""));
				} else {
					alert("notificationDetail Error: "+e.message+" ("+metho+")"); //+(args[1].responseText ? ";\n"+args[1].responseText : "")
				}
				setTimeout("fetchTweets()", 30000);
			}
	}
	
	return true;

}

/**********************************************************************************
	Profile Management
 **********************************************************************************/

function editTeamProfile(tid)
{
	if ($('#team-profile').parent('.panel-content').size() == 0)
	{
		stagetrack.displayForm('team-profile-edit-panel','team-profile-edit',null,{qstring:"t="+tid});
		$('#team-profile-edit-panel').data('prev-form','#team-profile');  // set form to return to
	}
	else
	{
		window.location = "/settings/#team-profile-edit";
	}
}






