	var UTILS_JS = 1

	var proof = 0;
	var job		= 1;
	var folder= 2;

	var ie = 0;
	var safari = 1;

	function browser()
	{
	  var user_agent = window.navigator.userAgent.toLowerCase();
	  if ( user_agent.indexOf("safari") != -1 )
	    return safari;
	  else if ( user_agent.indexOf("msie") != -1 )
	    return ie;
	  else
	    return "unknown";
	}

	function notNumber( Number, errMessage )
	{
		var re = new RegExp;
		re = /^\d+$/;
		if ( !re.exec( Number ) || Number < 0 || Number > 2147483647 )
			{
				alert( errMessage );
				return true;
			}
		else
			return false;
	}

	function notNumberPosNeg( Number, errMessage )
	{
    Number = trim( Number );

		var re = new RegExp;
		var ret;
		re = /^(-)?\d+$/;
		ret = re.exec( Number )
		if ( !ret && ret != "null" || Number > 2147483647 )
			{	alert( errMessage );
				return true;
			}
		else return false;
	}

	function trim ( csValue )
  {
    csValue = new String( csValue );
    csValue = csValue.replace( /(^\s*)|(\s*$)/g , "" );
    return csValue;
  }

  function TagCheck(str)
  {
   var tmp,i
   str = TagCheckNoReplace(str)

   for(i=0;i<str.length;i++)
    if(str.charAt(i)=="'")
    {
     tmp=str.substring(i+1,str.length);
     str=str.substring(0,i)+"\'"+tmp;
    }

   return str;
  }
 function TagCheckNoReplace(str)
 {
   str = new String(str)
   var tmp,i,j
   for(i=str.indexOf("<",0);i!=-1;i=str.indexOf("<",0))
   {
    j=str.indexOf(">",i);
    if(j==-1)j=str.length;else j++;
    tmp=str.substring(0,i);
    str=tmp+str.substring(j,str.length);
   }
   return str
 }

 function replaceBRto13(str)
 {
 	while(str.search("<br>")!=-1 || str.search("<BR>")!=-1)
	{
		str=str.replace("<br>",String.fromCharCode(13));
		str=str.replace("<BR>",String.fromCharCode(13));
	}
	return str;
 }
 function replace13toBR(str)
 {
	var s="";
	for(var i=0; i < str.length; i++ )
	 if(str.charCodeAt(i)==13) s+="<br>"
	 else s+=str.charAt(i)
  return s;
 }
 function calc13(str)
 {
	var n=0
	for(var i=0;i<str.length;i++)
	 if(str.charCodeAt(i)==13)n++;
	return n;
 }

 function ConvertAsciiToHtmlUnicode( str ) //replace all symbols with character code > 128 to its unicode value
 {
	var str2="";
	for(var i=0;i<str.length;i++)
	 if((str.charCodeAt(i) < 129) && (str.charCodeAt(i) != 43) &&
	    (str.charCodeAt(i) != 13) && (str.charCodeAt(i) != 10) )
	   str2+=str.charAt(i)
	 else
	   str2+="&#"+str.charCodeAt(i)+";"
	return str2
 }

 function ChangeAsciiToHtmlUnicode(oOld)
 {
	if(oOld.type=="radio" && !oOld.checked) return 0;

	var thisForm = oOld.form
	var oNew = document.createElement("input");


	oNew.style.visibility = "hidden"
	oNew.style.position = "absolute"
	oNew.style.left = 0
	oNew.style.top = 0

	oNew.name = oOld.name
	oOld.name = oOld.name + "_old"

	//see Bug #ID6830
	sp1 = document.getElementById( "wrap_span" )
	if( sp1 ){
		sp1.appendChild( oNew )
	}
	else{
	  thisForm.appendChild( oNew )
	}
	oNew.value = ConvertAsciiToHtmlUnicode(oOld.value)
 }


function DisableAllClickButton()
{	for(var j=0;j<document.forms.length;j++)
	{ var oForm = document.forms[j]
		for(var i=0;i<oForm.elements.length;i++)
		if(oForm.elements[i].tagName=="INPUT" && (oForm.elements[i].type=="submit" || oForm.elements[i].type=="button" || oForm.elements[i].type=="reset"))
			oForm.elements[i].disabled = true;
	}
}

function DisableAllClickButtons()
{	DisableAllClickButton()
}

function UndoDisableAllClickButton()
{	for(var j=0;j<document.forms.length;j++)
	{ var oForm = document.forms[j]
		for(var i=0;i<oForm.elements.length;i++)
		if(oForm.elements[i].tagName=="INPUT" && (oForm.elements[i].type=="submit" || oForm.elements[i].type=="button" || oForm.elements[i].type=="reset"))
			oForm.elements[i].disabled = false;
	}
}

function checkTruncate(obj,length)
{
	CheckForPrintableCharacter()
	if(obj.value.length > length) return false
	 return true
}

function maxlength(obj,length)
{	if (obj.value.length > length)
	{	obj.value = obj.value.substring(0,length);
		return false;
	}
	return true;
}

function checkInputNumber(obj, bAllowNegative, bAllowFloat)
{
//alert(window.event.keyCode);
  if(bAllowFloat==null)    bAllowFloat=true;
  if(bAllowNegative==null) bAllowNegative=true;
	if((obj.value.indexOf(".") != -1) && (window.event.keyCode==46 && bAllowFloat) ||
	   (obj.value.indexOf("-") != -1) && (window.event.keyCode==45 && bAllowNegative))
	  return false;

	if ((window.event.keyCode > 47) && (window.event.keyCode < 58)) return true;
	else if((window.event.keyCode ==  46 && bAllowFloat) || (window.event.keyCode == 45 && bAllowNegative)) return true; //'.' or '-'
	else if((window.event.keyCode==63272) || (window.event.keyCode ==  8)) return true; //'Delete' or 'Backspace' for safary
	else if((window.event.keyCode>=63232) && (window.event.keyCode<=63235)) return true; //cursors (up, down, left, right) for safary
	else if(window.event.keyCode < 32) return true; //for safary
	else return false;
}

function checkInputPageList(obj, bAllowMinus, bAllowComma)
{
//alert(window.event.keyCode);
  if(bAllowComma==null) bAllowComma=true;
  if(bAllowMinus==null) bAllowMinus=true;
	if((window.event.keyCode==44 && !bAllowComma) || (window.event.keyCode==45 && !bAllowMinus)) return false;

	if ((window.event.keyCode > 47) && (window.event.keyCode < 58))
	{ return true;
	}
	else if( bAllowMinus && bAllowComma &&
	         window.event.keyCode == 45 &&
	         obj.value.lastIndexOf("-") > obj.value.lastIndexOf(",") )
	{	return false; }
	else if((window.event.keyCode == 44) || (window.event.keyCode == 45))
	{	if( obj.value.substr(obj.value.length-1,1)=="," || obj.value.substr(obj.value.length-1,1)=="-" ) return false;
		else return true;
	}
	else if((window.event.keyCode==63272) || (window.event.keyCode ==  8)) return true; //'Delete' or 'Backspace' for safary
	else if((window.event.keyCode>=63232) && (window.event.keyCode<=63235)) return true; //cursors (up, down, left, right) for safary
	else if(window.event.keyCode < 32) return true; //for safary
	else return false;
}

function checkInputInteger(obj)
{	if ((window.event.keyCode>47)&&(window.event.keyCode<58)) return true;
	else return false;
}

function IsEmail( objEmail )
{	var sEmail = ""
	if( typeof(objEmail) == "object") sEmail = objEmail.value
	else if( typeof(objEmail) == "string") sEmail = objEmail
	if(sEmail == "") return true
	var re = /;/g
	sEmail = sEmail.replace(re, ",")
	var arEmails = sEmail.split(",")
	var sCurEmail, nDotPos, nSobPos, sHostName, bIsEmail = false
	var sCurEmailWithName, sCurName, nBegEmailPos, nEndEmailPos
	var el, sCorrectEmails = ""
	for(el in arEmails)
	{	arEmails[el] = trim( arEmails[el] )
		if(arEmails[el].length >0)
		{	sCurEmailWithName = arEmails[el]
			nBegEmailPos = sCurEmailWithName.indexOf("<")
			nEndEmailPos = sCurEmailWithName.indexOf(">")
			if( nBegEmailPos>0 && nEndEmailPos>0)
			{	sCurEmail = trim( sCurEmailWithName.substring( nBegEmailPos+1, nEndEmailPos ) )
			}
			else
			{	if( (nBegEmailPos<=0 && nEndEmailPos>0) || (nBegEmailPos>0 && nEndEmailPos<=0) )
				{	bIsEmail = false
					break
				}
				nBegEmailPos = sCurEmailWithName.indexOf("[")
				nEndEmailPos = sCurEmailWithName.indexOf("]")
				if( nBegEmailPos>0 && nEndEmailPos>0)
				{	sCurEmail = trim( sCurEmailWithName.substring( nBegEmailPos+1, nEndEmailPos ) )
				}
				else
				{	if( (nBegEmailPos<=0 && nEndEmailPos>0) || (nBegEmailPos>0 && nEndEmailPos<=0) )
					{	bIsEmail = false
						break
					}
					nBegEmailPos = sCurEmailWithName.indexOf("(")
					nEndEmailPos = sCurEmailWithName.indexOf(")")
					if( nBegEmailPos>0 && nEndEmailPos>0)
					{	sCurEmail = trim( sCurEmailWithName.substring( nBegEmailPos+1, nEndEmailPos ) )
					}
					else
					{	if( (nBegEmailPos<=0 && nEndEmailPos>0) || (nBegEmailPos>0 && nEndEmailPos<=0) )
						{	bIsEmail = false
							break
						}
						sCurEmail = sCurEmailWithName
					}
				}
			}
			nDotPos = sCurEmail.lastIndexOf(".")
			nSobPos = sCurEmail.indexOf("@")
			sHostName = sCurEmail.substring( nSobPos+1,sCurEmail.length )
			if( sCurEmail.indexOf(" ")!=-1 ) {	bIsEmail = false; break }
			if( !isCorrectHostName(sHostName) ) {	bIsEmail = false; break }
			if( nDotPos>0 && nSobPos>0 && nDotPos > nSobPos && nDotPos+8>sCurEmail.length )
			{	if( nBegEmailPos>0 && nEndEmailPos>0)
				{	sCurName = trim( sCurEmailWithName.substring( 0, nBegEmailPos ) )
					sCurEmailWithName = sCurName + "<" + sCurEmail + ">"
				}
				sCorrectEmails += sCurEmailWithName + ","
				bIsEmail = true
			}
			else
			{	bIsEmail = false
				break
			}
		}
	}
	if(bIsEmail)
	{ if( sCorrectEmails.lastIndexOf(",") == (sCorrectEmails.length-1) )
			sCorrectEmails = sCorrectEmails.substr(0,sCorrectEmails.length-1);
		if( typeof(objEmail) == "object") objEmail.value = sCorrectEmails;
		return true;
	}
	else return false;
}

/**
*	bWithName:
*		is not set or 0 - checking email in transciption: email@doma.in
*		1 - also in transciption: Recipient Name <email@doma.in>
*		2 - only in transciption: Recipient Name <email@doma.in>
*/
function isValidEMail(value, bWithName)
{
	if(!value)
		return false;
	else if((!bWithName || (bWithName == 1)) && /^[_a-z0-9\-][_a-z0-9\-\.]*@[^\.]([_a-z0-9\-]*\.)+[a-z]{1,5}$/ig.test(String(value)))
		return true;
	else if((bWithName > 0) && /^[^(\<\>)]+\s*\<[_a-z0-9\-][_a-z0-9\-\.]*@[^\.]([_a-z0-9\-]*\.)+[a-z]{1,5}\>$/ig.test(String(value)))
		return true;
	else
		return false;
}

/**
* list of emails (optionally with recipient names)
*/
function isValidEMailsList(value)
{
	value = trim(String(value));
	var values = value.split(/[\,\;]/);
	for(var i in values)
		if(!isValidEMail( trim(values[i]), 1))
			return false;
	return true;
}

function trimEMailsList( csValue )
{
  csValue = new String( csValue );
  csValue = csValue.replace( /(^[\s,;]*)|([\s,;]*$)/g , "" );
  csValue = csValue.replace( /\s{2,}/g , " " );
  csValue = csValue.replace( /,/g , ";" );
  csValue = csValue.replace( /(\s;)/g , ";" );
  csValue = csValue.replace( /(;{2,})/g , ";" );
  return csValue;
}

//rfc 1034
function isCorrectHostName( hostName )
{
 //check that host name contains only characters, numbers and hyphen symbol
 var re = new RegExp("[^a-z0-9\.\-]","gi")
 return !re.test( hostName )
}


//if user start eProof from shortcat
function CheckIfUserStartsEProofFromShortcut()
{
		if ( top && !top.bAgentProbeStarted )
			{
				if ( top.frames["MainFrame"] )
					top.frames["MainFrame"].location.href = "agent-probe.asp";
			}
/*		else
			{	alert(window.location);
				alert("GOTO default.asp");
				window.location.href = "default.asp";
			}
*/
}

function SetDefaultValue( objSelectCtrl )
{
	for(var i=0; i < objSelectCtrl.length ; i++)
		if ( objSelectCtrl[i].defaultSelected )
			{
				objSelectCtrl.selectedIndex = i
				return true
			}
}

//return bool - if we need to rerip proof
function CheckChangeCPProperty(oProp,actual_value,inherited_value)
{
 if(oProp[oProp.selectedIndex].defaultSelected) return false

 //if user choose inherited value in combo
 if(oProp[oProp.selectedIndex].value==0)
 {
   if(actual_value==inherited_value) return false
   else return true
 }
 else
   return (oProp[oProp.selectedIndex].value!=actual_value)
}

function ConfirmReRip( objForm, target )
{
	//TODO move to server this check
	var objRGB = objForm.CP_RGB_ID.options
	var objCMYK = objForm.CP_CMYK_ID.options
	var objCMYKDest = objForm.CP_CMYK_DEST_ID.options

	var objEnableProofing         = objForm.bEnableProofing.options
	var objUseEmbeddedCPs         = objForm.UseEmbeddedCPs.options
	var objRenderingIntentSrcCMYK = objForm.RenderingIntentSrcCMYK.options
	var objRenderingIntentDstCMYK = objForm.RenderingIntentDestCMYK.options

	var strConfirmMsg = ""
	if ( target == proof )
		strConfirmMsg = js_Utils_ConfirmReRip_str1 //"Proof will be reripped if you change color profiles.\nDo you want to continue?"
	else
		strConfirmMsg = js_Utils_ConfirmReRip_str2 //"Proofs in latest published version(s) of current job/folder will be reripped if you change color profiles.\nDo you want to continue?"

	try
	{
	 if(  CheckChangeCPProperty(objRGB,                    arCP_RGB_ID_actual_value[0],              arCP_RGB_ID_actual_value[1])
	   || CheckChangeCPProperty(objCMYK,                   arCP_CMYK_ID_actual_value[0],             arCP_CMYK_ID_actual_value[1])
	   || CheckChangeCPProperty(objCMYKDest,               arCP_CMYK_DEST_ID_actual_value[0],        arCP_CMYK_DEST_ID_actual_value[1])
	   || CheckChangeCPProperty(objEnableProofing,         arbEnableProofing_actual_value[0],        arbEnableProofing_actual_value[1])
	   || CheckChangeCPProperty(objUseEmbeddedCPs,         arUseEmbeddedCPs_actual_value[0],         arUseEmbeddedCPs_actual_value[1])
	   || CheckChangeCPProperty(objRenderingIntentSrcCMYK, arRenderingIntentSrcCMYK_actual_value[0], arRenderingIntentSrcCMYK_actual_value[1])
	   || CheckChangeCPProperty(objRenderingIntentDstCMYK, arRenderingIntentDestCMYK_actual_value[0],arRenderingIntentDestCMYK_actual_value[1])
	  )
		if ( !confirm(strConfirmMsg) )
			{
				SetDefaultValue(objRGB)
				SetDefaultValue(objCMYK)
				SetDefaultValue(objCMYKDest)

				SetDefaultValue(objEnableProofing)
				SetDefaultValue(objUseEmbeddedCPs)
				SetDefaultValue(objRenderingIntentSrcCMYK)
				SetDefaultValue(objRenderingIntentDstCMYK)
			}
	}catch(e)
	{
		SetDefaultValue(objRGB)
		SetDefaultValue(objCMYK)
		SetDefaultValue(objCMYKDest)

		SetDefaultValue(objEnableProofing)
		SetDefaultValue(objUseEmbeddedCPs)
		SetDefaultValue(objRenderingIntentSrcCMYK)
		SetDefaultValue(objRenderingIntentDstCMYK)
	}
}

function Trim(str)
{	while((str.length > 0) && (str.lastIndexOf(" ") == (str.length-1)))
		str = str.substr(0,str.length-1);
	while(str.indexOf(" ") == 0)
		str = str.substr(1,str.length-1);
	return str;
}

//numpad enter on mac has keycode of 3
function CheckForPrintableCharacter()
{
 if( event.keyCode==3 ) event.keyCode=13
}

function LimitTextLengthInCtrl( objCtrl, limit, msg )
{
  if ( objCtrl.value.length == limit )
    alert( msg );
}

var EVENT_CHAIN_TAIL = 0
var EVENT_CHAIN_HEAD = 1
function addHandler( obj, sEventName, sHandlerFunc, iPos ){
	var sNewHandler = ''
	sHandlerFunc += '\n'

	var fOldHandler
	eval( 'fOldHandler = obj.' + sEventName )
	if ( fOldHandler ){
		sNewHandler =  fOldHandler.toString()
	}

	sNewHandler = sNewHandler.replace( /^[^{]*\{/, '' ) //remove old handlers' header
	sNewHandler = sNewHandler.replace( /}\s*$/, '\n' ) //remove old handlers' footer

	if( iPos == EVENT_CHAIN_TAIL )
		sNewHandler += sHandlerFunc
	else
		sNewHandler = sHandlerFunc + sNewHandler

	eval( 'obj.'+ sEventName + ' = function () {\n' + sNewHandler + ' }' )
}

var ONLOAD_ALERT_TIMEOUT = 1000

//=============================================================================================
//to support color profiles
var const_CP_Inherited = 0
var const_CP_Yes = 1
var const_CP_No = 2

var arIDsOfCPPartsThatChangeItAvailabilityFromEnableProofing = new Array()
arIDsOfCPPartsThatChangeItAvailabilityFromEnableProofing[0] = 25    //"RenderingIntentDestCMYK"
arIDsOfCPPartsThatChangeItAvailabilityFromEnableProofing[1] = 5     //"CP_CMYK_DEST_ID"

function CheckCPPartsAvailability(nEnableProofingValue)
{
 //if sEnableProofingValue==2 - we should disable
  for(var i=0;i<arIDsOfCPPartsThatChangeItAvailabilityFromEnableProofing.length;i++)
  {
   try
   {
     if(const_CP_Inherited==nEnableProofingValue) nEnableProofingValue = nEnableProofingParentValue

     if(const_CP_No==nEnableProofingValue)
       arrSelObj[ arIDsOfCPPartsThatChangeItAvailabilityFromEnableProofing[i] ].Ex.Disable()
     else if(const_CP_Yes==nEnableProofingValue)
       arrSelObj[ arIDsOfCPPartsThatChangeItAvailabilityFromEnableProofing[i] ].Ex.Enable()
   }
   catch(e){}
  }
}
