
	var Dirty = false;
	function setDirty(val)
	{
		var ret = Dirty;
		Dirty = val;
		return ret;
	}
	function isDirty()
	{
		return Dirty;
	}
	
	function checkDirtyChange()
	{
		ret = true;
		if(isDirty())
		{
			ret= confirm('ستفقد جميع التغييرات، هل تريد الاستمرار?');
		}
		return ret;
	}
	function checkDirtySave()
	{
		ret = true;
		if(!isDirty())
		{
			ret = confirm("لا يوجد تغييرات، هل تريد الحفظ?")
		}
		return ret;
	}
	
	function restoreSelected(slct, id)
	{
		var i
		for(i = 0; i < slct.length; i++)
		{
			if(id == slct.options[i].value)
			{
				slct.selectedIndex = i;
				break;
			}
		}
		return (i < slct.length);
	}

//////////////////////////////////////
function setFocus(objArr, index)
{
	var myindex = 0;
	if(index)
		myindex = index;
		
	var obj = getAtIndex(objArr, myindex);
	if (!obj.disabled)
		obj.focus();
}

function selectAll(objCheckArray, objRadioArray, checked, dim, subindex)
{
	var i = 0;
	
	if(objCheckArray.length)
	{
		for(i = 0; i < objCheckArray.length; i++)
		{
			if(objCheckArray[i].CheckGroup)
			{
				if(!objCheckArray[i].disabled)
				{
					objCheckArray[i].checked = checked;
						
					if(null == objRadioArray)
						rowColorCheck(i, objCheckArray[i], dim, subindex);
					else
						rowColorCheckRadio(i, objCheckArray[i], objRadioArray[i], subindex);
						
				}
			}
		}
	}
	else
	{
		if(objCheckArray.CheckGroup)
		{
			if(!objCheckArray.disabled)
			{
				objCheckArray.checked = checked;
						
				if(null == objRadioArray)
					rowColorCheck(i, objCheckArray, dim, subindex);
				else
					rowColorCheckRadio(i, objCheckArray, objRadioArray, subindex);
						
			}
		}
	}
	setDirty(true);
}

function selectAllGrouped(objCheckArray, objRadioArray, CheckGroup, checked, dim, subindex)
{
	var i = 0;
	if(objCheckArray.length)
	{
		for(i = 0; i < objCheckArray.length; i++)
		{
			if(objCheckArray[i].CheckGroup == CheckGroup)
			{
				if(!objCheckArray[i].disabled)
				{
					objCheckArray[i].checked = checked;
					if(null == objRadioArray)
						rowColorCheck(i, objCheckArray[i], dim, subindex);
					else
						rowColorCheckRadio(i, objCheckArray[i], objRadioArray[i], subindex);
								
					selectAllGrouped(objCheckArray, objRadioArray, objCheckArray[i].value.toString() +  CheckGroup.toString(), checked, dim, subindex)
				}
			}
		}
	}
	else
	{
		if(objCheckArray.CheckGroup)
		{
			if(!objCheckArray.disabled)
			{
				objCheckArray.checked = checked;
						
				if(null == objRadioArray)
					rowColorCheck(i, objCheckArray, dim, subindex);
				else
					rowColorCheckRadio(i, objCheckArray, objRadioArray, subindex);
						
			}
		}
	}
	setDirty(true);
}


function checkRequired(objContainer)
{
	var i;
	for(i = 0; i < objContainer.length; i++)
	{
		if(objContainer[i].Required)
		{
			if(isEmptyString(objContainer[i].value))
			{
				alert('من فضلك أدخل ' + objContainer[i].Required)
				objContainer[i].focus();
				return false;
			}
		}
	}
	return true
}


///////////////////////////////
function isEmptyString(str)
{
	var ret = true;
	if('' != str)
	{
		ret = (str.length + 1 == str.split(' ').length);
	}
	return ret;
}
function isEmail(str)
{
	var ret;
	if(ret = !isEmptyString(str))
	{
		var posAt = str.indexOf('@');
		var posDot = str.indexOf('.');
		ret =  (posDot > posAt && posAt > 0)
	}
	return ret;
}
///////////////////////////////
	function getCheckedList(arrObj, Level)
	{
		var i, j = 0;
		var list = new Array();
		
		if(arrObj.length)
		{
			for(i = 0; i < arrObj.length; i++)
			{
				if (arrObj[i].checked)
				{
					if (Level)
					{
						if(arrObj[i].Level==Level)
						{
							list[j++] = arrObj[i];
						}
					}
					else
					{
						list[j++] = arrObj[i];
					}
				}
			}
		}
		else
		{
			if (arrObj.checked)
			{
				list[0] = arrObj;
			}
		}
		return list;
	}

	function getAtIndex(arrObj, index)
	{
		var obj;
		if(arrObj)
		{
			if(arrObj.length)
				obj = arrObj[index]
			else
				obj = arrObj;
		}
		return obj;
	}
	
	var useStrips = true;
	
	function enableStrips(val)
	{
		useStrips = val;
	}
	function rowColor(row, arrObj, index, dim)
	{
		return;
		if(row)
		{
			var obj = getAtIndex(arrObj, index);
			if(obj)
			{
				if(obj.checked)
				{
					if(dim)
						row.className = 'rowDim';
					else
						row.className = 'rowSel';
				}
				else
				{
					if(useStrips)
						row.className = 'row' + index % 2;
					else
						row.className = '';
				}
			}
		}
	}

	function getTR(index, subindex)
	{
		var obj = null;
		
		var trRow = eval('trRow' + index);
		if(trRow)
			obj = getAtIndex(trRow, subindex);
			
		return obj;
	}
	
	function rowColorCheck(index, chk, dim, subindex)
	{
		var trRow = getTR(index, subindex);
		if(trRow)
			rowColor(trRow, chk, index, dim);
	}

	function rowColorCheckRadio(index, rad, chk, subindex)
	{
		var obj = getAtIndex(rad, index);
		if(!obj.checked)
		{
			var trRow = getTR(index, subindex);
			rowColor(trRow, chk, index, true);
		}
	}

	function rowColorRadioCheck(index, lastIndex, rad, chk, subindex)
	{
		if(index == lastIndex)
			return;
		var trRow = getTR(index, subindex);
		rowColor(trRow, rad, index, false);
		if(null != lastIndex)
		{
			trRow = getTR(lastIndex, subindex);
			rowColor(trRow, chk, lastIndex, true);
		}
	}
//////////////////////////////////////
	
	
	function moveOpt(oSrc, oDst, all)
	{
		if(all)
		{
			/*
			while (oSrc.length>0)
			{
				moveSingleOpt(oSrc, oDst, oSrc.length-1)
			}
			*/
			var i;
			for (i = 0; i < oSrc.length; i++)
			{
				if(moveSingleOpt(oSrc, oDst, i))
					i--;
			}
		}
		else
		{
			if (-1 != oSrc.selectedIndex)
			{
				moveSingleOpt(oSrc, oDst, oSrc.selectedIndex)
			}
		}
	}
	function moveSingleOpt(oSrc, oDst, index)
	{
		var opt = oSrc.options[index];
		var headerExist = false;
		var thisHeader = null;
		var dublicate = false;
		var nodBefore = null;
		
		// check if it is valid to move
		if(oDst.CheckList && opt.CheckValue)
		{
			var arrList = oDst.CheckList.split(',')
			var x;
			for(x = 0; x<arrList.length; x++)
			{
				if (arrList[x] == opt.CheckValue)
					break;
			}
			if(x == arrList.length)
				return false;
		}
		if(opt.GroupHead)
		{
			for(i= oDst.options.length - 1; i >= 0; i--)
			{
				var curOpt = oDst.options[i]; 
				if(curOpt.GroupHead)
				{
					if(curOpt.value == opt.value)
					{
						headerExist = true;
						thisHeader = curOpt;
						break;		
					}
				}
			}
			dublicate = true;
		}
		else
		{		
			var i
			// scan from the end
			for(i= oDst.options.length - 1; i >= 0; i--)
			{
				var curOpt = oDst.options[i]; 
				if(curOpt.GroupHead)
				{
					if(curOpt.value == opt.GroupValue)
					{
						headerExist = true;
						if(i < oDst.options.length - 1)
						{
							nodBefore = oDst.options[i+1];
							break;		
						}
					}
				}
				else
				{
					if(curOpt.GroupValue == opt.GroupValue)
					{
						headerExist = true;
						if(i < oDst.options.length - 1)
						{
							nodBefore = oDst.options[i+1];
							break;
						}
					}
				}
			}
		}
		if(dublicate)
		{
			if(!headerExist)
			{
				var newOpt = dublicateNode(opt);
				oDst.insertBefore(newOpt, nodBefore);
				newOpt.innerText = opt.innerText;
			}
			////////////////////
			//it is a header node to move all its childs
			for(i = 0; i < oSrc.options.length; i++)
			{
				var curOpt = oSrc.options[i]; 
				if(!(curOpt.GroupHead))
				{
					if(curOpt.GroupValue == opt.value)
					{
						oDst.insertBefore(oSrc.options[i], null);
						i--;
					}
				}
			}			
			opt.removeNode();
		}
		else
		{
			if(!headerExist)
			{
				for(i= oSrc.options.length - 1; i >= 0; i--)
				{
					var curOpt = oSrc.options[i]; 
					if(curOpt.GroupHead)
					{
						if(curOpt.value == opt.GroupValue)
						{
							break;
						}
					}
				}
				if(i >= 0 )
				{
					var newOpt = dublicateNode(curOpt);
					oDst.insertBefore(newOpt, nodBefore);
					newOpt.innerText = curOpt.innerText;
				}
			}
			var childcount = 0;
			// if this is the last child remove the head
			for(i= oSrc.options.length - 1; i >= 0; i--)
			{
				var curOpt = oSrc.options[i]; 
				if(curOpt.GroupHead)
				{
					if(curOpt.value == opt.GroupValue)
					{
						thisHeader = curOpt;
					}
				}
				else
				{
					if(curOpt.GroupValue == opt.GroupValue)
					{
						childcount++;
					}
				}
			}
			if(childcount <2)
			{
				if(thisHeader)
					thisHeader.removeNode();
			}
			
			oDst.insertBefore(opt, nodBefore);
		}
		return true;
	}
	function dublicateNode(nod)
	{
		var newNod = document.createElement("OPTION")
		
		if(nod.GroupValue)
			newNod.setAttribute('GroupValue', nod.GroupValue);
			
		if(nod.GroupHead)
			newNod.setAttribute('GroupHead', nod.GroupHead);
		
		newNod.name = nod.name;
		newNod.id = nod.id;
		newNod.value = nod.value;
		newNod.text = nod.text;
		newNod.style.color = nod.style.color;
		newNod.style.background = nod.style.background;
		
		return newNod;
	}


	function dublicateNode2(nod)
	{
		var newNod = document.createElement("OPTION")
		var i;
		for(i = 0; i < nod.attributes.length; i++)
		{
			var att = nod.attributes[i].name;
			att.value = nod.attributes[i].value;
			newNod.setAttribute(att.name, att.value, 0);
		}
		//newNod.style = nod.style;
		newNod.text = nod.text;
		newNod.innerText = nod.innerText
		return newNod;
	}
	
	function orderOpt(oobj, dir)
	{
		//oObj = window.form1.slctDst
		if (-1 != oObj.selectedIndex)
		{
			var newindex = -1
			var oFrom, oTo
			if ('up' == dir)
			{
				if(0 < oObj.selectedIndex)
				{
					newindex = oObj.selectedIndex - 1
				}
			}
			else
			{
				if(oObj.length - 1 > oObj.selectedIndex)
				{
					newindex = oObj.selectedIndex + 1
				}
			}
			if (-1 != newindex)
			{
				oFrom = oObj.options[oObj.selectedIndex]
				oTo = oObj.options[newindex]
					
				tmpValue = oTo.value;
				tmpText = oTo.text;
				
				oTo.value = oFrom.value;
				oTo.text = oFrom.text;
				
				oFrom.value = tmpValue;
				oFrom.text = tmpText;
				
				oObj.selectedIndex = newindex;
			}
		}
	}
