function loadCommon() { return Common; }
function loadGlobalUtil(){ return GlobalUtil;}	

var Common = {
		isFound : function(){ return true; },
		Init : function(){
			GlobalUtil.BrowserDetect.Init();
			},
		Service: {
	    	Url: function() {
	    	    var serviceUrl, domain = window.location.href;

	    	    if (domain.indexOf("beta.trainsignal.com") > -1) {
	    	        serviceUrl = "http://www.trainsignal.com/api";
	    	    } else if (domain.indexOf("raptorstaging.com") > -1) {
	    	        serviceUrl = "http://www.raptorstaging.com/api";
	    	    } else if (domain.indexOf("raptordev.com") > -1) {
	    	        serviceUrl = "http://www.raptordev.com/api";
	    	    } else
	    	    {
	    	        serviceUrl = "/Api";
	    	    }
	    	    return serviceUrl;
	    	}
		},		
		ConsoleLog : function(data) {if (window.console) {console.log(data);}},
		SignalR : {
			isFound : function () { return false; },
			Options : {
				Connection : '',
				ServiceUrl : '/Infrastructure/SignalR/Raw.ashx',
				Start : function (){
					UI.Common.SignalR.Options.Connection.start();					
					},
				Stop : function () {
					UI.Common.SignalR.Options.Connection.stop();
					}	
				},
			Init : function(){
				//if (GlobalUtil.UrlExists(UI.Common.SignalR.Options.ServiceUrl)) {
					
					$(function () {
						"use strict";
						UI.Common.SignalR.Options.Connection = $.connection(UI.Common.SignalR.Options.ServiceUrl);
						UI.Common.SignalR.Options.Connection.received(function (data) {
							UI.Common.ConsoleLog(window.JSON.stringify(data));							
							});
						UI.Common.SignalR.Options.Start();
						});
					
					//}
				},
			Cleanup : function(){}			
			},
		Ooyala : {
			isFound : function(){ return $(UI.Common.Ooyala.Options.Selectors.PlayerContainer).length; },
			Options : {
				Selectors : {
					PlayerContainer : '.ts-video-player',
					PlayerControls : '.ts-video-controls',
					ClipContainer : '.ts-video-player-clips',
					PlayerID : '',
					PlayerControlBar : '.controls'
					},
				PlayerSeconds : 0,
				Clips : {
					TrackViewing : function(clipId,lessonCourseId,event){
						var url = null;
						if (event == 'start') { url = UI.Common.Service.Url() + '/Clip/ClipStart' }
						else if (event == 'complete') { url = UI.Common.Service.Url() + '/Clip/ClipComplete' }
						$.ajax({
							type: "POST",
							url: url + "?clipid="+ clipId +"&lessoncourseid=" + lessonCourseId,
						    contentType: "application/json; charset=utf-8",
							success : function(data){
								data = GlobalUtil.MakeObject(data);
								if (data.OperationResult) {
									if (event == 'complete') { $('.clip[data-id="'+clipId+'"]').find('.incomplete').attr('class','complete').text('complete'); }
									}
								}
							});						
						},
					Monitor : {
						Setup : function(){
							$(UI.Common.Ooyala.Options.Selectors.ClipContainer+' li').each(function(){
								var _this = $(this), _start = _this.attr('data-marker'), _lcid = _this.attr('data-lcid'), _id = _this.attr('data-id'),_length;
								if (_this.next('li').length) { _length = (_this.next('li').attr('data-marker') - _start); }
								else { _length = (document.getElementById(UI.Common.Ooyala.Options.Selectors.PlayerID).getTotalTime() - _start); }
								UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id] = {};
								UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].Start = _start;
								UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].Length = _length;
								UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].Threshold = (_length * 0.8);
								UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].LessonClipID = _lcid;
								UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].ID = _id;
								UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].TimeSpentWatching = 0;
								UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].Complete = false;
								});
							},
						Process : function(){
							var _this = $('.clip-active'),_id = _this.attr('data-id'),_lcid = _this.attr('data-lcid'),currentTime = document.getElementById(UI.Common.Ooyala.Options.Selectors.PlayerID).getPlayheadTime();
							if (parseInt(currentTime) >= UI.Common.Ooyala.Options.PlayerSeconds) {
								UI.Common.Ooyala.Options.PlayerSeconds++;								
								//$('.col.placeholder span.label').html('Start: '+UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].Start +'<br/>Length: '+UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].Length +'<br/>Threshold: '+ UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].Threshold +'<br/>TimeSpent: '+UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].TimeSpentWatching);
								if (UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].TimeSpentWatching == 1 && document.getElementById(UI.Common.Ooyala.Options.Selectors.PlayerID).getVolume() > 0.02) {
									//UI.Common.ConsoleLog('Clip '+_id+' Start');
									UI.Common.Ooyala.Options.Clips.TrackViewing(_id,_lcid,'start');
									}
								if (document.getElementById(UI.Common.Ooyala.Options.Selectors.PlayerID).getVolume() > 0.02) {
									UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].TimeSpentWatching++;
									}																
								if (UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].TimeSpentWatching > UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].Threshold && !UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].Complete) {
									UI.Common.Ooyala.Options.Clips.Monitor.Data['c'+_id].Complete = true;
									//UI.Common.ConsoleLog('Clip '+_id+' Complete');
									UI.Common.Ooyala.Options.Clips.TrackViewing(_id,_lcid,'complete');
									}								
								}														
							},
						Data : {}
						}	
					},
				EventListener : function (playerId, eventName, eventParams) {
					switch(eventName) {
						case "playheadTimeChanged":
							UI.Common.Ooyala.Options.SetActiveClip(false);
							UI.Common.Ooyala.Options.Clips.Monitor.Process();
							break;			
						case "apiReady": 				
							UI.Common.ConsoleLog('apiReady');
							UI.Common.Ooyala.Options.APIReady();
							break;
						case 'metadataReady':				
							break;
						case 'playComplete':
							break;
						case 'volumeChanged':
							if (document.getElementById(UI.Common.Ooyala.Options.Selectors.PlayerID).getVolume() == 0 && !$('.notification:muted').length && $('*[data-view="app-landing-lesson"]').length) { UI.Common.Notification.Growl.Options.Show('muted',$('dl.lesson-instructor dd:first').text(),'Can you hear me ok?'); }
							break;
						case 'activePanelChanged':
							UI.Common.ConsoleLog('activePanelChanged');
							break;
						case 'stateChanged':
							UI.Common.ConsoleLog('stateChanged');
							break;	
						}	  
					},
				APIReady : function() { 
					//UI.Common.ConsoleLog('api ready');
					$(window).bind('resize',function() {
						var _c=$(UI.Common.Ooyala.Options.Selectors.PlayerContainer),cHeight = _c.height(),cWidth = _c.width(); 
						//UI.Common.ConsoleLog(cHeight+','+cWidth);
						_c.find('#'+UI.Common.Ooyala.Options.Selectors.PlayerID+'OoyalaPlayerOutterWrapper,object#'+UI.Common.Ooyala.Options.Selectors.PlayerID).height(cHeight+'px').width(cWidth+'px');
						});
					$(window).resize();
					var clipJumpID = GlobalUtil.GetQueryStringParam(window.location.href,'clip');					
					if (clipJumpID) { 
						var clipJump = $(UI.Common.Ooyala.Options.Selectors.ClipContainer).find('li[data-id="'+clipJumpID+'"]');						
						UI.Common.ConsoleLog(clipJump.attr('data-marker'));
						UI.Common.Ooyala.Options.NewPlayheadLocation(((clipJump.attr('data-marker') *1) + 0.5)); 
						} 									 
					UI.Common.Ooyala.Options.Clips.Monitor.Setup();					
					},
				Play : function() { 
					if (UI.Common.Ooyala.Options.ManageControls()) { document.getElementById(UI.Common.Ooyala.Options.Selectors.PlayerID).playMovie(); }					
					return true;
					},
				Pause : function() { 
					document.getElementById(UI.Common.Ooyala.Options.Selectors.PlayerID).pauseMovie();
					},
				ManageControls : function(dir){
					if (dir == 'next'){
						
						}
					else {	
						if (!$(UI.Common.Ooyala.Options.Selectors.PlayerControls).hasClass('hidden')) {
							$(UI.Common.Ooyala.Options.Selectors.PlayerControls).animate({
								height: '0%'
								}, 1000, function() {
									$(this).addClass('hidden');
								});					
							}
						}
					return true;
					},
				GetCurrentTime : function(){
					var time = document.getElementById(UI.Common.Ooyala.Options.Selectors.PlayerID).getPlayheadTime();
					return time;
					},
				NewPlayheadLocation : function(time){
					if (UI.Common.Ooyala.Options.Play()){
						document.getElementById(UI.Common.Ooyala.Options.Selectors.PlayerID).setPlayheadTime(time);
						}
					return true;
					},
				SetActiveClip : function(isLoad){
					var time = UI.Common.Ooyala.Options.GetCurrentTime(),currentClipId = $('.clip-active').attr('data-id'),newClipId;
					$(UI.Common.Ooyala.Options.Selectors.ClipContainer+' li').removeClass('clip-active');
					$(UI.Common.Ooyala.Options.Selectors.ClipContainer+' li').each(function(){
						_this = $(this); cur = _this.attr('data-marker'); next = _this.next('li').attr('data-marker');
						if (time >= cur && time < next) { _this.addClass('clip-active'); }								
						else if (time >= cur && typeof next == 'undefined') { _this.addClass('clip-active'); }
						});
					/*
                    if (!isLoad) {
						newClipId = $('.clip-active').attr('data-id');
						//UI.Common.ConsoleLog(currentClipId+' '+newClipId );							
						if (typeof currentClipId != 'undefined' && newClipId != currentClipId) {						
							UI.App.Browse.TrackViewing.Clip(currentClipId,$('.clip-active').attr('data-lcid'),'complete');
							}
						else if (newClipId == currentClipId) {
							if (!$('.clip-active').attr('data-processed')) {
								UI.App.Browse.TrackViewing.Clip(newClipId,$('.clip-active').attr('data-lcid'),'start');
								$('.clip-active').attr('data-processed','true');
								}							
							}	
						}
                    */
					return true;
					},
				},
			Init : function(){
				var videoScript = $(UI.Common.Ooyala.Options.Selectors.PlayerContainer).find('script[data-type="video"]').attr('src');
				UI.Common.Ooyala.Options.Selectors.PlayerID = GlobalUtil.GetQueryStringParam(videoScript,'playerId');				
				$(UI.Common.Ooyala.Options.Selectors.ClipContainer+' li a.lesson-clip-jump').live('click',function(){
					//var marker = (($(this).parents('li.clip:first').attr('data-marker') *1) + 0.5 );
					var marker = $(this).parent('li').attr('data-marker');
					UI.Common.Ooyala.Options.NewPlayheadLocation(marker);																			  
					return false;
					});					
				$(UI.Common.Ooyala.Options.Selectors.PlayerControls+ ' a[data-video-action^="control-lesson"]').live('click',function(){
					var _this = $(this),action=_this.attr('data-video-action').replace('control-lesson-','');
					switch(action) {
						case 'start': UI.Common.Ooyala.Options.Play(); break;
						}
					return false;
					});	
				$(UI.Common.Ooyala.Options.Selectors.PlayerControlBar+' .cntrl-prev').live('click',function() {
					var pre = $('.clip-active').prev('li');
					if(pre.length) { pre.find('a').click(); } else { $(UI.Common.Ooyala.Options.Selectors.ClipContainer+' li:last-child a').click(); }
					return false;
					});
				$(UI.Common.Ooyala.Options.Selectors.PlayerControlBar+' .cntrl-rewind').live('click',function() {
					var time = UI.Common.Ooyala.Options.GetCurrentTime(), rewindtime = 30, newtime = time - rewindtime;
					UI.Common.Ooyala.Options.NewPlayheadLocation(newtime);
					return false;
					});
				$(UI.Common.Ooyala.Options.Selectors.PlayerControlBar+' .cntrl-next').live('click',function() {
					var nex = $('.clip-active').next('li');
					if(nex.length) { nex.find('a').click(); } else { $(UI.Common.Ooyala.Options.Selectors.ClipContainer+' li:first-child a').click(); }
					return false;
					});
				$(UI.Common.Ooyala.Options.Selectors.PlayerControlBar+' .cntrl-restart').live('click',function() {
					UI.Common.Ooyala.Options.NewPlayheadLocation(0);
					return false;
					});
				},
			Cleanup : function(){}
			},
		FeedbackForm : {
			isFound : function(){ return $(UI.Common.FeedbackForm.Options.Selector).length; },
			Options : {
				Selector : '#feedback',
				Message : function (type){
					switch (type) {
						case 1: return 'Please provide some helpful words in the textbox.'; break;
						case 2: return 'Please indicate if this is a <strong>Feature Request</strong> or a <strong>Bug Issue</strong>.'; break;
						case 3: return 'Nothing is filled out. Did you accidently click the submit button?'; break;
						default: return false; break;
						}
					}
				},
			Init : function(){
				$(UI.Common.FeedbackForm.Options.Selector+' input:submit').live('click',function(){
					var _form = $(this).parents(UI.Common.FeedbackForm.Options.Selector),data;
					if (_form.hasClass('closed')) { _form.removeClass('closed'); }
					else {
						_form.find('form#feedback-form-content p').remove();
						var validation = 0;
						if (!_form.find('textarea[name="fbContent"]').val() || _form.find('textarea[name="fbContent"]').val() == _form.find('textarea[name="fbContent"]').attr('title')) { validation++; }
						if (!_form.find('input[name="fbType"]:checked').length) { validation++; validation++; }
						var validationReport = UI.Common.FeedbackForm.Options.Message(validation);
						if (!validationReport) {							
							if (!$(UI.Common.FeedbackForm.Options.Selector).hasClass('loading')){
								$(UI.Common.FeedbackForm.Options.Selector).addClass('loading');
								data = _form.find('form#feedback-form-content').serialize();							
								$.ajax({
									type: "POST",
									url: UI.Common.Service.Url()+'/Feedback/CollectFeedback?' + data,
                                    contentType: "application/json; charset=utf-8",
									success : function(data){
                                        data = GlobalUtil.MakeObject(data);
										$(UI.Common.FeedbackForm.Options.Selector).removeClass('loading');
										if (data.OperationResult) {
											_form.find('textarea[name="fbContent"]').before('<p>Feedback submitted. Thank you very much!</p>');
											_form.find('textarea[name="fbContent"]').val('');
											_form.find('input[name="fbType"]').attr('checked',false);
											}
										}
									});							
								//UI.Common.ConsoleLog(data);																			
								}
							}
						else {
							_form.find('textarea[name="fbContent"]').before('<p>'+validationReport+'</p>');
							}
						}
					UI.Common.Form.RadioCheck.Cleanup();
					UI.Common.FeedbackForm.Cleanup();	
					return false;
					});
				$(UI.Common.FeedbackForm.Options.Selector+' a.expand').live('click',function(){
					var _form = $(this).parents(UI.Common.FeedbackForm.Options.Selector),data;
					if (_form.hasClass('closed')) { _form.removeClass('closed'); }
					else { _form.addClass('closed'); }
					UI.Common.FeedbackForm.Cleanup();	
					return false;
					});				
				$(UI.Common.FeedbackForm.Options.Selector+' .short input:text').live('focus',function(){
					var _form = $(this).parents(UI.Common.FeedbackForm.Options.Selector),data;																				  
					_form.removeClass('closed');
					UI.Common.FeedbackForm.Cleanup();
					});
				UI.Common.FeedbackForm.Cleanup();
				},
			Cleanup : function(){
				var _this = $(UI.Common.FeedbackForm.Options.Selector);
				if (!_this.hasClass('closed')) {
					_this.find('.short').hide();
					_this.find('.tall').show();
					}
				else {
					_this.find('.tall').hide();
					_this.find('.short').show();
					}	
				}
			},
		jQuery: {
			Scroll : function(update){
				if (update) { $('.raptor-scroll').tinyscrollbar_update('relative'); }
				else {
					var number = $('.raptor-scroll').length,count=1;
					$('.raptor-scroll').each(function(){
						var scrollObj = $(this),_content = scrollObj.html(),_width = scrollObj.width(), _height = scrollObj.height();
						if (scrollObj.find('.soverview').length) { _content = scrollObj.find('.soverview').html(); }
						scrollObj.empty();
						scrollObj.append('<div class="scrollbar" style="height: '+_height+'px"><div class="track"><div class="thumb"><div class="end"></div></div></div></div><div class="viewport" style="width: '+(_width - 20)+'px; height: '+_height+'px"><div class="soverview" style="width: '+(_width - 20)+'px;">'+_content+'</div></div>');
						if (number == count) {
							if ($('.raptor-scroll')){
								$('.raptor-scroll').tinyscrollbar();
								}						
							}
						count++;
						});				
					}
				}
			},
		Companies : {
			isFound : function(){ return $('.user-company').length; },
			Options : {
				Markup : {
					CompanyContainer : function(){ var name = 'User'; if ($('input#FirstName').val()) { name = $('input#FirstName').val(); } return '<a href="#" class="add-user-company btn-blue effects">Add '+name+' to Company</a><table cellpadding="10" cellspacing="0" border="0" class="CompanyList" style="margin-top: 10px; border: 1px solid #eee; width: 100%; float: left; clear: both;"></table>'; }
					},
				CreateNewCompany : function(){
					var _popup = $('.popup'),_body = _popup.find('.text-holder'),_buttons = _popup.find('.btn-holder'),courseMarkup='';
					
					courseMarkup += '<tr valign="center"><td width="25%" align="left"><label for="CompanyName">Name</label></td><td align="left"><input type="text" style="width: 261px;" value="" name="CompanyName" id="CompanyName" data-val="true" /></td></tr>';
					courseMarkup += '<tr valign="center"><td width="25%" align="left"><label for="CompanyPhone">Phone</label></td><td align="left"><input type="text" style="width: 261px;" value="" name="CompanyPhone" id="CompanyPhone" data-val="true" /></td></tr>';
					courseMarkup += '<tr valign="center"><td width="25%" align="left"><label for="CompanyAddress1">Address</label></td><td align="left"><input type="text" style="width: 261px;" value="" name="CompanyAddress1" id="CompanyAddress1" data-val="true" /></td></tr>';
					courseMarkup += '<tr valign="center"><td width="25%" align="left"><label for="CompanyAddress2"></label></td><td align="left"><input type="text" style="width: 261px;" value="" name="CompanyAddress2" id="CompanyAddress2" /></td></tr>';
					courseMarkup += '<tr valign="center"><td width="25%" align="left"><label for="CompanyCity">City</label></td><td align="left"><input type="text" style="width: 261px;" value="" name="CompanyCity" id="CompanyCity" data-val="true" /></td></tr>';
					courseMarkup += '<tr valign="center"><td width="25%" align="left"><label for="CompanyState">State</label></td><td align="left"><input type="text" style="width: 261px;" value="" name="CompanyState" id="CompanyState" data-val="true" /></td></tr>';
					courseMarkup += '<tr valign="center"><td width="25%" align="left"><label for="CompanyZip">Zip</label></td><td align="left"><input type="text" style="width: 261px;" value="" name="CompanyZip" id="CompanyZip" data-val="true" /></td></tr>';
					
					_popup.find('.frame').css('padding','10px 10px 15px 10px').find('.text-holder').css('padding','0px 20px 20px 20px');
					_body.append('<div style="width: 100%; max-height: 250px;" class="raptor-scroll"><form id="NewCompanyForm" name="NewCompanyForm"><table cellpadding="3" cellspacing="0" width="100%" style="font-size: 14px;" id="load-template-container"><thead><tr><th colspan="2" align="left">Create New Company</th></tr></thead><tbody>'+courseMarkup+'</tbody></table></form></div>');							
					_buttons.append('<a href="#" class="btn-gray effects cancel-load-templates">Cancel</a><a href="#" class="btn-blue effects load-load-templates">Create New Company</a>');
					$('#load-template-container').find('th').css('border-bottom','1px solid #ccc');
					UI.Common.Form.TextBox.Cleanup();
					$('#load-template-container').find('div[class^="radioArea"]').css('margin','0px 0px 0px 5px');
					$('.cancel-load-templates').bind('click',function(){ UI.Admin.Popup.Hide(true); $('.cancel-load-templates,.load-load-templates').unbind(); return false; });											
					$('.load-load-templates').bind('click',function(){ 
						_body.find('.notification-bar').remove();
						var errors = {};
						$('#load-template-container input[data-val="true"]').each(function(i){
							if ($(this).val() == '') { errors[i] = 'Please provide '+$(this).parents('td:first').prev('td').find('label').text(); }			  
							});
						if (!GlobalUtil.IsObjectEmpty(errors)) {
							_body.prepend('<div class="notification-bar effects yellow" id="CreateCompanyMessage"><dl><dt>Message:</dt><dd><ul style="text-align: left;"></ul></dd></dl></div>');
							$.each(errors, function(j, error) {
								$('#CreateCompanyMessage dl ul').append('<li>'+error+'</li>');	
								});
							}
						else { 
							_body.find('.notification-bar').remove();
							var datavalues = GlobalUtil.SerializeToJSON($('form#NewCompanyForm'));
							$.ajax({
								type: "Post",
								url: UI.Common.Service.Url() + '/Company/Add?' + $('form#NewCompanyForm').serialize(),
                                contentType: "application/json; charset=utf-8",
								success: function (result) {
                                    result = GlobalUtil.MakeObject(result);
                                    if (result.OperationContainer.OperationResult) {
										$('.user-company-select').append('<option value="'+result.Id+'">'+result.Name+'</option>');
										$('.user-company-select option[value="'+result.Id+'"]').attr('selected',true).change();
										UI.Admin.Popup.Hide(true); 
										}
									else {
										if (!GlobalUtil.IsObjectEmpty(result.OperationContainer.OperationError)) {
											_body.prepend('<div class="notification-bar effects yellow" id="CreateCompanyMessage"><dl><dt>Message:</dt><dd><ul style="text-align: left;"></ul></dd></dl></div>');
											$.each(result.OperationContainer.OperationError, function(j, error) {
												$('#CreateCompanyMessage dl ul').append('<li>'+FriendlyMessage+'</li>');	
												});											
											}
										else {
											_body.prepend('<div class="notification-bar effects yellow" id="CreateCompanyMessage"><dl><dt>Message:</dt><dd>An unknown error occured. O_o</dd></dl></div>');
											}	
										} 
									},
								error:function(){ return false; }	
								});	
							}							
						return false; 
						});																	
					UI.Common.jQuery.Scroll();																											
					},
				SelectCompany : function(){
					var _popup = $('.popup'),_body = _popup.find('.text-holder'),_buttons = _popup.find('.btn-holder'),courseMarkup='';
					$('.user-company-select.outtaHere option:not(:selected)').each(function(){
						var _this = $(this);
						courseMarkup += '<tr valign="center"><td width="30" align="center"><input type="radio" name="company-to-load" id="company-to-load_'+_this.val()+'" value="'+_this.val()+'" /></td><td align="left"><label for="company-to-load_'+_this.val()+'">'+_this.text()+'</label></td></tr>';
						});
					if (courseMarkup == ''){ courseMarkup = '<tr valign="center"><td colspan="2" style="color: #666; font-size: 21px; padding: 20px 0px;">Sorry, there are no available companies. <a href="#" class="create-new-company">Create a Company</a></td></tr>'; }
					_popup.find('.frame').css('padding','10px 10px 15px 10px').find('.text-holder').css('padding','0px 20px 20px 20px');
					_body.append('<div style="width: 100%; max-height: 250px;" class="raptor-scroll"><table cellpadding="3" cellspacing="0" width="100%" style="font-size: 14px;" id="load-template-container"><thead><tr><th colspan="2" align="left">Name <a href="#" class="create-new-company" style="float: right; font-weight: normal; text-decoration: underline;">Create New Company</a></th></tr></thead><tbody>'+courseMarkup+'</tbody></table></div>');							
					_buttons.append('<a href="#" class="btn-gray effects cancel-load-templates">Cancel</a><a href="#" class="btn-blue effects load-load-templates">Link Selected Company</a>');
					$('#load-template-container').find('th').css('border-bottom','1px solid #ccc');
					$('#load-template-container').find('tr:odd td').css('background-color','#f6f6f6');
					UI.Common.Form.RadioCheck.Cleanup();
					$('#load-template-container').find('div[class^="radioArea"]').css('margin','0px 0px 0px 5px');
					$('.cancel-load-templates').bind('click',function(){ UI.Admin.Popup.Hide(true); $('.cancel-load-templates,.load-load-templates').unbind(); return false; });											
					$('.load-load-templates').bind('click',function(){ 
						_body.find('.notification-bar').remove();
						if (!$('#load-template-container').find('input:checked').length) {
							_body.prepend('<div class="notification-bar effects yellow"><dl><dt>Message:</dt><dd>Please select a company to link.</dd></dl></div>');							
							}
						else { 
							var selectedCompany = $('#load-template-container').find('input:checked').val();
							$('.user-company-select option[value="'+selectedCompany+'"]').attr('selected',true).change();
							UI.Admin.Popup.Hide(true); 
							}							
						return false; 
						});																	
					UI.Common.jQuery.Scroll();																											
					},
				RemoveCompany : function(obj){
					var company = obj.parents('tr:first').attr('data-id');
					$('.user-company-select option[value="'+company+'"]').attr('selected',false).change();
					}
				},
			Init : function(){
				$('.user-company-select option').live('change',function(){ UI.Common.Companies.Cleanup(); });
				$('.add-user-company').live('click',function(){ UI.Admin.Popup.Show('UI.Common.Companies.Options.SelectCompany'); return false; });				
				$('.remove-user-company').live('click',function(){ UI.Common.Companies.Options.RemoveCompany($(this)); return false; });				
				$('.create-new-company').live('click',function(){ UI.Admin.Popup.Show('UI.Common.Companies.Options.CreateNewCompany'); return false; });								
				UI.Common.Companies.Cleanup();
				},
			Cleanup : function(){
				$('.user-company').find('select').each(function(){ var _this = $(this); if (!_this.hasClass('outtaHere')) { _this.addClass('outtaHere').addClass('user-company-select'); }});
				$('.user-company-select.outtaHere').each(function(){ 
					var _this = $(this),_list; 
					if (!_this.prev('.CompanyList').length) { _this.before(UI.Common.Companies.Options.Markup.CompanyContainer()); }
					_list = _this.prev('.CompanyList');
					_list.empty();
					if (_this.find('option:selected').length) {
						_this.find('option:selected').each(function(){
							_list.append('<tr data-id="'+$(this).val()+'" data-type="company"><td>'+$(this).text()+'</td><td align="right"><a href="#" class="micro remove-user-company">Remove from Company</a></td></tr>');									
							});
						_list.find('tr:odd td').css('background','#f6f6f6');						
						}
					else {
						_list.append('<tr><td colspan="2" style="text-align: center; padding: 20px 0px; font-size: 18px; color: #666;">No companies, yet. <a href="#" class="add-user-company">Add to Company</a></td></tr>');
						}	
					});
				}			
			},
		DatePicker: {
			isFound: function(){ return $('input.date').length; },
			Options: {},
			Init: function(){
				$('input.date').datepicker({ dateFormat: "mm/dd/yy" });	
				(function ($) {
					// The validator function
					$.validator.addMethod('rangeDate',
							   function (value, element, param) {
								   if (!value) {
									   return true; // no testing is required here!
								   }
								   try {
									   var dateValue = new Date(value);
								   }
								   catch (e) {
									   return false;
								   }
								   return param.min <= dateValue && dateValue <= param.max;
							   });
					// The adapter to support ASP.NET MVC unobtrusive validation
					$.validator.unobtrusive.adapters.add('rangedate', ['min', 'max'],
					function (options) {
						var params = {
							min: $.datepicker.parseDate("yy/mm/dd", options.params.min),
							max: $.datepicker.parseDate("yy/mm/dd", options.params.max)
						};
						options.rules['rangeDate'] = params;
						if (options.message) {
							options.messages['rangeDate'] = options.message;
						}
					});
				} (jQuery));					
				},
			Cleanup: function(){}								
			},
		Form: {
			Cleanup : function(){
				UI.Common.Form.TextBox.Cleanup();
				UI.Common.Form.Password.Cleanup();
				UI.Common.Form.RadioCheck.Cleanup();				
				},
			Validate : {
				isFound : function(){ return true; },		
				Options : {
					Markup : {
						Asterisk : '<span class="required">*</span>',
						Message : function(id,msg){
							var markup = '<span data-val-id="[[ID]]" class="field-validation-valid">[[MESSAGE]]</span>';
							markup = markup.replace(/\[\[ID\]\]/g,id).replace(/\[\[MESSAGE\]\]/g,msg);
							return markup;
							}
						},
					Flags : ['data-val-required','data-val-regex-pattern','data-val-regex','data-val-equalto-other','data-val-equalto','data-val-number','data-val-number'],
					ShowError : function(obj,attr){
						if (!$('*[data-val-id="val-error-'+obj.attr('name')+'"]').length) {
							var mark;
							if (obj.is(':text,textarea,:password') && !obj.parents('form.form-account').length) {
								if (obj.hasClass('tinymce')) { mark = obj.next('.mceEditor'); }
								else { mark = obj.parents('.text:first'); }
								}
							else if (obj.is(':password') && obj.parents('form.form-account').length && obj.next('.passwordProxy').length) {
								mark = obj.parents('.text:first').find('.passwordProxy');								
								}								
							else { mark = obj; }
							mark.after(UI.Common.Form.Validate.Options.Markup.Message('val-error-'+obj.attr('name'),obj.attr(attr)));
							UI.Common.ConsoleLog(attr+' ' +obj.attr(attr));
							}
						},
					Run : function(obj){
						var _flags = UI.Common.Form.Validate.Options.Flags,errors=0;
						$('.field-validation-valid').remove();
						obj.find('*[data-val="true"]').each(function(){
							var _this = $(this);													 
							for (var f in _flags) {							
								if (_this.attr(_flags[f])) {
									switch(_flags[f]){
										case 'data-val-required': 
											if ((!_this.val()) || (_this.val() == _this.attr('title')) || (_this.hasClass('tinymce') && _this.val().match(/<p><\/p>/))) {
												UI.Common.Form.Validate.Options.ShowError(_this,_flags[f]);
												errors++;
												}
											break;
										case 'data-val-regex': 											
											switch(_this.attr('data-val-regex-type')) {
												case 'email': 
													var subject = _this.val();
													var pattern = /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; break;												
												case 'cc': 
													var subject = _this.val().replace(/ /g,'').replace(/-/g,'');
													var pattern = /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/; 
													break;
												}
										   	if (!pattern.test(subject)) {
												UI.Common.Form.Validate.Options.ShowError(_this,_flags[f]);
												errors++;
											   }
											break;
										case 'data-val-equalto' : 
											if (_this.val() != $(_this.attr('data-val-equalto-other')).val()) {
												UI.Common.Form.Validate.Options.ShowError(_this,_flags[f]);
												errors++;
												}									
											break;
										case 'data-val-number' : 
											var match = _this.val().match(/[0-9]+/);
										   	if (!match) {
												UI.Common.Form.Validate.Options.ShowError(_this,_flags[f]);
												errors++;
											   }											
											/*
											if (!_this.val().is(':match("/[0-9]+/")') ) {
												UI.Common.Form.Validate.Options.ShowError(_this,_flags[f]);
												errors++;
												}
											*/										
											break;
										}
									}
								}
							});
						if (errors) { return false; }
						else { return true; }
						//return false;
						}
					},
				Init : function(){
					//$('*[data-val-regex-type="email"]').attr('data-val-regex-pattern',"/^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/");
					//$('*[data-val-regex-type="cc"]').attr('data-val-regex-pattern',"/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/");
					$('form').live('submit',function(){
						var validate = UI.Common.Form.Validate.Options.Run($(this));
						return validate;
						});
					$('*[data-val-equalto-other]').live('change',function(){
						UI.Common.Form.Validate.Options.Run($(this).parents('form:first'));							 						
						});
					$('.account-password').live('keypress change',function(){
						UI.Common.Form.Validate.Cleanup();						 						
						});
					UI.Common.Form.Validate.Cleanup();
					},
				Cleanup : function(){
					$('.form-account .passwordProxy').width('245px');
					$('span.required,.field-validation-valid').remove();
					$('*[data-val="true"]').each(function(){
						var obj=$(this);
						if (obj.is(':text,textarea,:password') && !obj.parents('form.form-account').length) {
							mark = obj.parents('.text:first');								
							}
						else { mark = obj; }
						mark.after(UI.Common.Form.Validate.Options.Markup.Asterisk);					  
						});
					}
				},			
			TextBox: {
				isFound: function(){return $('input:text, textarea').length; },
				Options: {
					Inputs: function(){ return $('input:text, textarea'); },
					focusClass: 'focus',
				},
				Init: function(){
					UI.Common.Form.TextBox.Options.Inputs().live('focusin focusout', function(e){
						var _this = $(this),_ph = _this.attr('title');
                        if (e.type == 'focusin') { 
                            $(this).addClass(UI.Common.Form.TextBox.Options.focusClass); $(this).parent('.text').addClass(UI.Common.Form.TextBox.Options.focusClass); 
                            if (_ph) {
                                if (_this.val() == _ph || _this.val() === null || _this.val() == '') { _this.val(''); }                                
                                }
                            }
						if (e.type == 'focusout') { 
                            $(this).removeClass(UI.Common.Form.TextBox.Options.focusClass); $(this).parent('.text').removeClass(UI.Common.Form.TextBox.Options.focusClass); 
                            if (_ph) {
                                if (_this.val() == _ph || _this.val() === null || _this.val() == '') { _this.val(_ph); }                                
                                }
                            }						
					});
					UI.Common.Form.TextBox.Cleanup();
				},
				Cleanup: function() {
					UI.Common.Form.TextBox.Options.Inputs().each(function(){						
						var _this = $(this),_ph = _this.attr('title');
                        if((!_this.parent('div.text').length && _this.parents('div.content-block').length && !_this.hasClass('tinymce') && !_this.hasClass('no-style')) || _this.parents('.popup').length){
							_this.wrap('<div class="text effects" style="width: 271px"></div>');
							}				
						if (_ph && (_this.val() == _ph || _this.val() === null || _this.val() == '')) { _this.val(_ph); }
						});
					}
			},
			Password: {
				isFound: function(){return $('input:password').length;},
				Options: {
					Inputs: function(){ return $('input:password'); },
					proxyModel: '<input type="text" class="passwordProxy" value=""/>',
					proxyClass: 'passwordProxy',
					focusClass: 'focus'			
				},
				Init: function(){
					UI.Common.Form.Password.Options.Inputs().live('focusin focusout', function(e){ 
                        var _this = $(this),_proxy = _this.parents('.text:first').find('.'+UI.Common.Form.Password.Options.proxyClass);
                        if (_proxy.length) {
                            if (e.type == 'focusin') { _this.addClass('focus'); _this.parents('.text:first').addClass('focus'); _proxy.hide(); }
                            else if (e.type == 'focusout') {
                                if (_this.val() == _this.attr('title') || _this.val() === null || _this.val() == '') { _this.hide(); _proxy.show(); }
                                _this.removeClass('focus'); _this.parents('.text:first').removeClass('focus');
                                }                        
                            }                        
                        });				
					$('.'+UI.Common.Form.Password.Options.proxyClass).live('focusin focusout', function(e){ 
                        var _this = $(this), _real = _this.parents('.text:first').find(':password');
                        if (e.type == 'focusin') {
                            _real.show().focus(); _this.parents('.text:first').addClass('focus');
                            }
                        else if (e.type == 'focusout') { _this.parents('.text:first').removeClass('focus'); }
                        });
					UI.Common.Form.Password.Cleanup();
				},
				Cleanup: function(e,obj){
                    UI.Common.Form.Password.Options.Inputs().each(function(){
						var _this = $(this);				
						if(!_this.parent('div.text').length){ _this.wrap('<div class="text effects" style="width: 271px"></div>'); }					
						if( _this.attr('title')){
                            if (!_this.next('.'+UI.Common.Form.Password.Options.proxyClass).length) { $(UI.Common.Form.Password.Options.proxyModel).insertAfter(_this); }					
						    var _thisProxy = _this.next('.'+UI.Common.Form.Password.Options.proxyClass);
						    _thisProxy.val(_this.attr('title'));					
                            if (_this.val() == _this.attr('title') || _this.val() === null || _this.val() == '') { _this.hide(); _thisProxy.show(); }
                            else {_thisProxy.hide();}
                            }
						});					
				},
			},
			RadioCheck: {
				isFound: function(){ return $('input:radio,input:checkbox').length; },
				Options: {
					CheckBox: {
						checkboxStructure: '<div></div>',
						checkboxDisabled: 'disabled',
						checkboxDefault: 'checkboxArea',
						checkboxChecked: 'checkboxAreaChecked'						
					},
					Radio: {
						radioStructure: '<div></div>',
						radioDisabled: 'disabled',
						radioDefault: 'radioArea',
						radioChecked: 'radioAreaChecked'						
					}
				},
				Init: function(){
					$('div[class^="checkboxArea"], div[class^="radioArea"]').live('click',function(){ 
						$(this).next('input:checkbox, input:radio').click(); 							 
						UI.Common.Form.RadioCheck.Cleanup();
						});												
					$('input:radio,input:checkbox').live('change',function(){ UI.Common.Form.RadioCheck.Cleanup(); });
					UI.Common.Form.RadioCheck.Cleanup(); 
				},
				Cleanup: function(){
					$('input:checkbox').each(function(){
						if(!$(this).hasClass('outtaHere')){
							$(this).addClass('outtaHere').before('<div></div>');
							}
						var replaced = $(this).prev('div');								
						if ($(this).is(':disabled')) { replaced.attr('class',UI.Common.Form.RadioCheck.Options.CheckBox.checkboxDisabled); }
						else if ($(this).is(':checked')) { replaced.attr('class',UI.Common.Form.RadioCheck.Options.CheckBox.checkboxChecked); } 
						else { replaced.attr('class',UI.Common.Form.RadioCheck.Options.CheckBox.checkboxDefault); }							
						});												
					$('input:radio').each(function(i){
						if(!$(this).hasClass('outtaHere')){
							$(this).addClass('outtaHere').before('<div></div>');
						}
						var replaced = $(this).prev('div');													
						if ($(this).is(':disabled')) { replaced.attr('class',UI.Common.Form.RadioCheck.Options.Radio.radioDisabled); }
						else if ($(this).is(':checked')) { replaced.attr('class',UI.Common.Form.RadioCheck.Options.Radio.radioChecked); } 
						else { replaced.attr('class',UI.Common.Form.RadioCheck.Options.Radio.radioDefault); }							
					});												
				}
			}			
		},
		Notification : {
			Growl : {
				isFound : function() { return UI.Common.Notification.Growl.Options.Container().length; },
				Options : {
					Container : function(){ return $('#notifications');},
					Markup : {
						Message : function(id,h,m,u){
							markup = '<div class="notification" id="[[ID]]" style="opacity: 0; top: -110px; right: 0;"><a href="#" class="btn-close">Close</a><span class="title">[[HEADLINE]]</span>[[ACTION]]<p>[[MESSAGE]]</p></div>';
							markup = markup.replace(/\[\[ID\]\]/g,id).replace(/\[\[HEADLINE\]\]/g,h).replace(/\[\[MESSAGE\]\]/g,m);
							if (u) { markup = markup.replace(/\[\[ACTION\]\]/g,'<span class="btn-goto"><a href="'+u+'" class="active">VIEW</a></span>'); }
							else { markup = markup.replace(/\[\[ACTION\]\]/g,'');}
							return markup;
							}
						},
					Show : function(id,h,m,u){
						var notification = UI.Common.Notification.Growl.Options.Markup.Message(id,h,m,u);
						 UI.Common.Notification.Growl.Options.Container().append(notification);
						 $('.notification#'+id).animate({opacity : 1,top: '+=110'}, 1500, function() {setTimeout(function(){ UI.Common.Notification.Growl.Options.Hide(id); },10000);});
						},
					Hide : function(id){
						$('.notification#'+id).animate({ opacity : 0.0}, 1000, function() { $(this).remove();});
						},
					Demo : function(){
						setTimeout(function(){ UI.Common.Notification.Growl.Options.Show('not1','Steven Maguire','Your lunch foods are ready!','/Dashboard'); },1000);
						setTimeout(function(){ UI.Common.Notification.Growl.Options.Show('not2','Tim Mauldin','Steven said lunch is ready','/Dashboard'); },4000);
						setTimeout(function(){ UI.Common.Notification.Growl.Options.Show('not3','System','Eric Munn just logged in to customer service chat system.'); },6000);
						setTimeout(function(){ UI.Common.Notification.Growl.Options.Show('not4','Steven Maguire','Are you coming? Food is getting cold!','/Dashboard'); },15000);
						}
					},
				Init : function(){
					$('.notification a.btn-close').live('click',function(){
						var _this = $(this),id = _this.parents('.notification:first').attr('id');
						UI.Common.Notification.Growl.Options.Hide(id);
						return false;
						});				
					},
				Cleanup : function(){}	
				},
			Inline: {
				isFound : function() { return true; },
				Options : {
					Markup : {
						Message : function(id,h,m,u,clos){
							markup = '<div class="notification-bar effects yellow" id="[[ID]]"><dl><dt>[[HEADLINE]]:</dt><dd>[[MESSAGE]][[ACTION]]</dd></dl>[[CLOSE]]</div>';
							markup = markup.replace(/\[\[ID\]\]/g,id).replace(/\[\[HEADLINE\]\]/g,h).replace(/\[\[MESSAGE\]\]/g,m);
							if (u) { markup = markup.replace(/\[\[ACTION\]\]/g,' <a href="'+u+'" class="active">VIEW</a>'); }
							else { markup = markup.replace(/\[\[ACTION\]\]/g,'');}
							if (clos) { markup = markup.replace(/\[\[CLOSE\]\]/g,'<a class="close effects" href="#">X</a>'); }
							else { markup = markup.replace(/\[\[CLOSE\]\]/g,'');}
							return markup;
							}
						},
					Show : function(obj,id,h,m,u,clos){
						var notification = UI.Common.Notification.Inline.Options.Markup.Message(id,h,m,u,clos);
						 $(obj).prepend(notification);						 
						},
					Hide : function(id){
						$('.notification-bar#'+id).remove();
						},
					},
				Init : function(){
					$('.notification-bar a.close').live('click',function(){
						var _this = $(this),id = _this.parents('.notification-bar:first').attr('id');
						UI.Common.Notification.Inline.Options.Hide(id);
						return false;
						});				
					},
				Cleanup : function(){}	
				}
			},	
	}
var GlobalUtil = {
	ProcessObject : function (key,value) {
		//console.log(key + " : "+value);
	},
	TraverseObject : function (o,func) {
		for (i in o) {
			var current = o[i];
			if (typeof(current) == "object" && current != null) {
				if (typeof current.isFound == 'function') { 
					var found = current.isFound();
					if (found) {
						current.Init();
					} 
				}
			GlobalUtil.TraverseObject(current,func);
			}
		}
	},
	SerializeToJSON : function(obj){
		var o = {};
		var a = obj.serializeArray();
		$.each(a, function() {
			if (o[this.name] !== undefined) {
				if (!o[this.name].push) {
					o[this.name] = [o[this.name]];
				}
				o[this.name].push(this.value || '');
			} else {
				o[this.name] = this.value || '';
			}
		});
		return o;		
		},
	RandomNumber : function(start,finish){
		return Math.floor(start + Math.random() * ((finish - start))+1);
		},
	IsObjectEmpty : function (obj) {
		for(var i in obj) {return false;}
		return true;		
		},
	UrlExists: function(url){
		var http = new XMLHttpRequest();
		http.open('HEAD', url, false);
		http.send();
		return http.status!=404;		
		},
	RoundNumber: function (num, dec) {
        var result = Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
        return result;
    },
    NumberToDollars: function (n) {
        var dollarAmount = (n < 0 ? '-$' : '$') + Math.abs(n).toFixed(2);
        return this.AddCommasToNumber(dollarAmount);
    },
    AddCommasToNumber: function (nStr) {
        nStr += '';
        x = nStr.split('.');
        x1 = x[0];
        x2 = x.length > 1 ? '.' + x[1] : '';
        var rgx = /(\d+)(\d{3})/;
        while (rgx.test(x1)) {
            x1 = x1.replace(rgx, '$1' + ',' + '$2');
        }
        return x1 + x2;
    },
    FormatCurrency: function (num) {
        num = num.toString().replace(/\$|\,/g, '');
        if (isNaN(num))
            num = "0";
        sign = (num == (num = Math.abs(num)));
        num = Math.floor(num * 100 + 0.50000000001);
        cents = num % 100;
        num = Math.floor(num / 100).toString();
        if (cents < 10)
            cents = "0" + cents;
        for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++)
            num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3));
        return (((sign) ? '' : '-') + '$' + num + '.' + cents);
    },
    ConvertJSonDate: function (date) {
        if (date == null) { return date; }
        var time = date.replace(/\/Date\(([0-9]*)[-|+]([0-9]*)\)\//, '$1');
        var date = new Date();
        date.setTime(time);
        return date;
    },
    ShortDate: function (jsonDate) {
        return dateFormat(this.ConvertJSonDate(jsonDate), "mm/dd/yyyy")
    },
    MediumDate: function (jsonDate) {
        return dateFormat(this.ConvertJSonDate(jsonDate), "mmm dd yyyy")
    },
    LongDate: function (jsonDate) {
        return dateFormat(this.ConvertJSonDate(jsonDate), "ddd dd mmm, yyyy | H.MM tt")
    },
    GigDateFormat: function (jsonDate) {
        return dateFormat(this.ConvertJSonDate(jsonDate), "dddd dd mmm yyyy")
    },
    GigTimeFormat: function (jsonDate) {
        return dateFormat(this.ConvertJSonDate(jsonDate), "H.MM tt")
    },
    FormatYear: function (jsonDate) {
        return dateFormat(this.ConvertJSonDate(jsonDate), "yyyy")
    },

    SecondsToHour: function(jsonDate) {
        var h = Math.floor(jsonDate / 3600);
        jsonDate %= 3600;
        var m = Math.floor(jsonDate / 60);
        var s = Math.floor(jsonDate % 60);

        return (h > 0 ? h + ' hour' + ((h > 1) ? 's ' : ' ') : '') +
               (m > 0 ? m + ' min' + ((m > 1) ? 's ' : ' ') : '');
    },
	SecondsToTime : function(secs,type)
	{
		var hours = Math.floor(secs / (60 * 60));
		var divisor_for_minutes = secs % (60 * 60);
		var minutes = Math.floor(divisor_for_minutes / 60);	 
		var divisor_for_seconds = divisor_for_minutes % 60;
		var seconds = Math.ceil(divisor_for_seconds);	   
		var obj = {
			"h": GlobalUtil.PadNumber(hours),
			"m": GlobalUtil.PadNumber(minutes),
			"s": GlobalUtil.PadNumber(seconds)
			};
		if (type == 'str') { return obj.h+':'+obj.m+':'+obj.s; }
		else { return obj; }
	},
	PadNumber : function(num){
		return (num < 10 ? '0' : '') + num;
		},
	GetQueryStringParam : function(href,target){
		var value,string,_p;
		var string = href.split('?');
		if (typeof string[1] != 'undefined') { string = string[1] }
		else { string = string[0]}
		string = string.split('&');
		for (p in string){
			_p = string[p].split('=');
			if (_p[0].toLowerCase() == target.toLowerCase()) { value = _p[1]; }
			}
		return value;
		},
	Cookie: {
		Create: function (name,value,days) {
			if (days) {
				var date = new Date();
				date.setTime(date.getTime()+(days*24*60*60*1000));
				var expires = "; expires="+date.toGMTString();
				}
			else var expires = "";
			document.cookie = name+"="+value+expires+"; path=/";
			},
		Read: function (name) {
			var nameEQ = name + "=";
			var ca = document.cookie.split(';');
			for(var i=0;i < ca.length;i++) {
				var c = ca[i];
				while (c.charAt(0)==' ') c = c.substring(1,c.length);
				if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
				}
			return null;
			},
		Erase: function (name) {
			createCookie(name,"",-1);
			}	
		},
	TruncateText : function(length,subject){
		if (subject.length > length) {
			subject = subject.substring(0, length);
			subject = subject.replace(/\w+$/, '');
			subject += '...';
			}		
		return subject;		
		},
	ExecuteFunctionByName : function(functionName, context) {
		var args = Array.prototype.slice.call(arguments).splice(2);
		var namespaces = functionName.split(".");
		var func = namespaces.pop();
		for(var i = 0; i < namespaces.length; i++) {
			context = context[namespaces[i]];
			}
		return context[func].apply(this, args);
		},	
	BrowserSize : function(){
		var browserSize = {"Width":0,"Height":0};
		if (typeof window.innerWidth != 'undefined'){
			browserSize.Width = window.innerWidth,
			browserSize.Height = window.innerHeight
			}
		else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0){
			browserSize.Width = document.documentElement.clientWidth,
			browserSize.Height = document.documentElement.clientHeight
			}
		else{
			browserSize.Width = document.getElementsByTagName('body')[0].clientWidth,
			browserSize.Height = document.getElementsByTagName('body')[0].clientHeight
			}
		return browserSize;
		},
	MakeObject : function (obj) {
		if (typeof obj != 'object') { obj = $.parseJSON(obj); }
		return obj;
		},
	BrowserDetect : {		
		Init: function () {
			this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
			this.version = this.searchVersion(navigator.userAgent)
				|| this.searchVersion(navigator.appVersion)
				|| "an unknown version";
			this.OS = this.searchString(this.dataOS) || "an unknown OS";
		},
		searchString: function (data) {
			for (var i=0;i<data.length;i++)	{
				var dataString = data[i].string;
				var dataProp = data[i].prop;
				this.versionSearchString = data[i].versionSearch || data[i].identity;
				if (dataString) {
					if (dataString.indexOf(data[i].subString) != -1)
						return data[i].identity;
				}
				else if (dataProp)
					return data[i].identity;
			}
		},
		searchVersion: function (dataString) {
			var index = dataString.indexOf(this.versionSearchString);
			if (index == -1) return;
			return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
		},
		dataBrowser: [
			{
				string: navigator.userAgent,
				subString: "Chrome",
				identity: "Chrome"
			},
			{ 	string: navigator.userAgent,
				subString: "OmniWeb",
				versionSearch: "OmniWeb/",
				identity: "OmniWeb"
			},
			{
				string: navigator.vendor,
				subString: "Apple",
				identity: "Safari",
				versionSearch: "Version"
			},
			{
				prop: window.opera,
				identity: "Opera",
				versionSearch: "Version"
			},
			{
				string: navigator.vendor,
				subString: "iCab",
				identity: "iCab"
			},
			{
				string: navigator.vendor,
				subString: "KDE",
				identity: "Konqueror"
			},
			{
				string: navigator.userAgent,
				subString: "Firefox",
				identity: "Firefox"
			},
			{
				string: navigator.vendor,
				subString: "Camino",
				identity: "Camino"
			},
			{		// for newer Netscapes (6+)
				string: navigator.userAgent,
				subString: "Netscape",
				identity: "Netscape"
			},
			{
				string: navigator.userAgent,
				subString: "MSIE",
				identity: "Explorer",
				versionSearch: "MSIE"
			},
			{
				string: navigator.userAgent,
				subString: "Gecko",
				identity: "Mozilla",
				versionSearch: "rv"
			},
			{ 		// for older Netscapes (4-)
				string: navigator.userAgent,
				subString: "Mozilla",
				identity: "Netscape",
				versionSearch: "Mozilla"
			}
		],
		dataOS : [
			{
				string: navigator.platform,
				subString: "Win",
				identity: "Windows"
			},
			{
				string: navigator.platform,
				subString: "Mac",
				identity: "Mac"
			},
			{
				   string: navigator.userAgent,
				   subString: "iPhone",
				   identity: "iPhone/iPod"
			},
			{
				string: navigator.platform,
				subString: "Linux",
				identity: "Linux"
			}
		]
	
	},
	}		
