var ndjinURL = "http://main.ndjin.net/ng";
var ndjinServiceURL = ndjinURL+ "/service";
var returnURL = "http://www.ndjin.com/en/page4.xml";

var currentUser = null;
var currentOpenId = null;


$(document).ready(function()
{

	globalAjaxCursorChange();
	
   	authenticate();

	function gotoOpenID( openId )
	{
		window.location = ndjinURL+"/auth?returnURL="+returnURL+"&openID=" + openId;
	}
	
	$('#loginButton').click( function (){ 
		gotoOpenID( $('#loginOpenID').val() );		
	});
	$('#loginOpenID').keypress(function (e){
		if( e.which == 13 )
		{
			gotoOpenID( $('#loginOpenID').val() );
		}
	});
	$('#googleOpenIDButton').click( function (){ 
		gotoOpenID( "https://www.google.com/accounts/o8/id" );
	});
	$('#yahooOpenIDButton').click( function (){ 
		gotoOpenID( "https://me.yahoo.com/" );
	});
	
	
	$('#logoutButton').click( function (){ 
		logout();		
	});
	
	
	


	// Site CREATE ########################################

	$('#siteCreateButton').click( function (){ 
		$('#siteForm #createButton').hide( "slow" );
		$('#siteForm').show();
		$('#siteCreateBox').show("slow");
	});

	$('#siteForm #createButton').click( function (){ 
		var domain = $('#siteForm #siteFormName').val();
		createSite( domain );
	});
	$('#siteForm #cancelButton').click( function (){ 
		$('#siteForm #createButton').show( "slow" );
		$('#siteCreateBox').hide("slow");
	});
	// End Site CREATE ########################################
	




	// Account CREATE ########################################

	
	$('#recaptchaButton').click( function (){ 
		validateCaptcha( Recaptcha.get_challenge(), Recaptcha.get_response() );
	});
	
	$('#accountCreateButton').click( function (){ 
		createAccount( $('#accountName').val(), currentOpenId, $('#accountEmail').val() );
	});
	$('#accountCancelButton').click( function (){ 
		$('#createAccountButton').show( "slow" );
		$('#accountCreateBox').hide("slow");
	});
	
	$('#infoOpenID').click( function (){ 
		$('#infoOpenIDDiv').toggle( "fast" );
	});
	$('#infoName').click( function (){ 
		$('#infoNameDiv').toggle( "fast" );
	});
	
	$('#infoEmailID').click( function (){ 
		$('#infoEmailDiv').toggle( "fast" );
	});
	
	// End Account CREATE ########################################
	
	// Account UPDATE ########################################

	$('#generateAPIButton').click( function (){ 
		$('#accountFormApiKey').val( generateRandomPassword( 24 ) );
	});
	$('#accountFormUpdateButton').click( function (){ 
		updateAccount(  $('#accountFormName').val(), $('#accountFormOpenid').val(), $('#accountFormEmail').val(), $('#accountFormApiKey').val() )
	});
	// End Account UPDATE ########################################	
	
	
	SWFAddress.onChange = function() 
	{
		var callbackParam = SWFAddress.getParameter( "callback" );
		if( callbackParam ) callback( callbackParam );
		var openidParam = SWFAddress.getParameter( "openid" );
		if( openidParam ) $('#loginOpenID').val( openidParam );

	}  

	


}); // document


function globalAjaxCursorChange()   
{  
	$("html").bind("ajaxSend", function()
	{ 
		$(this).addClass('busy');  
	}).bind("ajaxComplete", function()
	{  
		$(this).removeClass('busy');  
	});  
}  


function authenticate()
{
	$.ajax({
        url: ndjinServiceURL+"/SessionService/getSessionInfo",
        dataType: "jsonp",
        data: { requestDataType:'json', responseDataType:'jsonp' },
        success: function (data, textStatus)
        {
			if( data.result != null )
			{
				if( data.result.currentOpenId != null )
				{
					currentOpenId = data.result.currentOpenId;
					$('#openIdLoginBox').hide();
					$('#openIdLoggedBox').show();
					$('#userOpenID').text( currentOpenId );

					if( data.result.user != null && data.result.user._id != null )
					{
						currentUser = data.result.user;
						$('#createAccountBox').hide();
						$('#authenticated').show();
						$('#userName').text( currentUser.name );				
						loadUser();
					}
					else
					{
						if( !data.result.captchaValid )
						{
							$('#recaptchaForm').show();
							Recaptcha.create("6LeUvwUAAAAAAPrUgDqy-5cUhfde0j6IYNy7oFCC", "recaptcha", 
								{
								   theme: "red",
								   callback: Recaptcha.focus_response_field
								}
							);
							$('#createAccountBox').hide();
						}
						else
						{
							$('#createAccountBox').show();
							$('#recaptchaForm').hide();
						}

						$('#authenticated').hide();
					}

				}
				else
				{
					$('#openIdLoginBox').show();
					$('#openIdLoggedBox').hide();
					$('#authenticated').hide();
					$('#recaptchaForm').hide();
					$('#createAccountBox').hide();
				}
				
				
			}

    		
		  } // success
	}); // ajax
}


function loadUser()
{
	$.ajax({
        url: ndjinServiceURL+"/SessionService/getUser",
        dataType: "jsonp",
        data: { requestDataType:'json', responseDataType:'jsonp' },
        success: function (data, textStatus)
        {
			if (data.result.user == null) {
				$('#authenticate').show();
				return;
			}
			else {
				currentUser = data.result.user;
				$('#accountFormName').val(currentUser.name);
				$('#accountFormEmail').val(currentUser.email);
				if ($.isArray(currentUser.openids)) 
					$('#accountFormOpenid').val(currentUser.openids[0]);
				else 
					$('#accountFormOpenid').val(currentUser.openids);
				$('#accountFormApiKey').val(currentUser.apiKey);
				loadSites();
			}	
		  } // success
	}); // ajax
}


function logout()
{
	$.ajax({
        url: ndjinServiceURL+"/SessionService/logout",
        dataType: "jsonp",
        data: { requestDataType:'json', responseDataType:'jsonp' },
        success: function (data, textStatus)
        {
			authenticate();	
		} // success
	}); // ajax
}


function createAccount( name, openid, email )
{
	if( name.length == 0  ) 
	{
		$('#accountCreateMessage' ).text( "Creation failed, provide a name" );
		return;
	}
	
	var data = 
	{ 
		ownerFieldName: 'users',
		appliedTransitionNames: ['New', 'CreateAndWaitConfirm'],
		instance: 
		{
			name: name,
			openids: openid,
			email: email
		}
	};

	$.ajax({
        url: ndjinServiceURL+"/InstanceService/applyTransitionToInstance",
        dataType: "jsonp",
        data: { requestDataType:'json', responseDataType:'jsonp', data: JSON.stringify( data ) },
        success: function (data, textStatus)
        {
			if( data.error )  
			{
				$('#accountCreateMessage' ).show();
				$('#accountCreateMessage' ).text( "Creation failed, provide another name or OpenID" );
			}
			else
			{
				$('#createAccountBox' ).hide( "slow" );
				alert( "We've sent you an email to activate your account, please check your mailbox." );
			}
		} // success
	}); // ajax	
	
	
}

function updateAccount( name, openid, email, apiKey )
{
	var data = 
	{ 
		ownerFieldName: 'users',
		appliedTransitionNames: ['Edit', 'Update'],
		instance: 
		{
			_id: currentUser._id,
			name: name,
			openids: openid,
			email: email,
			apiKey: apiKey
		}
	};

	$.ajax({
        url: ndjinServiceURL+"/InstanceService/applyTransitionToInstance",
        dataType: "jsonp",
        data: { requestDataType:'json', responseDataType:'jsonp', data: JSON.stringify( data ) },
        success: function (data, textStatus)
        {
			if( data.error )  
			{
				alert( 'Unable to update your account' );
			}
			else
			{
				alert( 'Account updated' );
			}
		} // success
	}); // ajax	
	
}


function createSite( domain )
{

	 if( /^[a-z]{4,16}$/.test( domain ) )
	 {

		var data = 
		{ 
			ownerFieldName: 'sites',
			appliedTransitionNames: ['New', 'Store'],	
			instance: {
				name: domain,
				domains: domain
			}
		};
		
		$.ajax({
	        url: ndjinServiceURL+"/InstanceService/applyTransitionToInstance",
	        dataType: "jsonp",
	        data: { requestDataType:'json', responseDataType:'jsonp', data: JSON.stringify( data ) },
	        success: function (data, textStatus)
	        {
				if( data.error )  
				{
					$('#siteForm #message' ).show();
					$('#siteForm #message').text( "Creation failed, provide another domain name" );
				}
				else
				{
					loadSites();
					$('#siteCreateBox').hide("slow");
					$('#siteForm #createButton').show( "slow" );
				 	$('#siteForm #message').hide( "slow" );
				}
			} // success
		}); // ajax	
	 
	 }
	 else
	 {
	 	$('#siteForm #message').show();
	 	$('#siteForm #message' ).text( "Unvalid domain name" );
	 }
	 
}


function deleteSite( site )
{
		var data = 
		{ 
			ownerFieldName: 'sites',
			appliedTransitionNames: ['Delete'],
			instance: site
		};
	
		$.ajax({
	        url: ndjinServiceURL+"/InstanceService/applyTransitionToInstance",
	        dataType: "jsonp",
	        data: { requestDataType:'json', responseDataType:'jsonp', data: JSON.stringify( data ) },
	        success: function (data, textStatus)
	        {
				if( data.error )  
				{
					alert( "Unable to delete site." );
				}
				else
				{
					loadSites();
				}
			} // success
		}); // ajax	
	
}


function validateCaptcha( challenge, captchaResponse )
{
	var data = 
	{ 
		challenge: challenge,
		captchaResponse: captchaResponse
	};

	$.ajax({
        url: ndjinServiceURL+"/SessionService/validateCaptcha",
        dataType: "jsonp",
        data: { requestDataType:'json', responseDataType:'jsonp', data: JSON.stringify( data ) },
        success: function (data, textStatus)
        {
			if( data.result.captchaValid )  
			{
				$('#recaptchaForm').hide( "fast" );
				$('#createAccountBox').show( "fast" );
			}
			else
			{
				alert( "Invalid captcha" );
			}
		} // success
	}); // ajax

}



function callback( callbackValue )
{
	var data = 
	{ 
		callback: callbackValue
	};

	$.ajax({
        url: ndjinServiceURL+"/InstanceService/callback",
        dataType: "jsonp",
        data: { requestDataType:'json', responseDataType:'jsonp', data: JSON.stringify( data ) },
        success: function (data, textStatus)
        {
			if( data.error )  
			{
				alert( "Unable to confirm your account creation, please contact support.")
			}
			else
			{
				authenticate();
			}
		} // success
	}); // ajax
}





function loadSites()
{
	var data = 
	{
		ownerFieldName: "sites",
		count: 10
	};
	if( currentUser )
	{
		data.filters = 
		[{
			fieldName: 'ownerUser',
			operator: "=",
			value: currentUser.name
		}];
	}

	$.ajax({
        url: ndjinServiceURL+"/InstanceService/getInstances",
        dataType: "jsonp",
        data: { requestDataType:'json', responseDataType:'jsonp', data: JSON.stringify( data ) },
        success: function (data, textStatus)
        {
          	var sitesElement = $('#sitesElement');
          	sitesElement.empty();

          	if( data.result['instances'] ) 
			{
	        	var template = $('#templates').find( '.sitesContent' );
	        	var siteTemplate = template.find( '.site' );
		   		var sitesContent = template.clone();
				sitesElement.append( sitesContent );
				
				var sites = sitesContent.find( '.sites' );
	          	sites.find( '.site' ).empty();
	
				$.each( data.result.instances, function( i, site )
	          	{
		     		var clone = siteTemplate.clone();
		     		$( ".domain", clone ).text( site.domains )
					if( $.isArray(site.domains) ) $( ".domain", clone ).text( site.domains[0] )
					else $( ".domain", clone ).text( site.domains )
		     		$( ".url", clone ).text( 'http://'+site.domains+'.ndjin.net/ng/' )
		     		$( "#deleteButton", clone ).click( function (){ 
						deleteSite( site );
					});
		     		sites.append( clone )
	      		});
			}			

		  
        } // success
	}); // ajax
	
	
}

function generateRandomPassword(length)
{
  chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
  pass = "";
  for(x=0;x<length;x++)
  {
    i = Math.floor(Math.random() * 62);
    pass += chars.charAt(i);
  }
  return pass;
}



