var Identifier = 0;
var FilenamePrefix = 1;
var FilenameSuffix = 2;
var ITPCSource = 3;
var ProviderName = 4;
var ASPRefIdentifier = 5;
var ASPRefFilenamePrefix = 6;
var ASPRefFilenameSuffix = 7;
var ASPRefITPCSource = 8;
var ASPRefProviderName = 9;

var oReferenceMap = [];

var MEDIA_ID_FILENAME_PREFIX_LENGTH = 7;
var ASPREF_ID_FILENAME_PREFIX_LENGTH = 5;

// Protected members of class
var iASPRefNumPrefixLength = 3;

var oCharToCodeMap = {
	//Encrypted values on the left, clear text values on the right.
	A: 'D', //= A
	B: 'R', //= B
	C: 'V', //= C
	D: 'E', //= D
	E: 'K', //= E
	F: 'I', //= F
	G: 'H', //= G
	H: 'O', //= H
	I: 'Q', //= I
	J: 'C', //= J
	K: 'U', //= K
	L: 'M', //= L
	M: 'W', //= M
	N: 'X', //= N
	O: 'Z', //= O
	P: 'T', //= P
	Q: 'P', //= Q
	R: 'Y', //= R
	S: 'B', //= S
	T: 'N', //= T
	U: 'L', //= U
	V: 'A', //= V
	W: 'J', //= W
	X: 'S', //= X
	Y: 'G', //= Y
	Z: 'F', //= Z
	
	a: 'd', //= A
	b: 'r', //= B
	c: 'v', //= C
	d: 'e', //= D
	e: 'k', //= E
	f: 'i', //= F
	g: 'h', //= G
	h: 'o', //= H
	i: 'q', //= I
	j: 'c', //= J
	k: 'u', //= K
	l: 'm', //= L
	m: 'w', //= M
	n: 'x', //= N
	o: 'z', //= O
	p: 't', //= P
	q: 'p', //= Q
	r: 'y', //= R
	s: 'b', //= S
	t: 'n', //= T
	u: 'l', //= U
	v: 'a', //= V
	w: 'j', //= W
	x: 's', //= X
	y: 'g', //= Y
	z: 'f', //= Z

  0: '4', //= 0
  1: '3', //= 1
  2: '9', //= 2
  3: '7', //= 3
  4: '0', //= 4
  5: '2', //= 5
  6: '8', //= 6
  7: '1', //= 7
  8: '6', //= 8
  9: '5'  //= 9
};	

var oCodeToCharMap = { };
var bInited = false;
initialize = function(iAdobeImageID, sASPRefFilenamePrefix, sASPRefFilenameSuffix)
{
	// Creating the reverse-map
  for(i in oCharToCodeMap)
  {
    oCodeToCharMap[oCharToCodeMap[i]] = i ; 
  }

	// All of these to be read from partners.xml 
	oReferenceMap[ASPRefIdentifier] = "ASP";
	oReferenceMap[ASPRefFilenamePrefix] = sASPRefFilenamePrefix;
	oReferenceMap[ASPRefFilenameSuffix] = sASPRefFilenameSuffix;
	oReferenceMap[ASPRefITPCSource] = "Adobe Stock Photos";
	oReferenceMap[ASPRefProviderName] = "Adobe Stock Photos";
	
	oReferenceMap[Identifier] = "ASP";
	oReferenceMap[FilenamePrefix] = sASPRefFilenamePrefix;
	oReferenceMap[FilenameSuffix] = sASPRefFilenameSuffix;
	oReferenceMap[ITPCSource] = "Adobe Stock Photos";
	oReferenceMap[ProviderName] = "Adobe Stock Photos";

	bInited = true;
}
initialize(1, "Adobe ID", "");

// Getter functions
GetCharForCode = function(chr){
	var chRet = chr
	if('undefined' != typeof oCodeToCharMap[chr]){ chRet = oCodeToCharMap[chr]; } 
	return chRet;
}

GetASPRefIdentifier = function(){
	return oReferenceMap[Identifier];
}

GetASPRefNumPrefixLength = function(){
	return iASPRefNumPrefixLength;
}

GetASPFilenamePrefix = function(){
	return oReferenceMap[FilenamePrefix];
}

GetASPFilenameSuffix = function(){
	return oReferenceMap[FilenameSuffix];
}

// Helper function for case-insensitive search, within a string
String_ifind = function( sSource,  sStr, iOffset){
	var sUSource = sSource.toUpperCase();
	var sUStr = sStr.toUpperCase();
	return sUSource.indexOf(sUStr, iOffset);
}

isDigit = function(chr){
	if ('undefined' == typeof chr || chr.length>1){return false;}
	var string="1234567890";
	if (string.indexOf(chr) != -1){ return true;}
	return false;
}

isspace = function(chr){
		return (' ' == chr || '\n' == chr || '\r' == chr) ; 
}

IsASPReference = function(sSource)
{
		// Check if it starts with the prefix, and has at least one more character after the prefix...
	var sIdentifier = GetASPRefIdentifier();
	var iNumPrefixLength = GetASPRefNumPrefixLength();
	var iIdentifierLength = sIdentifier.length;

	return ( (sSource.length > iNumPrefixLength + iIdentifierLength) && (String_ifind(sSource.substr(iNumPrefixLength,iIdentifierLength),sIdentifier) == 0));
}

getPartnerCodefromNumber = function(pNum)
{
	var alpha = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];

  var oProviderName = {	
    CI: "Comstock Images / JupiterImages" ,
    BS: "BananaStock / BananaStock",
    DV: "DigitalVision / Digital Vision by Getty Images",
    GI: "Getty Images",
    IM: "Image Source / Image Source",
    IS: "IPNStock / IPN Relay",
    MF: "MasterFile / MasterFile",
    PH: "Photonica / Amana",
    PA: "PictureArts / Brand X Pictures",
    ZE: "Zefa / zefaimages"
  }
  
	pName ="";
	while(pNum>0)
	{
		pName = alpha[pNum%26]  + pName;
		pNum = parseInt(pNum/26);
	}
	return  oProviderName[pName];
}

getPartnerCode = function(sAdobeID)
{
	var iPNum = sAdobeID.substr(0, GetASPRefNumPrefixLength());
	return getPartnerCodefromNumber(iPNum);
}
// returns original string from ASP reference.
RevertASPReference = function(sSource, iPartnerName)
{
	if (! bInited){	initialize(1, "Adobe ID", "");	}

	// Return a blank string if the source string isn't an ASP Reference
	if (! IsASPReference(sSource)){	return ""; }

	var sResult;
	var sSrc = sSource;
	// Remove the filename prefix, if present
	if ((GetASPFilenamePrefix() != "") && String_ifind(sSrc, GetASPFilenamePrefix()) == 0)
	{
		sSrc = sSrc.substr(GetASPFilenamePrefix().length);
	}

	// Remove the filename suffix, if present
	var iFileSuffixLocation = 0;
	if ((GetASPFilenameSuffix() != "") && ((iFileSuffixLocation = String_ifind(sSrc, GetASPFilenameSuffix())) != -1))
	{
		sSrc = sSrc.substr(0,iFileSuffixLocation);
	}

 	//std::back_insert_iterator<std::string> itResultPushIter(sResult);
	var itResultPushIter = "";
	var iIdentifierLen = oReferenceMap[ASPRefIdentifier].length;

	for(i = GetASPRefNumPrefixLength() + iIdentifierLen; i < sSrc.length; i++)
	{
		itResultPushIter += GetCharForCode(sSrc.charAt(i));
	}
	sResult = itResultPushIter;
	
	if('undefined' != typeof iPartnerName && 1 == iPartnerName)
		sResult  =getPartnerCode(sSrc);
	return sResult;
}


// Returns Media-ID for the Adobe-ID passed to the function.
ReplaceASPReferences = function(sAdobeID, iPartnerName)
{
	var sASPRefIdentifier = oReferenceMap[ASPRefIdentifier];
	var sResult = sAdobeID;

	// Remove all 'XX_' type instances, whereever it's preceded by whitespace (or is at the start of string)
	var iUnderscorePosition = -1;
	
	while ((iUnderscorePosition = String_ifind(sResult, "_", iUnderscorePosition + 1)) != -1)
	{
		if ( 	(iUnderscorePosition > 1) && 
				(isalpha(sResult[iUnderscorePosition - 1])) &&
				(isalpha(sResult[iUnderscorePosition - 2])) &&
				( (iUnderscorePosition == 2) || ( isspace(sResult[iUnderscorePosition - 3]) || (sResult[iUnderscorePosition - 3]=='(') || (sResult[iUnderscorePosition - 3]=='\"') ) ) &&
				( (iUnderscorePosition < sResult.length - 1) && ! isspace(sResult[iUnderscorePosition + 1]) ) )
		{			
			if ( (( MEDIA_ID_FILENAME_PREFIX_LENGTH == iUnderscorePosition) 
				  ||( (MEDIA_ID_FILENAME_PREFIX_LENGTH < iUnderscorePosition) 
				    && ( isspace(sResult[iUnderscorePosition - MEDIA_ID_FILENAME_PREFIX_LENGTH -1])||(sResult[iUnderscorePosition - MEDIA_ID_FILENAME_PREFIX_LENGTH -1]=='(')||(sResult[iUnderscorePosition - MEDIA_ID_FILENAME_PREFIX_LENGTH -1]=='\"' )))) 
				  && isdigit(sResult[iUnderscorePosition - MEDIA_ID_FILENAME_PREFIX_LENGTH]) && isdigit(sResult[iUnderscorePosition - MEDIA_ID_FILENAME_PREFIX_LENGTH + 1]) && isdigit(sResult[iUnderscorePosition - MEDIA_ID_FILENAME_PREFIX_LENGTH + 2]) 
				  && isdigit(sResult[iUnderscorePosition - MEDIA_ID_FILENAME_PREFIX_LENGTH + 3]) && isspace(sResult[iUnderscorePosition - MEDIA_ID_FILENAME_PREFIX_LENGTH + 4]))
			{
				sResult.erase(iUnderscorePosition - MEDIA_ID_FILENAME_PREFIX_LENGTH,MEDIA_ID_FILENAME_PREFIX_LENGTH + 1);
			}
			else
			{
				sResult.erase(iUnderscorePosition - 2,3);
				iUnderscorePosition -= 3;
			}
		}
	}

	// First, a quick check.. If the ASP Identifier is not found, return it as it is
	if (String_ifind(sResult,sASPRefIdentifier) == -1){	return sResult;	}

	var iASPRefPosition = -1;
	var iASPRefIDLen = sASPRefIdentifier.length;
	var iResultLen = sResult.length;
	var sASPRefPrefix = oReferenceMap[ASPRefFilenamePrefix];
	var iASPPrefixLen = sASPRefPrefix.length;
	var sASPRefSuffix = oReferenceMap[ASPRefFilenameSuffix];
	var iASPSuffixLen = sASPRefSuffix.length;

	while ((iASPRefPosition = String_ifind(sResult, sASPRefIdentifier, iASPRefPosition + 1)) != -1)
	{

		iResultLen = sResult.length;

		// Check if the ASP Reference Identifier is prefixed with required number of digits.	If not, skip this position 
		if (iASPRefPosition < iASPRefNumPrefixLength)	{ continue;	}
		var iStrIter = iASPRefPosition - iASPRefNumPrefixLength;
		var iASPRefStartPos = iStrIter;

		// checking either it should be start of string or followed by whitespace or " or (
		if (iStrIter > 0) { if (( !isspace(sResult[iStrIter-1]))&&(sResult[iStrIter-1]!='\"')&&(sResult[iStrIter-1]!='(')) {  continue; } }

		for (;iStrIter < iASPRefPosition; ++iStrIter)
		{
			if (! isDigit(sResult.charAt(iStrIter))) { break;	}
		}

		if (iStrIter != iASPRefPosition) { continue; }

		// Check if ASP Ref Identifier is followed by at least 1 non-whitespace character
		// If not, skip this position
		if ( (sResult.length == iASPRefPosition + iASPRefIDLen) || (isspace(sResult[iASPRefPosition + iASPRefIDLen]))) { continue; }

		// Pick up the ASP Reference
		var iASPRefEnd = iASPRefPosition + iASPRefIDLen;

		// Changing here to check for ) and "
		while ((iASPRefEnd + 1 < iResultLen) && (! isspace(sResult[iASPRefEnd + 1])) && (sResult[iASPRefEnd + 1]!=')') &&(sResult[iASPRefEnd + 1]!='\"')) { ++iASPRefEnd; }

		var iTotalChars = iASPRefEnd - iASPRefStartPos + 1; 
		var sFoundASPRef = sResult.substr(iASPRefStartPos, iTotalChars);

		if (! IsASPReference(sFoundASPRef)) { continue; }

		// If this ASP Reference is prefixed with a filename prefix, shift the start position to remove it
		/****************************************************************************************************
		* Watson: 1287838
		* Code changed to remove file name prefix (eg. 0001 Adobe Id 123ASP23456) in case search is done using file name
		* of the thumbnail.
		*****************************************************************************************************/	
		var bRemoveFileName=false;
		if ((iASPRefStartPos >= iASPPrefixLen)
			&& (String_ifind(sResult.substr(iASPRefStartPos - iASPPrefixLen, iASPPrefixLen),sASPRefPrefix) == 0))
		{
			iASPRefStartPos -= iASPPrefixLen;
			if ((( ASPREF_ID_FILENAME_PREFIX_LENGTH == iASPRefStartPos) 
				 || ( (ASPREF_ID_FILENAME_PREFIX_LENGTH < iASPRefStartPos) 
				    && ( isspace(sResult[iASPRefStartPos - ASPREF_ID_FILENAME_PREFIX_LENGTH - 1])||(sResult[iASPRefStartPos - ASPREF_ID_FILENAME_PREFIX_LENGTH - 1]=='(')||(sResult[iASPRefStartPos - ASPREF_ID_FILENAME_PREFIX_LENGTH - 1]=='\"' )) ))
                && isdigit(sResult[iASPRefStartPos - ASPREF_ID_FILENAME_PREFIX_LENGTH]) && isdigit(sResult[iASPRefStartPos - ASPREF_ID_FILENAME_PREFIX_LENGTH + 1]) && isdigit(sResult[iASPRefStartPos - ASPREF_ID_FILENAME_PREFIX_LENGTH + 2]) 
				&& isdigit(sResult[iASPRefStartPos - ASPREF_ID_FILENAME_PREFIX_LENGTH + 3]) && isspace(sResult[iASPRefStartPos - ASPREF_ID_FILENAME_PREFIX_LENGTH + 4]))
			{
				bRemoveFileName=true;
			}
		}

		// If this ASP Reference is suffixed with a filename suffix, shift the start position to remove it
		if ((iASPRefEnd + iASPSuffixLen < iResultLen)
			&& (String_ifind(sResult.substr(iASPRefEnd + 1, iASPSuffixLen),sASPRefSuffix) == 0))
		{
			iASPRefEnd += iASPSuffixLen;
		}

		// Replace the ASP Reference ID
		/****************************************************************************
		* Second parameter of replace should be number of characters to be replaced.
		*****************************************************************************/
		var sTemp = sResult.substr(0, iASPRefStartPos) + RevertASPReference(sFoundASPRef) + sResult.substr(iASPRefStartPos + iASPRefEnd-iASPRefStartPos+1 );
		
		if('undefined' != typeof iPartnerName && 1 == iPartnerName)
			sTemp = RevertASPReference(sFoundASPRef, iPartnerName);
			
		sResult = sTemp;

		/****************************************************************************************************
		* Watson: 1287838
		* Code changed to remove file name prefix (eg. 0001 Adobe Id AB_123456) in case search is done using file name
		* of the thumbnail.
		*****************************************************************************************************/		
		if (bRemoveFileName)
		{
			sResult.erase(iASPRefStartPos - ASPREF_ID_FILENAME_PREFIX_LENGTH,ASPREF_ID_FILENAME_PREFIX_LENGTH);
		}
	}

	return sResult;
}

convertToMediaID = function(sAdobeID)
{
	var mediaID = ReplaceASPReferences (sAdobeID);
	return mediaID;
}

getPartnerName = function(sAdobeID)
{
	var sPartnerName = ReplaceASPReferences (sAdobeID, 1);
	return sPartnerName ;
}
// Test-Code.. written to test the above function..
//alert(convertToMediaID('164ASP944091998-443'));
//alert(getPartnerName('164ASP944091998-443'));
