﻿//------------------------------------------------------------------------------
//
// ADOBE SYSTEMS INCORPORATED
// Copyright 2000-2004 Adobe Systems Incorporated 
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute 
// this file in accordance with the terms of the Adobe license 
// agreement accompanying it. If you have received this file 
// from a source other than Adobe, then your use, modification, 
// or distribution of it requires the prior written permission 
// of Adobe.
//
//------------------------------------------------------------------------------

///////////////////////////////////////////////////////////////////////////////
//
// Perforce related event handler
//

var p4 = new Object;	// perforce handler class
var p4failed = new Object;

//-----------------------------------------------------------------------------
// 
// vcsNew(...)
// 
// Purpose: create new site using Perforce as VCS
// 
//-----------------------------------------------------------------------------

function vcsNew(e) 
{ 
	var url = e.url.toLowerCase();
	
	if( isSubFolderOf( url, p4[e.settings.client].localRoot ) > -1 )
	{
		if( e.creationType == 'mount' )
		{
			var projectURL = '';
			var rootURL = e.settings.url;
			
			//
			// is there a path after the server url
			//
			var pos0 = rootURL.indexOf( '/' );
			
			if( pos0 >= 0 && pos0 < rootURL.length-1 )
				projectURL = rootURL.slice( pos0 ).strippWS();
				
			if( projectURL[0] != '/' )
				projectURL = '/' + projectURL;

			if( projectURL[projectURL.length-1] != '/' )
				projectURL += '/';
				
			projectURL += e.settings.name;
			projectURL = p4[e.settings.client].localRoot + projectURL;

			if( projectURL[projectURL.length-1] != '/' )
				projectURL += '/';
				
			projectURL += '...';
			
			app.startProgress( module.localize( '$$$/connect2server=Connect to server' ), module.localize( '$$$/syncfiles=Sync files' ), true );
			
			p4[e.settings.client].sync( projectURL, null, '-f' );
			
			app.stopProgress();
			
			writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
		}
		else
			writeEventLog( e, '', '' );
			
		p4failed[e.settings.client+e.settings.name] = false;
	}
	else
	{
		p4[e.settings.client] = null;
		p4failed[e.settings.client+e.settings.name] = true;
		e.result = module.localize( '$$$/errornew=Local root folder of client specification does not match to site root folder' );
		writeEventLog( e, '', '' );
	}
} 

//-----------------------------------------------------------------------------
// 
// vcsLogin(...)
// 
// Purpose: login
// 
//-----------------------------------------------------------------------------

function vcsLogin(e) 
{ 
	try
	{
		if( typeof( p4failed[e.settings.client+e.settings.name] ) == 'undefined' || p4failed[e.settings.client+e.settings.name] == false )
			p4[e.settings.client] = new Perforce( e.settings.url, e.settings.port, e.settings.client, e.settings.user, e.settings.password );
	}
	catch( exp )
	{
		p4[e.settings.client] = null;
		p4failed[e.settings.client+e.settings.name] = true;
		e.result = module.localize( '$$$/connectionfailed=Connection to server failed.' );
	}
	
	writeEventLog( e, '', '' );
} 

//-----------------------------------------------------------------------------
// 
// vcsLogout(...)
// 
// Purpose: logout
// 
//-----------------------------------------------------------------------------

function vcsLogout(e) 
{ 
	p4[e.settings.client] = null;
	writeEventLog( e, '', '' );
} 

//-----------------------------------------------------------------------------
// 
// vcsHeadRev(...)
// 
// Purpose: get head revision from server
// 
//-----------------------------------------------------------------------------

function vcsHeadRev(e) 
{ 
	var ret = p4[e.settings.client] != null;
	
	if( ret )
	{
		var ref = e.references.first();
		
		var progressDelta = 1.0 / ( e.references.length() + 1 );
		var progress = progressDelta;
		
		app.startProgress( module.localize( '$$$/connect2server=Connect to server' ), module.localize( '$$$/sync2head=Sync to head revision of' ) + ' ' + ref.relurl, false );
		
		while( typeof(ref) != 'undefined' && ref != null )
		{
			app.setProgress( progress, module.localize( '$$$/sync2head=Sync to head revision of' ) + ' ' + ( ref == null ? '' : ref.relurl ) );
			progress += progressDelta;

			p4[e.settings.client].sync( ref );
			ref = e.references.next();
			writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
			
			ret |= p4[e.settings.client].lastResult.exit == 0;
		}
		
		app.stopProgress();
	}
	
	e.result = ret ? 'ok' : module.localize( '$$$/failed=Failed' );
} 

//-----------------------------------------------------------------------------
// 
// vcsRev(...)
// 
// Purpose: get revision from server
// 
//-----------------------------------------------------------------------------

function vcsRev(e) 
{ 
	var ret = p4[e.settings.client] != null;
	
	if( ret )
	{
		var ref = e.references.first();
		
		var progressDelta = 1.0 / ( e.references.length() + 1 );
		var progress = progressDelta;
		
		app.startProgress( module.localize( '$$$/connect2server=Connect to server' ), module.localize( '$$$/sync2rev=Sync to revision' ) + ' ' + e.revNumber + ' ' + module.localize( '$$$/of=of' ) + ' ' + ref.relurl, false );
		
		while( typeof(ref) != 'undefined' && ref != null )
		{
			app.setProgress( progress, module.localize( '$$$/sync2rev=Sync to revision' ) + ' ' + e.revNumber + ' ' + module.localize( '$$$/of=of' ) + ' ' + ( ref == null ? '' : ref.relurl ) );
			progress += progressDelta;

			var fileRevision = checkFileRevision( ref, e.revNumber, e.settings );
			
			p4[e.settings.client].sync( fileRevision.url, fileRevision.rev );
			ref = e.references.next();
			writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
			
			ret |= p4[e.settings.client].lastResult.exit == 0;
		}
		
		app.stopProgress();
	}
		
	e.result = ret ? 'ok' : module.localize( '$$$/failed=Failed' );
} 

//-----------------------------------------------------------------------------
// 
// vcsResetRev(...)
// 
// Purpose: set revision as new head revision
// 
//-----------------------------------------------------------------------------

function vcsResetRev(e) 
{ 
	var ret = p4[e.settings.client] != null;
	
	if( ret )
	{
		var ref = e.references.first();
		
		if( typeof(ref) != 'undefined' && ref != null )
		{
			if( !ref.isFolder )
			{
				app.startProgress( module.localize( '$$$/connect2server=Connect to server' ), ref.absurl + module.localize( '$$$/newheadrev=becomes new head revision' ), true );
				
				// 1. sync to given revision
				var fileRevision = checkFileRevision( ref, e.revNumber, e.settings );
				
				p4[e.settings.client].sync( fileRevision.url, fileRevision.rev );
				writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
				
				ret |= p4[e.settings.client].lastResult.exit == 0;
				
				if( ret )
				{
					// 2. open for edit
					p4[e.settings.client].edit( ref );
					writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
					
					ret |= p4[e.settings.client].lastResult.exit == 0;
					
					if( ret )
					{
						// 3. sync to head revision
						p4[e.settings.client].sync( ref );
						writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
						
						ret |= p4[e.settings.client].lastResult.exit == 0;
						
						if( ret )
						{
							// 4. resolve file
							p4[e.settings.client].resolve( ref, '-ay' );
							writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
							
							ret |= p4[e.settings.client].lastResult.exit == 0;

							if( ret )
							{
								// 5. submit file
								var comment = 'set #' + e.revNumber + ' to head revision';
								p4[e.settings.client].submit( ref, comment );
								writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
								
								ret |= p4[e.settings.client].lastResult.exit == 0;
								
								if( !ret )
									e.result = module.localize( '$$$/cantcheckin=Can\'t checkin new head revision' );
							}
							else
								e.result = module.localize( '$$$/cantresolve=Can\'t resolve new revision' );
						}
						else
							e.result = module.localize( '$$$/cantdownload=Can\'t download head revision' );
					}
					else
						e.result = module.localize( '$$$/cantopen=Can\'t open revision for edit' );
				}
				else
					e.result = module.localize( '$$$/cantdownloadrev=Can\'t download revision' );
					
				app.stopProgress();
			}
		}
	}
	else
		e.result = module.localize( '$$$/failed=Failed' );
} 

//-----------------------------------------------------------------------------
// 
// vcsStatus(...)
// 
// Purpose: set status of files
// 
//-----------------------------------------------------------------------------

function vcsStatus(e) 
{ 
	var ret = p4[e.settings.client] != null;
	
	if( ret )
	{
		var ref = e.references.first();
		
		while( typeof(ref) != 'undefined' && ref != null )
		{
			var versionInfo = new VCSRevisionInfo( ref.absurl, '', '', '', '', 'match', 'none' );
			
			if( !ref.isFolder )
			{
				var local = ref.local;
				var remote = false;

				p4[e.settings.client].fstat( ref );					
				var fstat = p4[e.settings.client].lastResult.output;
				
				//
				// check if file on server exists
				//
				if( fstat.indexOf( 'headRev' ) >= 0 )
					remote = true;
					
				//
				// parse local and head revision number
				//
				var localRevNo = 0;
				var headRevNo  = 0;
				var remoteLocked = false;
				var localLocked = false;
				
				if( remote )
				{
					// local rev no
					localRevNo = parseInt( getValueAfter( fstat, 'haveRev' ) );
					// head rev no
					headRevNo = parseInt( getValueAfter( fstat, 'headRev' ) ); 
					
					// check-out by someone else
					remoteLocked = ( parseInt( getValueAfter( fstat, 'otherOpen' ) ) > 0 );
				}
				
				//
				// file checked out by someone else
				//
				if( fstat.indexOf( 'otherOpen0' ) >= 0 )
				{
					versionInfo.lockedUser = getValueAfter( fstat, 'otherOpen0' );
					
					for( var i=0; i<p4[e.settings.client].usermapp.length; i++ )
					{
						if( versionInfo.lockedUser == p4[e.settings.client].usermapp[i].mail )
						{
							versionInfo.lockedUser = p4[e.settings.client].usermapp[i].name;
							break;
						}
					}
				}
				
				if( local )
				{
					p4[e.settings.client].opened();
					localLocked = ( p4[e.settings.client].lastResult.output.indexOf( p4[e.settings.client].mapp2Server( ref ) ) >= 0 );
				}
					
				if( local && !remote )
				{
					versionInfo.syncStatus = 'localOnly';		// local only
				}
				else if( !local && remote )
				{
					versionInfo.syncStatus = 'serverOnly';		// server only
				}
				else 
				{
					if( localLocked )
					{
						// file is checked out
						versionInfo.syncStatus = 'localNewer';		// local newer
					}
					else if( localRevNo < headRevNo )
					{
						versionInfo.syncStatus = 'serverNewer';		// server newer
					}
					else if( localRevNo > headRevNo )
					{
						dbgalert( 'This should never happen' );
					}
					else if( localRevNo == headRevNo )
					{
						versionInfo.syncStatus = 'match';		// equal
					}
				}
				
				// TODO ref.synStatus = 5;	conflict
				
				writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
				
				//app.stopProgress();
			}					
				
			//
			// lock status
			//
			versionInfo.lockStatus = 'none';
			
			if( localLocked )
			{
				versionInfo.lockStatus = 'localCheckedOut';		// local checked out
				versionInfo.lockedUser = p4[e.settings.client].userName;
			}
					
			if( remoteLocked )
				versionInfo.lockStatus = 'serverCheckedOut';	// checked out by someone else
			
			e.status.push( versionInfo );
			
			ref = e.references.next();
		}
	}
	else
		e.result = module.localize( '$$$/failed=Failed' );
} 

//-----------------------------------------------------------------------------
// 
// vcsCheckOut(...)
// 
// Purpose: chekc out
// 
//-----------------------------------------------------------------------------

function vcsCheckOut(e) 
{ 
	var ret = p4[e.settings.client] != null;
	
	if( ret )
	{
		var ref = e.references.first();
		
		var progressDelta = 1.0 / ( e.references.length() + 1 );
		var progress = progressDelta;
		
		app.startProgress( module.localize( '$$$/connect2server=Connect to server' ), module.localize( '$$$/checkout=Check out' ) + ' ' + ref.relurl, false );
		
		while( typeof(ref) != 'undefined' && ref != null )
		{
			app.setProgress( progress, module.localize( '$$$/checkout=Check out' ) + ' ' + ( ref == null ? '' : ref.relurl ) );
			progress += progressDelta;

			if( !ref.isFolder )
			{
				p4[e.settings.client].edit( ref );
				writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
				
				p4[e.settings.client].lock( ref );
				writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
				
				ret |= p4[e.settings.client].lastResult.exit == 0;
			}
							
			ref = e.references.next();
		}
		
		app.stopProgress();
	}
		
	e.result = ret ? 'ok' : module.localize( '$$$/failed=Failed' );
} 

//-----------------------------------------------------------------------------
// 
// vcsRevert(...)
// 
// Purpose: revert
// 
//-----------------------------------------------------------------------------

function vcsRevert(e) 
{ 
	var ret = p4[e.settings.client] != null;
	
	if( ret )
	{
		var ref = e.references.first();
		
		var progressDelta = 1.0 / ( e.references.length() + 1 );
		var progress = progressDelta;
		
		app.startProgress( module.localize( '$$$/connect2server=Connect to server' ), module.localize( '$$$/revert=Revert' ) + ' ' + ref.relurl, false );
		
		while( typeof(ref) != 'undefined' && ref != null )
		{
			app.setProgress( progress, module.localize( '$$$/revert=Revert' ) + ' ' + ( ref == null ? '' : ref.relurl ) );
			progress += progressDelta;

			if( !ref.isFolder )
			{
				p4[e.settings.client].revert( ref );
				writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
				
				ret |= p4[e.settings.client].lastResult.exit == 0;
			}
			
			ref = e.references.next();
		}
		
		app.stopProgress();
	}
		
	e.result = ret ? 'ok' : module.localize( '$$$/failed=Failed' );
} 

//-----------------------------------------------------------------------------
// 
// vcsCheckIn(...)
// 
// Purpose: check in
// 
//-----------------------------------------------------------------------------

function vcsCheckIn(e) 
{ 
	var ret = p4[e.settings.client] != null;
	
	if( ret )
	{
		//
		// submit files
		//
		var ref = e.references.first();
		
		var progressDelta = 1.0 / ( e.references.length() + 1 );
		var progress = progressDelta;
		
		app.startProgress( module.localize( '$$$/connect2server=Connect to server' ), module.localize( '$$$/checkin=Check in' ) + ' ' + ref.relurl, false );
		
		while( typeof(ref) != 'undefined' && ref != null )
		{
			app.setProgress( progress, module.localize( '$$$/checkin=Check in' ) + ' ' + ( ref == null ? '' : ref.relurl ) );
			progress += progressDelta;

			if( !ref.isFolder )
			{
				//
				// new file, add to changelist before submit
				//
				p4[e.settings.client].add( ref );
				writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
				
				ret |= p4[e.settings.client].lastResult.exit == 0;

				//
				// submit file
				//
				p4[e.settings.client].submit( ref, e.comment );
				writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
				
				ret |= p4[e.settings.client].lastResult.exit == 0;
			}
			
			ref = e.references.next();
		}
		
		app.stopProgress();
	}
		
	e.result = ret ? 'ok' : module.localize( '$$$/failed=Failed' );
} 

//-----------------------------------------------------------------------------
// 
// vcsAdd(...)
// 
// Purpose: add files
// 
//-----------------------------------------------------------------------------

function vcsAdd(e) 
{ 
	var ret = p4[e.settings.client] != null;
	
	if( ret )
	{
		//
		// first add files to changelist
		//
		var ref = e.references.first();
		
		var progressDelta = 1.0 / ( e.references.length() + 1 );
		var progress = progressDelta;
		
		app.startProgress( module.localize( '$$$/connect2server=Connect to server' ), module.localize( '$$$/initcheckin=Initial check in' ) + ' ' + ref.relurl, false );
		
		while( typeof(ref) != 'undefined' && ref != null )
		{
			app.setProgress( progress, module.localize( '$$$/initcheckin=Initial check in' ) + ' ' + ( ref == null ? '' : ref.relurl ) );
			progress += progressDelta;

			if( !ref.isFolder )
			{
				// add/submit files
				p4[e.settings.client].add( ref );
				writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
				
				ret |= p4[e.settings.client].lastResult.exit == 0;

				if( p4[e.settings.client].lastResult.exit == 0 )
				{
					// submit file
					p4[e.settings.client].submit( ref, 'Initial checkin' );
					writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
					
					ret |= p4[e.settings.client].lastResult.exit == 0;
				}
			}
			
			ref = e.references.next();
		}
		
		app.stopProgress();
	}
		
	e.result = ret ? 'ok' : module.localize( '$$$/failed=Failed' );
} 

//-----------------------------------------------------------------------------
// 
// vcsRemove(...)
// 
// Purpose: remove file from server
// 
//-----------------------------------------------------------------------------

function vcsRemove(e) 
{ 
	var ret = p4[e.settings.client] != null;
	
	if( ret )
	{
		//
		// delete files at server
		//			
		var ref = e.references.first();
		
		var progressDelta = 1.0 / ( e.references.length() + 1 );
		var progress = progressDelta;
		
		app.startProgress( module.localize( '$$$/connect2server=Connect to server' ), module.localize( '$$$/remove=Remove' ) + ' ' + ref.relurl, false );
		
		while( typeof(ref) != 'undefined' && ref != null )
		{
			app.setProgress( progress, module.localize( '$$$/remove=Remove' ) + ' ' + ( ref == null ? '' : ref.relurl ) );
			progress += progressDelta;

			if( !ref.isFolder )
			{
				// open for delete
				p4[e.settings.client].remove( ref );
				writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
				
				ret |= p4[e.settings.client].lastResult.exit == 0;
				
				if( p4[e.settings.client].lastResult.exit == 0 )
				{
					// submit file
					p4[e.settings.client].submit( ref, 'Removed' );
					writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
					
					ret |= p4[e.settings.client].lastResult.exit == 0;
				}
			}
			
			ref = e.references.next();
		}
		
		app.stopProgress();
	}
		
	e.result = ret ? 'ok' : module.localize( '$$$/failed=Failed' );
} 

//-----------------------------------------------------------------------------
// 
// vcsRename(...)
// 
// Purpose: rename file at server
// 
//-----------------------------------------------------------------------------

function vcsRename(e) 
{ 
	var ret = p4[e.settings.client] != null;
	
	if( ret )
	{
		//
		// rename file at server
		//
		var ref = e.references.first();
		
		if( typeof(ref) != 'undefined' && ref != null )
		{
			app.startProgress( module.localize( '$$$/connect2server=Connect to server' ), module.localize( '$$$/rename=Rename' ) + ' ' + ref.relurl, true );
			
			// 1. integrate file
			p4[e.settings.client].integrate( ref, e.destination );
			writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
			
			ret |= p4[e.settings.client].lastResult.exit == 0;

			if( ret )
			{
				// 2. open old file for delete
				p4[e.settings.client].remove( ref );
				writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
				
				ret |= p4[e.settings.client].lastResult.exit == 0;
				
				if( ret )
				{
					// 3. submit old file
					var comment = 'Removed for renaming to ' + p4[e.settings.client].mapp2Server( e.destination );
					p4[e.settings.client].submit( ref, comment );
					writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
					
					ret |= p4[e.settings.client].lastResult.exit == 0;
					
					if( ret )
					{
						// 4. submit new file
						comment = 'Initial checkin for renaming from ' + p4[e.settings.client].mapp2Server( ref );
						p4[e.settings.client].submit( e.destination, comment );
						writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
						
						ret |= p4[e.settings.client].lastResult.exit == 0;
						
						if( !ret )
							e.result = module.localize( '$$$/cantcheckinnew=Can\'t checkin new file' );
					}
					else
						e.result = module.localize( '$$$/cantsubmitremove=Can\'t submit remove' );
				}
				else
					e.result = module.localize( '$$$/cantremoveold=Can\'t remove old file' );
			}
			else
				e.result = module.localize( '$$$/cantintegrate=Can\'t integrate file' );
				
			app.stopProgress();
		}
	}
	else
		e.result = module.localize( '$$$/failed=Failed' );
} 

//-----------------------------------------------------------------------------
// 
// vcsFolderContent(...)
// 
// Purpose: get content of folder
// 
//-----------------------------------------------------------------------------

function vcsFolderContent(e) 
{ 
	var ret = p4[e.settings.client] != null;
	
	if( ret )
	{
		var ref = e.references.first();
		
		if( ref.isFolder )
		{	
			app.startProgress( module.localize( '$$$/connect2server=Connect to server' ), module.localize( '$$$/getfoldercontent=Get content of folder' ) + ' ' + ref.relurl, true );
			
			//
			// get sub folder
			//
			p4[e.settings.client].dirs( ref, ' -C -D ' );
			
			ret |= p4[e.settings.client].lastResult.exit == 0;
			
			writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );

			var index = 0;
			
			if( p4[e.settings.client].lastResult.output.indexOf( 'no such file' ) < 0 )
			{
				var arrayFolder = p4[e.settings.client].lastResult.output.split('\r');
				
				var i=0;
				
				for( i=0; i<arrayFolder.length; i++ )
				{
					var mappedurl = p4[e.settings.client].mapp2Local( arrayFolder[i] );
					mappedurl = mappedurl.strippWS();
					
					if( mappedurl.length > 0 )
					{
						if( mappedurl[mappedurl.length-1] != '/' )
							mappedurl += '/';
						
						var info = new VCSRevisionInfo( mappedurl );
						e.revisions[index] = info;
						
						index++;
					}
				}
			}

			//
			// get files
			//
			p4[e.settings.client].fstat( ref, '-C', true );
			
			ret |= p4[e.settings.client].lastResult.exit == 0;
			
			if( p4[e.settings.client].lastResult.output.indexOf( 'no such file' ) < 0 )
			{
				var arrayFiles = p4[e.settings.client].lastResult.output.split('\r');
				
				for( i=0; i<arrayFiles.length; i++ )
				{
					var entry = arrayFiles[i].toString();
					var pos0 = entry.indexOf( 'depotFile' );
					
					if( pos0 >= 0 )
					{
						entry = entry.slice( pos0+10 );
						entry = entry.strippWS();
						
						var mappedurl = p4[e.settings.client].mapp2Local( entry );
							
						var info = new VCSRevisionInfo( mappedurl );
						e.revisions[index] = info;
						
						index++;
					}
				}
								
				writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
			}
			
			app.stopProgress();
		}
	}
		
	e.result = ret ? 'ok' : module.localize( '$$$/failed=Failed' );
} 

//-----------------------------------------------------------------------------
// 
// vcsRevisions(...)
// 
// Purpose: get revision informations for given file
// 
//-----------------------------------------------------------------------------

function vcsRevisions(e) 
{ 
	var ret = p4[e.settings.client] != null;
	
	if( ret )
	{
		var ref = e.references.first();
		
		if( !ref.isFolder )
		{	
			app.startProgress( module.localize( '$$$/connect2server=Connect to server' ), module.localize( '$$$/getrevinfo=Get revision information for' ) + ' ' + ref.relurl, true );
			
			p4[e.settings.client].filelog( ref, '-t -i' );
			//p4[e.settings.client].filelog( ref, '-t -i -l' );	// with long comments, but they are two lines after revision entry
			
			ret |= p4[e.settings.client].lastResult.exit == 0;
			
			var array = p4[e.settings.client].lastResult.output.split('\r');
			
			if( array.length > 1 )
			{
				var revisionNoCount = 1;
				
				for( var i=array.length-1; i>=0; i-- )
				{
					var entries = array[i].toString().split( ' ' );
					
					if( entries.length > 1 )
					{
						var revision = entries[1];

						while( revision.indexOf( '#' ) == 0 )
							revision = revision.slice( 1 );
						
						if( !isNaN( parseInt( revision ) ) )
						{
							var dateStr  = entries.length > 6 ? entries[6] : '';
							var timeStr	 = entries.length > 7 ? entries[7] : '';
							var user	 = entries.length > 9 ? entries[9] : '';
							var comment	 = '';
							
							if( entries.length > 11 )
							{
								for( var j=11; j<entries.length; j++ )
								{
									comment += entries[j] + ' ';
								}
							}
							
							var date = new Date;
							
							if( dateStr.length > 0 )
							{
								var day		= 0;
								var month	= 0;
								var year	= 0;
								
								var hour	= 0;
								var minute	= 0;
								var second	= 0;
								
								var dateEntries = dateStr.split('/');
								
								if( dateEntries.length >= 3 )
								{
									year	= parseInt( dateEntries[0].toString() );
									month	= parseInt( dateEntries[1].toString() );
									day		= parseInt( dateEntries[2].toString() );
								}
								
								if( timeStr.length > 0 )
								{
									var timeEntries = timeStr.split(':');
									
									if( timeEntries.length >= 3 )
									{
										hour	= parseInt( timeEntries[0].toString() );
										minute	= parseInt( timeEntries[1].toString() );
										second	= parseInt( timeEntries[2].toString() );
									}
								}
								
								date = new Date( year, month, day, hour, minute, second, 0 );
							}
						
							var info = new VCSRevisionInfo( '', revisionNoCount, user, comment, date );
							e.revisions[i] = info;
							
							revisionNoCount++;
						}
					}
				}
			}
			
			writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
			
			app.stopProgress();
		}
	}
		
	e.result = ret ? 'ok' : module.localize( '$$$/failed=Failed' );
} 

//-----------------------------------------------------------------------------
// 
// vcsCopy(...)
// 
// Purpose: copy revision from server to given location
// 
//-----------------------------------------------------------------------------

function vcsCopy(e) 
{ 
	var ret = p4[e.settings.client] != null;
	
	if( ret )
	{
		var ref = e.references.first();
		
		if( !ref.isFolder )
		{
			app.startProgress( module.localize( '$$$/connect2server=Connect to server' ), module.localize( '$$$/download=Download' ) + ' ' + ref.relurl, true );
			
			var fileRevision = checkFileRevision( ref, e.revNumber, e.settings );
				
			p4[e.settings.client].print( fileRevision.url, fileRevision.rev );
			writeEventLog( e, p4[e.settings.client].lastCommand, p4[e.settings.client].lastResult );
			
			ret |= p4[e.settings.client].lastResult.exit == 0;
			
			if( e.destination.open( 'w' ) )
			{
				e.destination.write( p4[e.settings.client].lastResult.output );
				e.destination.close();
			}
			
			app.stopProgress();
		}
	}
		
	e.result = ret ? 'ok' : module.localize( '$$$/failed=Failed' );
} 

//-----------------------------------------------------------------------------
// 
// vcsUsers(...)
// 
// Purpose: get list of users from server
// 
//-----------------------------------------------------------------------------

function vcsUsers(e)
{
	var ret = p4[e.settings.client] != null;
	
	if( ret )
	{
		for( var i=0; i<p4[e.settings.client].usermapp.length; i++ )
		{
			var user = p4[e.settings.client].usermapp[i].name;
			e.users.push( user );
		}
	}
		
	e.result = ret ? 'ok' : module.localize( '$$$/failed=Failed' );
}

//-----------------------------------------------------------------------------
// 
// vcsUserData(...)
// 
// Purpose: get additional informations about user
// 

//-----------------------------------------------------------------------------
function vcsUserData(e)
{
	var ret = p4[e.settings.client] != null;
	
	if( ret )
	{
		for( var i=0; i<p4[e.settings.client].usermapp.length; i++ )
		{
			if( p4[e.settings.client].usermapp[i].name == e.user )
			{
				e.realName = p4[e.settings.client].usermapp[i].realname;
				e.email = p4[e.settings.client].usermapp[i].mail;
				
				break;
			}
		}
	}
		
	e.result = ret ? 'ok' : module.localize( '$$$/failed=Failed' );
}