﻿var currentWindow = window; 
function handleLoginNotOK() {
	for (var i=0; i<20; i++) {
		try {			
			if (currentWindow.document.body.id.indexOf("genericModal") != -1) {
				currentWindow.returnValue = "loginNotOK";
				currentWindow.close();
				return;
			}
			if (currentWindow.document.body.id.indexOf("default") != -1) {
				currentWindow.gotoLogin();
				return;
			}
		} catch (e) {}

		currentWindow = window.parent;
	}
	for (var i=0; i<20; i++) {
		try {			
			if (currentWindow.document.body.id.indexOf("default") != -1) {
				currentWindow.gotoLogin();
				return;
			}
		} catch (e) {}

		currentWindow = window.opener;
	}
}

function importData(sourceString, Tag) {
	try {
		if (sourceString.indexOf(Tag + "{(")==-1) return "";
		var s = sourceString.indexOf(Tag + "{(") + Tag.length + 2;
		var e = sourceString.indexOf(")}", s);
		return (sourceString.substring(s, e));
	}

	catch (e) {
		return "";
	}
}

function setKeyValue(importDataSource, key, keyValue) {
	if (importDataSource==null || importDataSource==undefined)
		importDataSource = "";

	if (importDataSource=="" || importDataSource.indexOf(key + "{(")==-1)
		importDataSource += key + "{(" + keyValue + ")}";
	else
		importDataSource = importDataSource.replace(key + "{(" + importData(importDataSource, key) + ")}", key + "{(" + keyValue + ")}");

	return importDataSource;
}

function val(sourceString) {
	sourceString = replaceString(sourceString, ",", "");
	if (isNaN(sourceString) || sourceString=="")
		return 0
	else
		return parseInt(sourceString, 10);
}

function normalizeSeperators(string) {
	if (string.length > 3)
		return string.substr(0, string.length - 3);
	else
		return string;
}

function replaceString(sourceString, searchText, replaceText) {
	if (sourceString == "" || sourceString == null || sourceString == undefined)
		return "";
		
	sourceString = sourceString.toString();
	while (sourceString.search(searchText)!=-1)
		sourceString = sourceString.replace(searchText, "_temp_string_");

	while (sourceString.search("_temp_string_")!=-1)
		sourceString = sourceString.replace("_temp_string_", replaceText);
		
	return sourceString;
}

function validateFullTextSearchClauseBoxes() {
	return true;
//	var inputsArray = document.getElementsByTagName("input");
//	for (var i=0; i<inputsArray.length; i++) {
//		var textBox = inputsArray[i];
//		if (textBox.fullTextSearchClause=="true" && textBox.value.toString().trim().substr(0, 1)=="-") {
//			messageBox("FullTextClauseCantStartWith-", eMessageBoxStyle.exclamation);
//			setFocus(textBox);
//			return false;
//		}
//	}
//	
//	return true;
}

function getUserSetting(softwareGuid, key) {
	return getServerResponse("common", "GetUserSetting", "SoftwareGuid=" + softwareGuid + "&Key=" + toUTF8(key));
}

function setUserSetting(softwareGuid, key, value) {
	return getServerResponse("common", "SetUserSetting", "SoftwareGuid=" + softwareGuid + "&Key=" + toUTF8(key) + "&Value=" + toUTF8(value));
}

function getSoftwareCookie(softwareGuid, name, defaultValue) {
	var softwareCookies = getCookie("swc-" + softwareGuid);
	if (softwareCookies==null) {
		if (defaultValue!=undefined)
			return defaultValue;

		return null;
	}

	var cookieValue = importData(softwareCookies, name);
	if (cookieValue=="") {
		if (softwareCookies.indexOf(")}" + name + "{(")==-1 && softwareCookies.substr(0, name.length + 2)!=name + "{(") {
			if (defaultValue!=undefined)
				return defaultValue;

			return null;
		}
	}

	return cookieValue;
}

function setSoftwareCookie(softwareGuid, name, value) {
	var softwareCookies = getCookie("swc-" + softwareGuid);
	softwareCookies = setKeyValue(softwareCookies, name, value)
	setCookie("swc-" + softwareGuid, softwareCookies);
}

function getCookie(name, defaultValue) {
  var cookie = document.cookie.split("; ");
  for (var i=0; i < cookie.length; i++)
  {
    var crumb = cookie[i].split("=");
    if (name == crumb[0]) 
      return unescape(crumb[1]);
  }
	
	if (defaultValue!=undefined)
		return defaultValue;

  return null;
}

function setCookie(name, value) {
  date = new Date();
  date.setFullYear(date.getFullYear() + 1);
  document.cookie = name + "=" + escape(value) + "; expires=" + date.toGMTString();
}

function togglePageSelects(visible) {
	var array = document.getElementsByTagName("select")
	for (i=0; i < array.length; i++)
		if (array[i].className!="")
			array[i].style.display = visible ? "" : "none";
}

function togglePageButtons(enabled) {
	var array = document.getElementsByTagName("input")
	for (i=0; i < array.length; i++)
		if (array[i].type=="button" || array[i].type=="submit")
			array[i].disabled = !enabled;
}

function togglePageReadOnly(readOnly) {
	var array;
	array = document.getElementsByTagName("select")
	for (i=0; i < array.length; i++)
		array[i].disabled = readOnly;

	array = document.getElementsByTagName("input")
	for (i=0; i < array.length; i++)
		if (array[i].type=="text")
			array[i].readOnly = readOnly;
		else if (array[i].type!="submit")
			array[i].disabled = readOnly;

	array = document.getElementsByTagName("textarea")
	for (i=0; i < array.length; i++)
		array[i].readOnly = readOnly;

	array = document.getElementsByTagName("datePicker")
	for (i=0; i < array.length; i++)
		array[i].enabled = !readOnly;
}

function toggleChildrenDisabled(parent, disabled, toggleThis) {
	if (parent.tagName=="LEGEND") return;
	
	if (toggleThis==true)
		parent.disabled = disabled;
	
	for (var i=0; i<parent.children.length; i++) {
		parent.children[i].disabled = disabled;
		try {
			toggleChildrenDisabled(parent.children[i], disabled);
		} catch(e) {}
	}
}

function getTempId() {
	return parseInt(Math.random() * -1000000, 10);
}

function getSelectItemByText(cbo, text) {
	for (i=0; i<cbo.children.length; i++)
		if (cbo.children[i].innerText==text)
			return cbo.children[i].value;
	
	return null;
}

function getSelectItemValue(cbo, findKey, findValue) {
	for (i=0; i<cbo.children.length; i++)
		if (importData(cbo.children[i].value, findKey)==findValue)
			return cbo.children[i].value;
	
	return null;
}

function removeSelectSelection(cbo) {
	for (i=0; i < cbo.children.length; i++)
		if (cbo.value==cbo.children[i].value) {
			cbo.removeChild(cbo.children[i]);
			try {
				cbo.children[i].selected = true;
			} catch(e) {}
			
			return;
		}
}

function renameSelectSelection(cbo, title) {
	for (i=0; i < cbo.children.length; i++)
		if (cbo.value==cbo.children[i].value) {
			cbo.children[i].innerText = title;
			try {
				cbo.children[i].selected = true;
			} catch(e) {}
			
			return;
		}
}

function getSelectText(cbo) {
	try {
	  for (i=0; i < cbo.children.length; i++)
		  if (cbo.value==cbo.children[i].value)
			  return cbo.children[i].innerText;
    return "";
  } catch(e) {
    return "";
  }
}

function setSelectText(cbo, text) {
	for (i=0; i < cbo.children.length; i++)
		cbo.children[i].selected = cbo.children[i].innerText==text;
}

function setFocus(ctrl) {
	try {
		ctrl.focus();
		if (ctrl.type!="button")
			ctrl.select();
	}

	catch (err) {
		return;
	}
}

function getFileName(filePath) {
	if (filePath.indexOf("\\")==-1)
		return filePath;
	else
		return filePath.substr(filePath.lastIndexOf("\\") + 1);
}

function getFolderTitle(filePath) {
	var splitted = filePath.split("\\");	
	return splitted[splitted.length - 1];
}

function toggleCheckBoxListByID(checkboxListID, checked) {
	var tablesArray = document.getElementsByTagName("table");
	for (var c=0; c < tablesArray.length; c++) {
		var tableID = tablesArray[c].id.toString();
		if (tableID.indexOf(checkboxListID)!=-1) {
			toggleCheckBoxList(tablesArray[c], checked);
			break;
		}
	}
}

function toggleCheckBoxList(checkboxList, checked) {
	if (checked==null || checked==undefined)
		checked = !checkboxList.rows(0).children(0).children(0).checked;

	for (var i=0; i < checkboxList.rows.length; i++) {
		for (var j=0; j < checkboxList.rows(i).children.length; j++) {
			var checkBox = checkboxList.rows(i).children(j).children(0);
			if (checkBox.tagName.toLowerCase()=="input" && checkBox.type.toLowerCase()=="checkbox")
				checkBox.checked = checked;
		}
	}
}

function getXmlHttpObj() {
	var xmlhttp = null;
	if (window.XMLHttpRequest)
		xmlhttp = new XMLHttpRequest()
	else if (window.ActiveXObject)
		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	else
		alert("Can not initialize XML HTTP request object.\nPlease check active scripting and ActiveX initialization security settings.");
	
	return xmlhttp;
}

function createXmlHttpReq(handler) {
	var xmlhttp = getXmlHttpObj();
	if (xmlhttp==null)
		return null;

	xmlhttp.onreadystatechange = handler;
	return xmlhttp;
}

function dummyHandler() {}

var uniqnum_counter = (new Date).getTime();

function xmlHttpGET1(xmlhttp, url) {
	xmlhttp.open('GET', url, true);
	xmlhttp.send(null);
	
	return xmlhttp;
}

function xmlHttpPOST1(xmlhttp, url, content) {
	xmlhttp.open('POST', url, true);
	xmlhttp.send(content);
	
	return xmlhttp;
}

function sendRequest(url) {
	var xmlhttp = createXmlHttpReq(dummyHandler);
	++uniqnum_counter;
	return xmlHttpGET1(xmlhttp, url + "&rand=" + uniqnum_counter);
}

function sendRequestWithContent(url, content) {
	var xmlhttp = createXmlHttpReq(dummyHandler);
	++uniqnum_counter;
	return xmlHttpPOST1(xmlhttp, url + "&rand=" + uniqnum_counter, content);
}

function getXmlHttpResponse(url, data) {
	var xmlHttp = getXmlHttpObj();
	if (xmlHttp==null)
		return null;
	
	try {
		if(data==null || data==undefined) {
			xmlHttp.open("GET", url, false);
			xmlHttp.send(null);
		} else {
			xmlHttp.open("POST", url, false);
			xmlHttp.send(data);
		}

		if(xmlHttp.status==200)
			return xmlHttp.responseText;
		else {
			if(confirm("There was an error communicating with the server. If you want to see server response, press 'Ok'.")) {
				var errorWindow = windowOpen("about:blank", "_errorWindow" + (getTempId() * -1), "width=640, height=480, location=no, titlebar=no, scrollbars=yes, resizable=yes");
				errorWindow.document.write(xmlHttp.responseText);
			}
			return null;
		}
	} catch (e) {
		alert("Error communicating with the server:\n" + e.message);
		return null;
	}
}

var asyncXmlHttp;
var asyncXmlHttpHandlerFunction;
function getXmlHttpResponseAsync(url, responseHandler, data) {
	asyncXmlHttp = getXmlHttpObj();
	if (asyncXmlHttp==null)
		return false;

	if (responseHandler==undefined)
		responseHandler = asyncXmlHttpDummyHandler;
	asyncXmlHttpHandlerFunction = responseHandler;

	asyncXmlHttp.onreadystatechange = asyncXmlHttpHandler;
	if (data==null || data==undefined) {
		asyncXmlHttp.open("GET", url, true);
		asyncXmlHttp.send(null);
	} else {
		asyncXmlHttp.open("POST", url, true);
		asyncXmlHttp.send(data);
	}
	
	return true;
}

function asyncXmlHttpHandler() {
	if(asyncXmlHttp.readyState==4) {
		if(asyncXmlHttp.status==200) {
			Object.prototype.invoke = asyncXmlHttpHandlerFunction;
			var invoker = new Object();
			invoker.invoke(asyncXmlHttp.responseText)
		}
		else {
			if(confirm("There was an error communicating with the server. If you want to see server response, press 'Ok'.")) {
				var errorWindow = windowOpen("about:blank", "_errorWindow" + (getTempId() * -1), "width=640, height=480, location=no, titlebar=no, scrollbars=yes, resizable=yes");
				errorWindow.document.write(asyncXmlHttp.responseText);
			}
			return null;
		}
	}
}

function asyncXmlHttpDummyHandler(response) {}

function getURLParamValue(paramName) {
	var re = new RegExp("[?|&]" + paramName + "=([^&]*)","gi");
	var arr = re.exec(window.document.location.search);
	return ((arr==null) ? null : arr[1]);
}

function toUTF8(szInput) {
	if (szInput==null || szInput==undefined || szInput=="")
		return szInput;

	var wch, x, uch = "", szRet = "";
	for (x = 0;x < szInput.length;x++) {
		wch = szInput.charCodeAt(x);
		
		if (!(wch & 0xFF80)) {
			szRet += "%" + wch.toString(16);
		} else if (!(wch & 0xF800)) {
			uch = "%" + (wch>>6 | 0xC0).toString(16) + "%" + (wch & 0x3F | 0x80).toString(16);
			szRet += uch;
		} else {
			uch = "%" + (wch >> 12 | 0xE0).toString(16) + "%" + (((wch >> 6) & 0x3F) | 0x80).toString(16) + "%" + (wch & 0x3F | 0x80).toString(16);
			szRet += uch;
		}
	}
	
	return(szRet);
}

function dataBindDropdown(dropdown, data, dataValueField, dataTextField, insertEmptyItem) {
	var originalTargetDropdown = dropdown;
	if (originalTargetDropdown.customControlType=="DropDownEx") {
		setDropDownExValue(dropdown, "");
		dropdown = dropdown.selectObject;
	}
	
	dropdown.innerHTML = "";

	if (insertEmptyItem==true)
		addItemToSelect(dropdown, "", "");

	for (var i=0; i<val(importData(data, "count")); i++)
		addItemToSelect(dropdown, importData(data, dataValueField + i), importData(data, dataTextField + i));


	if (originalTargetDropdown.customControlType=="DropDownEx") {
		initializeDropDownEx(originalTargetDropdown);
	} else {
		dropdown.fireEvent("onchange");
	}
}

function dataBindDropdownWithServerResponse(dropdown, software, command, arguments, dataValueField, dataTextField, insertEmptyItem, cacheResponse) {
	if (cacheResponse==false)
		dataBindDropdown(dropdown, getServerResponse(software, command, arguments), dataValueField, dataTextField, insertEmptyItem);
	else
		dataBindDropdown(dropdown, getServerResponseWithCache(software, command, arguments), dataValueField, dataTextField, insertEmptyItem);
}

function filterDropdown(sourceDropdown, targetDropdown, filterKey, filterValue, insertEmptyItem) {
	var originalTargetDropdown = targetDropdown;
	if (originalTargetDropdown.customControlType=="DropDownEx") {
		setDropDownExValue(targetDropdown, "");
		targetDropdown = targetDropdown.selectObject;
	}
	
	targetDropdown.innerHTML = "";

	if (insertEmptyItem==true)
		addItemToSelect(targetDropdown, "", "");

	for (i=0; i<sourceDropdown.children.length; i++) {
		if (filterValue==null || importData(sourceDropdown.children(i).value, filterKey)==filterValue)
			addItemToSelect(targetDropdown, importData(sourceDropdown.children(i).value, "id"), sourceDropdown.children(i).innerText);
	}

	if (originalTargetDropdown.customControlType=="DropDownEx") {
		initializeDropDownEx(originalTargetDropdown);
	} else {
		targetDropdown.fireEvent("onchange");
	}
}

function copyDropdownItems(sourceDropdown, 
	targetDropdown1, targetDropdown2, targetDropdown3, targetDropdown4, targetDropdown5, 
	targetDropdown6, targetDropdown7, targetDropdown8, targetDropdown9, targetDropdown10) {

	targetDropdown1.innerHTML="";
	if (targetDropdown2!=undefined)  targetDropdown2.innerHTML="";
	if (targetDropdown3!=undefined)  targetDropdown3.innerHTML="";
	if (targetDropdown4!=undefined)  targetDropdown4.innerHTML="";
	if (targetDropdown5!=undefined)  targetDropdown5.innerHTML="";
	if (targetDropdown6!=undefined)  targetDropdown6.innerHTML="";
	if (targetDropdown7!=undefined)  targetDropdown7.innerHTML="";
	if (targetDropdown8!=undefined)  targetDropdown8.innerHTML="";
	if (targetDropdown9!=undefined)  targetDropdown9.innerHTML="";
	if (targetDropdown10!=undefined) targetDropdown10.innerHTML="";

	for (i=0; i<sourceDropdown.children.length; i++) {
		addItemToSelect(targetDropdown1, sourceDropdown.children(i).value, sourceDropdown.children(i).innerText);
		if (targetDropdown2!=undefined)
			addItemToSelect(targetDropdown2, sourceDropdown.children(i).value, sourceDropdown.children(i).innerText);
		if (targetDropdown3!=undefined)
			addItemToSelect(targetDropdown3, sourceDropdown.children(i).value, sourceDropdown.children(i).innerText);
		if (targetDropdown4!=undefined)
			addItemToSelect(targetDropdown4, sourceDropdown.children(i).value, sourceDropdown.children(i).innerText);
		if (targetDropdown5!=undefined)
			addItemToSelect(targetDropdown5, sourceDropdown.children(i).value, sourceDropdown.children(i).innerText);
		if (targetDropdown6!=undefined)
			addItemToSelect(targetDropdown6, sourceDropdown.children(i).value, sourceDropdown.children(i).innerText);
		if (targetDropdown7!=undefined)
			addItemToSelect(targetDropdown7, sourceDropdown.children(i).value, sourceDropdown.children(i).innerText);
		if (targetDropdown8!=undefined)
			addItemToSelect(targetDropdown8, sourceDropdown.children(i).value, sourceDropdown.children(i).innerText);
		if (targetDropdown9!=undefined)
			addItemToSelect(targetDropdown9, sourceDropdown.children(i).value, sourceDropdown.children(i).innerText);
		if (targetDropdown10!=undefined)
			addItemToSelect(targetDropdown10, sourceDropdown.children(i).value, sourceDropdown.children(i).innerText);
	}
}

function addItemToSelect(select, value, title) {
	var oOption = document.createElement("OPTION");
	select.options.add(oOption);
	oOption.value = value;
	oOption.innerText = title;
}

function clearPopupSelectableBoxes(clearButton) {
    clearButton.parentElement.children(0).value = "";
    clearButton.parentElement.children(1).value = "";
}

function hasControlRequiredValidationConditions(control, validationSet) {
	var ret =
		control.required=="true" &&
		control.validationSet==validationSet &&
		!control.disabled &&
		control.parentElement.style.display!="none" &&
		control.parentElement.parentElement.style.display!="none" &&
		control.parentElement.parentElement.parentElement.style.display!="none" &&
		control.parentElement.parentElement.parentElement.parentElement.style.display!="none" &&
		control.parentElement.parentElement.parentElement.parentElement.parentElement.style.display!="none";

	handleRequiredInputBlur(control);
	
	return ret;
}

function validateDatePickerFields() {
	var datePickersArray = document.getElementsByTagName("datePicker");

	for (var i=0; i<datePickersArray.length; i++) {
		if (datePickersArray[i].invalid==true) {
			messageBox("InvalidDate");
			datePickersArray[i].focus();
			return false;
		}
	}

	return true;
}

var invalidControlsArray;
var userControlsArray=new Array();
function validateRequiredFields(validationSet) {
	var inputsArray = document.getElementsByTagName("input");
	var textareasArray = document.getElementsByTagName("textarea");
	var selectsArray = document.getElementsByTagName("select");
	var tablesArray = document.getElementsByTagName("table");

	var controlArray = new Array();
	invalidControlsArray = new Array();
	var arrayIndex = 0;
	for (var i=0; i<inputsArray.length; i++) {
		if (hasControlRequiredValidationConditions(inputsArray[i], validationSet))
			controlArray[arrayIndex++] = inputsArray[i];
	}

	for (var i=0; i<textareasArray.length; i++) {
		if (hasControlRequiredValidationConditions(textareasArray[i], validationSet))
			controlArray[arrayIndex++] = textareasArray[i];
	}

	for (var i=0; i<selectsArray.length; i++) {
		if (hasControlRequiredValidationConditions(selectsArray[i], validationSet))
			controlArray[arrayIndex++] = selectsArray[i];
	}

	var invalidCount = 0;
	var errorBG      = "#FFEAEA";
	for (var i=0; i<controlArray.length; i++) {
		var forceInvalid = null;
		if (controlArray[i].tagName.toLowerCase()=="select" && controlArray[i].validateCount=="true")
			forceInvalid = controlArray[i].children.length==0;

		if ((forceInvalid==null && (controlArray[i].value=="" || controlArray[i].value==undefined)) || forceInvalid) {
			if (controlArray[i].style.display!="none") {
				controlArray[i].originalBGColor = controlArray[i].style.backgroundColor;
				controlArray[i].style.backgroundColor = errorBG;
				try{
					controlArray[i].scrollIntoView();
				} catch(e){}

				invalidControlsArray[invalidCount++] = controlArray[i];
			} else if (controlArray[i].style.display=="none" && controlArray[i].parentElement.innerHTML.indexOf("ccc:datePicker")!=-1) {
				try {
					eval(controlArray[i].id.toString() + "Picker.setBackgroundColor(\"" + errorBG + "\");");
					invalidControlsArray[invalidCount++] = controlArray[i];
				} catch (e1) {
					try {
						controlArray[i].nextSibling.setBackgroundColor(errorBG);
						invalidControlsArray[invalidCount++] = controlArray[i];
					} catch (e2) {}
				}
			}
		}
	}

	for (var i=0; i<tablesArray.length; i++) {
		if (tablesArray[i].type=="gridEx") {
			if (validationSet==undefined || tablesArray[i].validationSet=="" || tablesArray[i].validationSet==validationSet) {
				eval("var ret = " + tablesArray[i].validationFunction + "();");
				if (!ret)
					invalidCount++;
			}
		} else if (tablesArray[i].type=="grid") {
			if (validationSet==undefined || tablesArray[i].validationSet=="" || tablesArray[i].validationSet==validationSet) {
				if (tablesArray[i].required=="true") {
					var tblData = tablesArray[i].nextSibling.children(0);
					var hasRows = false;
					for (var j=0; j<tblData.rows.length - 1; j++) {
						if (tblData.rows[j].style.display!="none") {
							hasRows = true;
							break;
						}
					}

					if (!hasRows) {
						var requiredMessageKey = tablesArray[i].requiredMessageKey;
						if (requiredMessageKey==undefined || requiredMessageKey=="")
							requiredMessageKey = "AtLeaseOneGridRowIsRequired";
						
						messageBox(requiredMessageKey, eMessageBoxStyle.exclamation);
						return false;
					}
				}

				eval("var ret = " + tablesArray[i].validationFunction + "();");
				if (!ret)
					invalidCount++;
			} else {
				eval("buildGridExSaveData(" + tablesArray[i].parentElement.id + ");");
			}
		}
	}
	for(var i=0; i<userControlsArray.length; i++)
	{
		if(validationSet==undefined || userControlsArray[i].validationSet=="" || userControlsArray[i].validationSet==validationSet)
		{
			eval("var ret = " + userControlsArray[i].validationFunction + "();");
			if(!ret)
				invalidCount++;
		}
	}

	return invalidCount==0;
}

function standardizeInputCharacters(input) {
  input.value = getStandardizeCharacters(input.value);
}

function handleRequiredInputBlur(input)	{
	if (input.required == "true") {
		var originalBGColor = "white";
		if (input.originalBGColor!=undefined)
			originalBGColor = input.originalBGColor;
		
		if ((input.value != "" && input.value != undefined) || input.disabled==true)
			input.style.backgroundColor = originalBGColor;
	}	
}

function isTrue(varBool) {
	switch (typeof(varBool)) {
		case "boolean":
			return varBool;
		
		case "number":
			return ( 0!=varBool );
			
		case "string":
			return ( 0==varBool.search(/1|true/i) );
		
		default:
			return false;
	}
}

function formatPersianDate(CheckDate) {
	YY = parseInt(CheckDate.substr(0, CheckDate.indexOf("/")), 10);
	MM = parseInt(CheckDate.substring(CheckDate.indexOf("/") + 1, CheckDate.lastIndexOf("/")) , 10);
	DD = parseInt(CheckDate.substr(CheckDate.lastIndexOf("/") + 1), 10);
	
	if (YY==0 || isNaN(YY))
		return false;
	if (MM < 1 || MM > 12 || isNaN(MM)) 
		return false;

	if (DD < 1 || DD > 31 || isNaN(DD)) 
		return false;

	switch (MM)
	{
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
		case 6:
			if (DD < 1 || DD > 31)
				return false;
			break;
		case 7:
		case 8:
		case 9:
		case 10:
		case 11:
		case 12:
			if (DD < 1 || DD > 30)
				return false;
			break;
	}
	
	DD=DD.toString();
	MM=MM.toString();
	YY=YY.toString();
	
	DD = "0" + DD;
	MM = "0" + MM;
	DD = DD.substring(DD.length-2);
	MM = MM.substring(MM.length-2);
	
	YY = YY.length==1?"0"+YY:YY;
	YY = YY.length==2?"13"+YY:YY;
	
	if (parseInt(YY, 10) < 1300 || parseInt(YY, 10) > 1450)
		return false;
	
	return YY+"/"+MM+"/"+DD;
}

function getHoursPart(objDate) {
	var hours = "00" + objDate.getHours();
	var minutes = "00" + objDate.getMinutes();
	hours = hours.substr(hours.length-2);
	minutes = minutes.substr(minutes.length-2);
	
	return hours + ":" + minutes;
}

function padwithZero(str) {
	return ("00" + str).substr(("00" + str).length - 2);
}

function calculateDateRangeDifference(START_DATE_BOX, END_DATE_BOX, DURATION_DAYS_BOX, DURATION_MONTHS_BOX, DURATION_YEARS_BOX) {
	var mode = START_DATE_BOX.className=="dateInput" ? "textBox" : "datePicker";

  var durationDays = "", durationMonths = "", durationYears = "";
	if (mode=="textBox") {
		var formattedStartDate = formatPersianDate(START_DATE_BOX.value);
		var formattedEndDate   = formatPersianDate(END_DATE_BOX.value);

		if(formattedStartDate==false || formattedEndDate==false)
			return;

		if (formattedStartDate>formattedEndDate) {
			START_DATE_BOX.value = formattedEndDate;
			END_DATE_BOX.value   = formattedStartDate;
			
			formattedStartDate = START_DATE_BOX.value;
			formattedEndDate   = END_DATE_BOX.value;
		}
		
		var startDate = parsePersianDate(formattedStartDate);
		var endDate   = parsePersianDate(formattedEndDate);
	
	  durationDays = Math.ceil((endDate - startDate) / (1000 * 60 * 60 * 24));
	  durationYears = Math.floor(durationDays / 365);
	  durationDays -= durationYears * 365;
	  durationMonths = Math.floor(durationDays / 30);
	  durationDays -= durationMonths * 30;
	} else {
    try {
      var startPicker = START_DATE_BOX.nextSibling;
      var endPicker   = END_DATE_BOX.nextSibling;
      var startDaysCount = (val(startPicker.year) * 360) + (val(startPicker.month) * 30) + val(startPicker.day);
      var endDaysCount   = (val(endPicker.year) * 360) + (val(endPicker.month) * 30) + val(endPicker.day);

      durationDays = endDaysCount - startDaysCount;
	    durationYears = Math.floor(durationDays / 360);
	    durationDays -= durationYears * 360;
	    durationMonths = Math.floor(durationDays / 30);
	    durationDays -= durationMonths * 30;
    } catch(e) {}
	}

	DURATION_DAYS_BOX.value   = durationDays;
	DURATION_MONTHS_BOX.value = durationMonths;
	DURATION_YEARS_BOX.value  = durationYears;
}

function findControlByIdSuffix(containerElement, id) {
	if (id == "")
		return null;
	for (var i=0; i<containerElement.children.length; i++) {
		var currentElement = containerElement.children[i];
		if (currentElement.id.toString().indexOf(id) == currentElement.id.length - id.length) {
				if (currentElement.id.toString().indexOf(id) != -1){
					return currentElement;
				}
		} else {
			var ret = findControlByIdSuffix(currentElement, id);
			if (ret!=null) {
				return ret;
			}
		}
	}
	return null;
}

function parseURLfor(szWhat) {
	var re = new RegExp("[?|&]" + szWhat + "=([^&]*)","gi");
	var arr = re.exec(window.document.location.search);
	return ((arr==null) ? null : arr[1]);
}

function getDateObject(dateString) {
	return new Date(Date.parse(dateString.replace(/(\d{4})-(\d{2})-(\d{2})/ig, "$2/$3/$1")));
}

// function to format a number with separators. returns formatted number. (<script language="JavaScript" src="http://www.hashemian.com/js/NumberFormat.js"></script>)
// num - the number to be formatted
// decpoint - the decimal point character. if skipped, "." is used
// sep - the separator character. if skipped, "," is used
function formatDecimal(num, decpoint, sep) { //Original Name: FormatNumberBy3
  // check for missing parameters and use defaults if so
  if (arguments.length == 2) {
    sep = ",";
  }
  if (arguments.length == 1) {
    sep = ",";
    decpoint = ".";
  }
  // need a string for operations
  num = num.toString();
  // separate the whole number and the fraction if possible
  a = num.split(decpoint);
  x = a[0]; // decimal
  y = a[1]; // fraction
  z = "";


  if (typeof(x) != "undefined") {
    // reverse the digits. regexp works from left to right.
    for (i=x.length-1;i>=0;i--)
      z += x.charAt(i);
    // add seperators. but undo the trailing one, if there
    z = z.replace(/(\d{3})/g, "$1" + sep);
    if (z.slice(-sep.length) == sep)
      z = z.slice(0, -sep.length);
    x = "";
    // reverse again to get back the number
    for (i=z.length-1;i>=0;i--)
      x += z.charAt(i);
    // add the fraction back in, if it was there
    if (typeof(y) != "undefined" && y.length > 0)
      x += decpoint + y;
  }

  return x;
}

function u_Param(key, value)
{
    return "&" + key + "=" + urlEncode(value);
}

function u_FirstParam(key, value)
{
    return "?" + key + "=" + urlEncode(value);
}

function u_AppendParam(url, key, value)
{
    if (url.indexOf('?') < 0)
    {
        return url + u_FirstParam(key, value);
    }
    else
    {
        return url + u_Param(key, value);
    }
}

function u_MakeUnique(url)
{
    if (url.indexOf('?') < 0)
    {
        return url;
    }
    var rand_str = "c5beb3dc46a10e41" + Math.round(Math.random() * 2147483648.000000);
        return u_AppendParam(url, "zx", rand_str);
}

var serverResponseCache = new Array();
function getServerResponseWithCache(software, command, arguments, data) {
	var cacheKey = software + "," + command + "," + arguments + "," + data;
	if (serverResponseCache[cacheKey]==undefined)
		serverResponseCache[cacheKey] = getServerResponse(software, command, arguments, data);
	
	return serverResponseCache[cacheKey];
}

function getServerResponse(software, command, arguments, data) {
	var url = getSoftwareControlsPath(software) + "/clientEventHandlers.aspx";
	return getXmlHttpResponse(url + "?c=" + command + (arguments==undefined || arguments==null ? "" : "&" + arguments) + "&rnd=" + getTempId(), data);
}

function getServerResponseAsync(software, command, arguments, responseHandler, data) {
	var url = getSoftwareControlsPath(software) + "/clientEventHandlers.aspx";
	return getXmlHttpResponseAsync(url + "?c=" + command + (arguments==undefined ? "" : "&" + arguments) + "&rnd=" + getTempId(), responseHandler, data);
}

function parseServerDateString(serverDateString) {
	return new Date(Date.parse(serverDateString.replace(/(\d{4})-(\d{2})-(\d{2})/ig, "$2/$3/$1")));
}

var g_rgRequestFactory = new Array();
function requestFactory(software, command, arguments, fnCallBack, objContext) {
	var url = getSoftwareControlsPath(software) + "/clientEventHandlers.aspx";
	url += "?c=" + command + (arguments==undefined ? "" : "&" + arguments) + "&rnd=" + getTempId();

	var objXMLHTTP;
	this.xmlhttp = new ActiveXObject("Microsoft.xmlhttp");
	this.xmlVersion = 1;
	objXMLHTTP = this.xmlhttp;
	objXMLHTTP.open("POST", url, true);
	objXMLHTTP.send(objContext);
	this.url = url;
	this.context = objContext;
	this.index = requestFactory.index;
	this.expand = false;
	this.lockRequest = false;
	if(null != fnCallBack) {
		this.callBack = fnCallBack;
		this.xmlhttp.onreadystatechange = new Function("requestDispatch(" + (this.index) + ")");
	}
	
	g_rgRequestFactory[this.index] = this;
	
	requestFactory.index += 1;

}
requestFactory.index = 0;

function requestDispatch(iIndex) {
	var obj = g_rgRequestFactory[iIndex];
	if (null != obj && !obj.lockRequest && 4 == obj.xmlhttp.readystate) {
		obj.lockRequest = true;
		Object.prototype.invoke = obj.callBack;
		var invoker = new Object();
		invoker.invoke(obj.xmlhttp.responseText);
		delete g_rgRequestFactory[iIndex];
	}
}

function getFullUrlOf(pagePath) {
  var ret = window.location.href.toString();
  ret = ret.substr(0, ret.length - window.location.search.length - 12);
  
  ret += pagePath;
  
  return ret;
}

function $(controlId){
  var ctrl;
  if (document.getElementById) { 
      // IE 5.5+, Netscape 6+/Mozilla, Opera 7+ (6+?) 
      ctrl = document.getElementById(controlId); 
  } else if (document.all) { 
      // IE 5 and lower 
      ctrl = document.all(controlId); 
  } else if (document.controlId) { 
      // other browsers? 
      // don't know if any browsers will actually react to this 
      ctrl = document.controlId; 
  } 
  return ctrl;
}

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}

function generateGuid_sub() {
   return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}
function generateGuid() {
   return (generateGuid_sub()+generateGuid_sub()+"-"+generateGuid_sub()+"-"+generateGuid_sub()+"-"+generateGuid_sub()+"-"+generateGuid_sub()+generateGuid_sub()+generateGuid_sub());
}

function RandomString(length)
{
  var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890?!@#$*()";
  var charsLength = chars.length;
  var str = "";
  
  for(x = 0; x < length; x++)
  {
    i = Math.floor(Math.random() * charsLength);
    str += chars.charAt(i);
  }
  return str;
}

function toggleCheckBoxes(parentElement, checked) {
		var checkBoxes = parentElement.all.tags("INPUT");
		
		for (var i=0; i<checkBoxes.length; i++)
			checkBoxes[i].checked = checked;
}

function daysBetween(date1, date2) {
  // The number of milliseconds in one day
  var ONE_DAY = 1000 * 60 * 60 * 24;

  // Convert both dates to milliseconds
  var date1_ms = date1.getTime();
  var date2_ms = date2.getTime();

  // Calculate the difference in milliseconds
  var difference_ms = date1_ms - date2_ms;
  
  // Convert back to days and return
  return Math.round(difference_ms/ONE_DAY);
}

function insertTextAtCursor(myField, myValue) {
	//Source: http://alexking.org/blog/2003/06/02/inserting-at-the-cursor-using-javascript
	
	//IE support
	if (document.selection) {
		sel = document.selection.createRange();
		sel.text = myValue;
	}

	//MOZILLA/NETSCAPE support
	else if (myField.selectionStart || myField.selectionStart == '0') {
		var startPos = myField.selectionStart;
		var endPos = myField.selectionEnd;
		myField.value = myField.value.substring(0, startPos)
								+ myValue
								+ myField.value.substring(endPos, myField.value.length);
	} else {
		myField.value += myValue;
	}
}

function gtSelectedItemsCount(listControl) {
	var ret = 0;

	for (var i=0; i < listControl.children.length; i++)
		if (listControl.children(i).selected)
			ret++;

	return ret;
}

function enableCancelBubble() {
	event.cancelBubble = true;
}

function windowOpen(url, name, features, replace) {
	var newWindow = rootWindow.open(url, name, features, replace);
	newWindow.focus();
	return newWindow;
}