//------------------------------------------------------------------------------
//
// 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.
//
//------------------------------------------------------------------------------

///////////////////////////////////////////////////////////////////////////////
//
// utils
//
var settingsStore = null;
var lastSettingsValidation = false;

//-----------------------------------------------------------------------------
// 
// checkFileRevision(...)
// 
// Purpose: Verify filename and revision number. If a file was renamed there is
//			a branch on the file. So the real filename and revision number might
//			something else.
// 
//-----------------------------------------------------------------------------

function checkFileRevision( ref, revNo, settings )
{
	var ret = new Object;
	ret.url = ref.absurl;
	ret.rev = revNo;
	
	if( p4[settings.client].filelog( ref, '-t -i' ) )
	{
		if( p4[settings.client].lastResult.output.indexOf( 'branch' ) >= 0 )
		{
			var revisions = new Array();

			//
			// parse revisions
			//			
			var lines = p4[settings.client].lastResult.output.split( '\r' );
			var currentPath = ref.absurl;
			
			for( var i=0; i<lines.length; i++ )
			{
				if( lines[i].strippWS().indexOf( '//' ) == 0 )
				{
					currentPath = p4[settings.client].mapp2Local( lines[i] );
				}
				else
				{
					var entries = lines[i].split( ' ' );
					
					if( entries.length > 1 && entries[1].indexOf( '#' ) >= 0 )
					{
						var revNumber = entries[1];
						
						while( revNumber.indexOf( '#' ) == 0 )
							revNumber = revNumber.slice( 1 );

						var revEntry = { url:currentPath, rev:revNumber };
						revisions.unshift( revEntry );
					}
				}	
			}
			
			//
			// get right filename & revision No
			//
			if( revisions.length >= revNo )
				ret = revisions[revNo-1];
		}
	}
	
	return ret;
}

//-----------------------------------------------------------------------------
// 
// getValueAfter(...)
// 
// Purpose: parse string
// 
//-----------------------------------------------------------------------------

function getValueAfter( text, item )
{
	var ret = '';
	
	var pos0 = text.indexOf( item );

	if( pos0 >= 0 )
	{
		var tmp = text.slice( pos0 + item.length );
		
		pos0 = tmp.indexOf( '\r' );
		
		if( pos0 >= 0 )
			tmp = tmp.slice( 0, pos0 );
			
		ret = tmp;
	}
	
	return ret;
}

//-----------------------------------------------------------------------------
// 
// writeEventLog(...)
// 
// Purpose: write log to file
// 
//-----------------------------------------------------------------------------

function writeEventLog( evObj, command, result )
{
	dbgwriteln( evObj.type );
	
	logwriteln( '===========================================================' );
	logwriteln( 'Event:' + evObj.type + '\t\t' + evObj.timeStamp );
	logwriteln( '-----------------------------------------------------------' );
	logwriteln( 'Cmd:' + command );
	logwriteln( '-----------------------------------------------------------' );
	logwriteln( 'Exitcode:' + result.exit );
	logwriteln( '-----------------------------------------------------------' );
	logwriteln( 'Output:' + result.output );
}

//-----------------------------------------------------------------------------
// 
// strippWS(...)
// 
// Purpose: stripp whitespaces
// 
//-----------------------------------------------------------------------------

String.prototype.strippWS = function()
{
	var ret = this.toString();
	
	var start = -1;
	var end   = ret.length;
	
	for( var i=0; i<ret.length; i++ )
	{
		if( ret.charCodeAt(i) >= 33 )
		{
			start = i;
			break;
		}
	}

	for( var i=ret.length-1; i>=0; i-- )
	{
		if( ret.charCodeAt(i) >= 33 )
		{
			end = i+1;
			break;
		}
	}
	
	if( start < 0 || start > end )
		ret = '';
	else
		ret = ret.slice( start, end );
	
	return ret;
}

//-----------------------------------------------------------------------------
// 
// function(...)
// 
// Purpose: find withespaces in string
// 
//-----------------------------------------------------------------------------

String.prototype.containWS = function()
{
	var str = this.toString();
	
	for( var i=0; i<str.length; i++ )
	{
		if( str[i] == ' ' || str[i] == '\t' || str[i] == '\n' || str[i] == '\r' )
			return true;
	}
	
	return false;
}

//-----------------------------------------------------------------------------
// 
// storeCurrentSettings(...)
// 
// Purpose: store current settings in local object
// 
//-----------------------------------------------------------------------------

function storeCurrentSettings( vcsSettings, panel )
{
	settingsStore = {	url			: vcsSettings.url, 
						user		: vcsSettings.user, 
						password	: vcsSettings.password, 
						port		: panel.children['editPort'].text, 
						client		: panel.children['editSpec'].text  };
}

//-----------------------------------------------------------------------------
// 
// validateSettings(...)
// 
// Purpose: validate current settings
// 
//-----------------------------------------------------------------------------

function validateSettings( vcsSettings, panel )
{
	var tc  = true;
	
	//
	// any change since last check ?
	//
	if( settingsStore != null )
	{
		tc =	!equalURL( settingsStore.url, vcsSettings.url )							|| 
				settingsStore.user		!= vcsSettings.user								|| 
				settingsStore.password	!= vcsSettings.password							||
				settingsStore.port		!= panel.children['editPort'].text				||
				settingsStore.client	!= panel.children['editSpec'].text;
	}
	
	if( tc )
	{
		storeCurrentSettings( vcsSettings, panel );

		lastSettingsValidation = false;
		
		var vs = true;
		vs &= settingsStore.url.length > 0 && !settingsStore.url.containWS();
		vs &= settingsStore.port.length > 0 && !isNaN( parseInt( settingsStore.port ) );
		vs &= settingsStore.client.length > 0 && !settingsStore.client.containWS();
		
		if( vs )
		{
			//
			// contact server with given settings
			//
			var serverURL = settingsStore.url;
			var pos0 = serverURL.indexOf( '/' );
			if( pos0 >= 0 )	
			{
				serverURL = serverURL.slice( 0, pos0 );
				serverURL = serverURL.strippWS();
			}

			try
			{
				var p4Con = new Perforce( serverURL, settingsStore.port, settingsStore.client, settingsStore.user, settingsStore.password );

				//app.startProgress( module.localize( '$$$/connect2server=Connect to server' ), module.localize( '$$$/connect2=Connect to' ) + ' ' + serverURL + ':' + settingsStore.port, true, 10 );
				
				if( p4Con.client( '-o' ) )
					lastSettingsValidation = p4Con.lastResult.exit == 0;
				
				//app.stopProgress();
			}
			catch( exp )
			{}
		}
	}
	
	return lastSettingsValidation;
}

//-----------------------------------------------------------------------------
// 
// equalURL(...)
// 
// Purpose: compare urls
// 
//-----------------------------------------------------------------------------

function equalURL( url1, url2 )
{
	var urlstr1 = url1.toLowerCase();
	var urlstr2 = url2.toLowerCase();
	
	urlstr1 = urlstr1.replace( /file:\/\/\//ig, 'file://' );
	urlstr2 = urlstr2.replace( /file:\/\/\//ig, 'file://' );
	
	return ( urlstr1 == urlstr2 );
}

function isSubFolderOf( url1, url2 )
{
	var urlstr1 = url1.toLowerCase();
	var urlstr2 = url2.toLowerCase();
	
	urlstr1 = urlstr1.replace( /file:\/\/\//ig, 'file://' );
	urlstr2 = urlstr2.replace( /file:\/\/\//ig, 'file://' );
	
	return urlstr1.indexOf( urlstr2 );
}