

var JSL_Debug=true,JSL_Date;

function JSL_DebugMessage(message)
{
	if (JSL_Debug) alert(message);
	return false;
}

function JSL_InvalidAction(object,message,setfocus,setselect,setclear)
{
	if (message!="") alert(message);
	if (setclear) object.value="";
	if (setfocus) object.focus();
	if (setselect) object.select();
}

function JSL_Trim(strIn)
{
	var strOut="";
	var strOut2="";
	var i;
	for(i=0;i<strIn.length;i++)
	{
		var c=strIn.charAt(i);
		if (c != ' ')
		{
			strOut = strIn.substring(i,strIn.length);
			break;
		}
	}
	for(i=strOut.length-1;i>=0;i--)
	{
		var c=strOut.charAt(i);
		if (c != ' ')
		{
			strOut2 = strOut.substring(0,i+1);
			break;
		}
	}
	return strOut2;
}

function JSL_ValidateRegExp(object,expression,message,trim,setfocus,setselect,setclear,convert)
{
	var objectValue;
	if (object==null) return JSL_DebugMessage("JSL Debug:\nValidate function called with null object");
	if (object.type!="text" && object.type!="textarea" && object.type!="password")  return JSL_DebugMessage("JSL Debug:\nValidate function called with invalid object type");
	if (message==null) message="";
	if (trim==null) trim=true;
	if (setfocus==null) setfocus=true;
	if (setselect==null) setselect=true;
	if (setclear==null) setclear=false;
	if (convert==null) convert="";
	objectValue=object.value;
	if (trim) objectValue=JSL_Trim(objectValue);
	object.value=objectValue;
	if (convert!="")
	{
		var conversionCall;
		var conversionResult;
		var objectType;
		eval("objectType=typeof("+convert+")");
		if (objectType!="function")
		{
			JSL_DebugMessage("JSL Debug:\nUndefined convert function used in validate");
//			JSL_InvalidAction(object,message,setfocus,setselect,setclear);
//			return false;
		}
		else
		{
			conversionCall="conversionResult="+convert+"(object)";
			eval(conversionCall);
			if (conversionResult==false)
				JSL_DebugMessage("JSL Debug:\nConvert function returned false. Convert ignore");
			else
				objectValue=object.value;
		}
	}
	if (expression.test(objectValue)) return true;
	JSL_InvalidAction(object,message,setfocus,setselect,setclear);
	return false;
}

function JSL_BrowserType()
{
  if (parseInt(navigator.appVersion)>= 4)
  {
    if (navigator.appName == "Netscape")
     return "NN";
    else
     if (navigator.appName == "Microsoft Internet Explorer")
      return "IE";
     else
      return "Other";
  }
}

var daysInMonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

var monthNames = new Array(	"January","February","March","April","May","June",
						"July","August","September","October","November","December");

var dayNames = new Array(	"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");


var jsvDigits = "0123456789",
    jsvPlusSign = "+",
    jsvNegativeSign = "-",
    jsvCommaDelimiter = ",",
    jsvDecimalPointDelimiter = ".",
    jsvLowercaseLetters = "abcdefghijklmnopqrstuvwxyz",
    jsvUppercaseLetters = jsvLowercaseLetters.toUpperCase();


function JSV_isLeapYear(year) {
	if ( typeof year == "object" ) year = JSV_getFullYear(year);
	return ( year%4 == 0 && ( year%100 != 0 || year%400 == 0 ) ? true : false );
}

function JSV_toString(exp) {
	return exp + '';
}

function JSV_isEmpty(expS) {
    return (expS == null || JSV_toString(expS).length == 0) ? true : false;
}

function JSV_trimL(expS, expT) {
	var trimChar = (JSV_trimL.arguments[1] == null) ? " " : expT;
	if ( !JSV_isEmpty(JSV_trimL.arguments[0]) ) {
		var startPosition = 0;
		while (startPosition<=expS.length && expS.charAt(startPosition) == trimChar)
			startPosition++;
		expS = expS.substring(startPosition,expS.length)
	}
	return expS;
}

function JSV_stripString(expS1, expS2) {
	var newString = expS1;

	if ( !JSV_isEmpty(JSV_stripString.arguments[0]) && 
			!JSV_isEmpty(JSV_stripString.arguments[1]) ) {
		var tmpString = expS1,
			indexLocation = tmpString.indexOf(expS2);

		newString = '';
		while(indexLocation != -1) {
			newString += tmpString.substring(0,indexLocation);
			tmpString = tmpString.substring(indexLocation+expS2.length,tmpString.length);
			indexLocation = tmpString.indexOf(expS2);
		}
		newString += tmpString;
	}

	return newString;
}

function JSV_stripCharacters(expS1, expS2) {
	var	strippedString = expS1;


	if( !JSV_isEmpty(JSV_stripCharacters.arguments[0]) && 
			!JSV_isEmpty(JSV_stripCharacters.arguments[1])) {
		var	i = 0, j = 0,
			strip = false,
			oneChar = '';

		strippedString = '';

		for (i=0; i < expS1.length; i++)  {
			strip = false;
			oneChar = expS1.substring(i, i+1);
			for (j=0; j<expS2.length; j++) {
	            if (oneChar == expS2.charAt(j)) {
					strip = true;
					break;
				}
			}
	
			if (!strip) strippedString += oneChar;
		}
	}

	return strippedString;
}

function JSV_replace(expS1, expS2, expS3) {
	var	newString = new String(expS1);

	if ( JSV_replace.arguments.length > 1 &&
			!JSV_isEmpty(JSV_replace.arguments[0]) &&
			!JSV_isEmpty(JSV_replace.arguments[1]) ) {

		if ( !JSV_isEmpty(JSV_replace.arguments[2]) ) {
			var	tmpString = expS1,
				indexLocation = tmpString.indexOf(expS2);

			newString = '';

			while(indexLocation != -1) {
				newString += ( tmpString.substring(0,indexLocation) + expS3 );
				tmpString = tmpString.substring(indexLocation+expS2.length,tmpString.length);
				indexLocation = tmpString.indexOf(expS2);
			}
			newString += tmpString;

		}
		else {
			newString = JSV_stripString(newString,expS2);
		}
	}

	return newString;
}

function JSV_occurs(expS1, expS2) {
	var numberOfOccurrences = 0;

    if ( !JSV_isEmpty(JSV_occurs.arguments[0]) && !JSV_isEmpty(JSV_occurs.arguments[1])) {
		if (expS1 == expS2) {
			numberOfOccurrences = 1;
		}
		else {
			var tmpString = JSV_replace(expS1, expS2);

			if (tmpString != expS1) {
				if (tmpString.length == 0)
					numberOfOccurrences = expS1.length/expS2.length;
				else
					numberOfOccurrences = (expS1.length - tmpString.length)/expS2.length;
			}
		}
	}

    return numberOfOccurrences;
}

function JSV_isWhitespace(expS) {
	var allWhitespace = true;
    if ( JSV_isWhitespace.arguments[0] != null ) {
		if (typeof expS != "string") expS = expS.toString();
		if (expS.length != 0) {
			var i = 0;
			var whitespace = " \t\n\r";
	    	for (i=0; i<expS.length; i++) {
		        if (whitespace.indexOf( expS.charAt(i) ) == -1) {
					allWhitespace = false;
					break;
				}
		    }
		}
	}
    return allWhitespace;
}


function JSV_isInteger(expI, signed) {
	var	isIntegerValue = true,
		isSigned = false,
		expS = JSV_toString(expI),
		psCount = JSV_occurs(expS, jsvPlusSign),
		nsCount = JSV_occurs(expS, jsvNegativeSign);

	if (nsCount != 0 || psCount != 0) isSigned = true;
	if (JSV_isInteger.arguments[1] == null) signed = true;


	if (JSV_occurs(expS, jsvDecimalPointDelimiter) != 0)
		isIntegerValue = false;
	else if (nsCount > 1 || expS.indexOf(jsvNegativeSign) > 0 )
		isIntegerValue = false;
	else if (psCount > 1 || expS.indexOf(jsvPlusSign) > 0 )
		isIntegerValue = false;
	else if (psCount > 0 && nsCount > 0 )
		isIntegerValue = false;
	else if (!signed && isSigned)
		isIntegerValue = false;

	if (isIntegerValue) {
		var remainingChars = JSV_stripCharacters(expS, jsvDigits + jsvNegativeSign + jsvPlusSign);
		isIntegerValue = (remainingChars.length == 0 ? true : false);
	}

	return isIntegerValue;
}

function JSV_parseString(expS, delimiters, keepDelimiters) {
	var elementNo = 0,
		parsedElements = new Array();

	parsedElements[elementNo] = expS;
	if (JSV_parseString.arguments[2] == null) keepDelimiters = true;

	if ( !JSV_isEmpty(JSV_parseString.arguments[0]) && !JSV_isEmpty(JSV_parseString.arguments[1]) ) {
		var i = 0, StartParse = 0, EndParse = 0;

		for(i=0; i<expS.length; i++) {
			if (delimiters.indexOf( expS.charAt(i) ) != -1) {
				if (i == 0)
					StartParse = 1;
				else {
					EndParse = i;
					parsedElements[elementNo] = expS.substring(StartParse,EndParse);
					elementNo++;
					StartParse = EndParse+1;
				}

				if (keepDelimiters) {
					parsedElements[elementNo] = expS.charAt(i);
					elementNo++;
				}
			}
		}

		if (elementNo > 0) {
			StartParse = EndParse+1; EndParse = expS.length;
			if (StartParse < EndParse)
				parsedElements[elementNo] = expS.substring(StartParse,EndParse);
		}
	}

	return parsedElements;
}

function JSV_getFullYear() {
	var yearInQuestion = 
			( 
			  typeof JSV_getFullYear.arguments[0] == "object" ? 
			  JSV_getFullYear.arguments[0].getYear() : 
			  parseInt(JSV_getFullYear.arguments[0])
			);
	return ( yearInQuestion < 1000 ? yearInQuestion + 1900 : yearInQuestion );
}

function JSV_allowInString(expS1, expS2)  {
	var allowed = false;

	if ( !JSV_isEmpty(JSV_allowInString.arguments[0]) &&
			!JSV_isEmpty(JSV_allowInString.arguments[1]) ) {
		if (JSV_stripCharacters(expS1,expS2).length == 0) allowed = true;
	}

	return allowed;
}

function JSV_timeOfDay(inHrs, inMins, inSecs) {
	if (inHrs >= 0 && inHrs < 12)
		return 0;		// AM
	else if (inHrs > 12 && inHrs <= 24)
		return 1;		// PM
	else if (inHrs == 12 && inMins == 0 && inSecs == 0)
		return 0;		// AM
	else
		return 1;		// PM
}

function JSL_DateString(dateObj, dateMask) {
	if ( JSV_isWhitespace(JSL_DateString.arguments[1]) ) dateMask = "dd-mmm-yy";

	var	i = 0,
		tmpString = '',
		formattedDate = '',
		theDate = dateObj.getDate(),
		theMonth = dateObj.getMonth(),
		theYear = JSV_getFullYear(dateObj),
		theHours = dateObj.getHours(),
		theMins = dateObj.getMinutes(),
		theSecs = dateObj.getSeconds(),
		theDay = dateObj.getDay(),
		allowedDelimiters = " -/:,",
		allowedMaskChars = "mdyhsapAMP";

	if (!JSV_allowInString(dateMask, allowedDelimiters + allowedMaskChars)) dateMask = "dd-mmm-yy";

	var adjustedHours = theHours;
	if ( (dateMask.toLowerCase().indexOf("a") != -1 || dateMask.toLowerCase().indexOf("p") != -1) && adjustedHours > 12 ) adjustedHours -= 12;

	var formatArray = JSV_parseString(dateMask, allowedDelimiters, true),
		elementsInArray = formatArray.length,
		isMinutes = false;

	for (i=0; i<elementsInArray; i++)  {
        if (formatArray[i] == "yy")
			formattedDate += theYear.toString().substring(2,4);
			
        else if (formatArray[i] == "yyyy")
			formattedDate += theYear.toString();
			
		else if (formatArray[i] == "dddd")
			formattedDate += dayNames[theDay];

		else if (formatArray[i] == "ddd")
			formattedDate += dayNames[theDay].substring(0,3);

		else if (formatArray[i] == "dd") {
			tmpString = JSV_toString(theDate);
			formattedDate += ( ( (tmpString.length == 1) ? "0" : '' ) + tmpString );
		}

		else if (formatArray[i] == "d")
			formattedDate += theDate;

		else if (formatArray[i] == "mmmm")
			formattedDate += monthNames[theMonth];

		else if (formatArray[i] == "mmm")
			formattedDate += monthNames[theMonth].substring(0,3);

		else if (formatArray[i] == "mm" || formatArray[i] == "m") {
			isMinutes = false;

			if (i > 0)
				if (formatArray[i-1] == ":") isMinutes = true;

			if (i < elementsInArray-1)
				if (formatArray[i+1] == ":") isMinutes = true;

			if (isMinutes)
				tmpString = JSV_toString(theMins);
			else
				tmpString = JSV_toString(theMonth+1);

			if (formatArray[i] == "mm")
				formattedDate += ( ( (tmpString.length == 1) ? "0" : '' ) + tmpString );
		}

		else if (formatArray[i] == "hh") {
			tmpString = JSV_toString(adjustedHours);
			formattedDate += ( ( (tmpString.length == 1) ? "0" : '' ) + tmpString );
		}

		else if (formatArray[i] == "h")
			formattedDate += adjustedHours;

		else if (formatArray[i] == "ss") {
			tmpString = '' + theSecs;
			formattedDate += ( ( (tmpString.length == 1) ? "0" : '' ) + tmpString );
		}

		else if (formatArray[i] == "s")
			formattedDate += theSecs;

		else if (formatArray[i] == "A" || formatArray[i] == "P") {
			if (JSV_timeOfDay(theHours, theMins, theSecs) == 0)
				formattedDate += "A";
			else
				formattedDate += "P";
		}
			
		else if (formatArray[i] == "AM" || formatArray[i] == "PM") {
			if (JSV_timeOfDay(theHours, theMins, theSecs) == 0)
				formattedDate += "AM";
			else
				formattedDate += "PM";
		}
				
		else if (formatArray[i] == "a" || formatArray[i] == "p") {
			if (JSV_timeOfDay(theHours, theMins, theSecs) == 0)
				formattedDate += "a";
			else
				formattedDate += "p";
		}

		else if (formatArray[i] == "am" || formatArray[i] == "pm") {
			if (JSV_timeOfDay(theHours, theMins, theSecs) == 0)
				formattedDate += "am";
			else
				formattedDate += "pm";
		}

        else
			formattedDate += formatArray[i];
	}

	return formattedDate;
}

function validFloat(obj, msg, bk, start, finish)
{
	if (bk != null)
	{
		vl = obj.value;
		if (bk.toLowerCase() == vl.toLowerCase())
		{
			return true;
		}
	}

	if (msg == null)
	{
		msg = "Пожалуйста, введите числовое значение";

		msg_add = "";

		if (start != null)
		{
			msg_add = msg_add + "больше " + start;
		}
		if (finish != null)
		{
			if (msg_add != "")
			{
				msg_add = msg_add + ", ";
			}
			msg_add = msg_add + "меньше или равно " + finish;
		}
		if (msg_add != "")
		{
			msg = msg + "\n" + "(" + msg_add + ")";
		}
	}

	var re = /^[-+]?[0-9]+\.?[0-9]*$/;
	if (!re.test(obj.value))
	{
		alert(msg);
		obj.focus();
		obj.select();
		window.event.returnValue=false;
		return false;
	}

	if (start != null)
	{
		if (obj.value <= start)
		{
			alert(msg);
			obj.focus();
			obj.select();
			window.event.returnValue=false;
			return false;
		}
	}

	if (finish != null)
	{
		if (obj.value > finish)
		{
			alert(msg);
			obj.focus();
			obj.select();
			window.event.returnValue=false;
			return false;
		}
	}

	return true;
}

function validInteger(obj, msg, blank, start, finish)
{
	if (blank != null)
	{
		vl = obj.value;
		if (blank.toLowerCase() == vl.toLowerCase())
		{
			return true;
		}
		alert(blank.toLowerCase());
		alert(vl.toLowerCase());
	}

	if (msg == null)
	{
		msg = "Пожалуйста, введите числовое значение";

		msg_add = "";

		if (start != null)
		{
			msg_add = msg_add + "больше " + start;
		}
		if (finish != null)
		{
			if (msg_add != "")
			{
				msg_add = msg_add + ", ";
			}
			msg_add = msg_add + "меньше или равно " + finish;
		}
		if (msg_add != "")
		{
			msg = msg + "\n" + "(" + msg_add + ")";
		}
	}

	var re = /^[-+]?[0-9]+$/;
	if (!re.test(obj.value))
	{
		alert(msg);
		obj.focus();
		obj.select();
		window.event.returnValue=false;
		return false;
	}


	if (start != null)
	{
		if (obj.value <= start)
		{
			alert(msg);
			obj.focus();
			obj.select();
			window.event.returnValue=false;
			return false;
		}
	}

	if (finish != null)
	{
		if (obj.value > finish)
		{
			alert(msg);
			obj.focus();
			obj.select();
			window.event.returnValue=false;
			return false;
		}
	}
	return true;
}
