//utils.js
var msg = '';
var userAction = '';
var intRE = new RegExp('^[0-9]+$');
var floatRE = new RegExp('^[0-9]+\.[0-9]+$');
var moneyRE = new RegExp('^[0-9]+\.[0-9]{1,2}$');
var dateRE = new RegExp('^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$');
var emailRE = new RegExp("^[a-z0-9']([\.\_]?[a-z0-9']*)*\@[a-z0-9]+([\.\_\-][a-z0-9]*)+$");
var emailRegExp = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i;

/******************************************************************************
FIELD VALIDATION FUNCTIONS
******************************************************************************/
function setAction(act) {
	userAction = act;
}

function checkReqdField(fieldObj, len)
{
	if (fieldObj == null) {
		return;
	}
	
	if (!len) {
		var len = 0;
	}

	var val = trim(fieldObj.value);
	var isError = val == '' || val.length < len;
	var fieldName = fieldObj.name;
	setVisibility(fieldName + 'Cross', isError);
	setVisibility(fieldName + 'Error', isError);
	setVisibility(fieldName + 'Tick', !isError);
	return !isError;
}

function isValidEmail(fieldObj, isReqd)
{
	if (fieldObj == null) {
		return;
	}
	
	var val = trim(fieldObj.value);
	var fieldName = fieldObj.name;
	var isError = (isReqd && val == '') || !val.match(emailRE);
	setVisibility(fieldName + 'Cross', isError);
	setVisibility(fieldName + 'Error', isError);
	setVisibility(fieldName + 'Tick', !isError);
	return !isError;
}

function checkEquality(obj1, obj2)
{
	if (obj1 == null || obj2 == null) {
		return true;
	}
	
	var isError = obj1.value != obj2.value;
	var fieldName = obj1.name;
	setVisibility(fieldName + 'Cross', isError);
	setVisibility(fieldName + 'Tick', !isError);
	return !isError;
}

function isListSelected(fieldObj, fieldLbl)
{
	if (fieldObj == null) {
		return true;
	}
	
	if (fieldObj.selectedIndex == 0)
	{
		if (fieldLbl != '')
		{
			msg += fieldLbl + ' must be selected';
		}
		fieldObj.focus();
		return false;
	}
	return true;
}

function isMultiListSelected(fieldObj, fieldLbl)
{
	if (fieldObj == null) {
		return true;
	}
	
	for (i = 0; i < fieldObj.options.length; i++)
	{
		if (fieldObj.options[i].selected)
		{
			return true;
		}
	}
	
	if (fieldLbl != '')
	{
		msg += fieldLbl + ' must be selected';
	}
	fieldObj.focus();
	return false;
}

function isCheckboxChecked(fieldObj, fieldLbl) 
{
	if (fieldObj == null) {
		return true;
	}
	
	if (!fieldObj.checked) {
		if (fieldLbl != '') {
			msg += fieldLbl + ' must be checked';
		}
		fieldObj.focus();
		return false;
	}
	return true;
}

function isRadioSelected(fieldObj, fieldLbl)
{
	if (fieldObj == null) {
		return true;
	}
	
	for (i = 0; i < fieldObj.length; i++)
	{
		if (fieldObj[i].checked)
		{
			return true;
		}
	}
	
	if (fieldLbl != '')
	{
		msg += fieldLbl + ' must be selected';
	}
	fieldObj[0].focus();
	return false;
}

function isValidInt(fieldObj, fieldLbl, isReqd)
{
	if (fieldObj == null) {
		return true;
	}
	
    var val = trim(fieldObj.value);
    if ( (!isReqd && val == '') || val.match(intRE))
	{
        return true;
    }
	else
	{
		if (fieldLbl != '')
		{
	        msg += fieldLbl + (isReqd ? ' is required and ' : '') + ' should be a number without decimals';
		}
		fieldObj.select();
		fieldObj.focus();
        return false;
    }
}

function isValidFloat(fieldObj, fieldLbl, isReqd)
{
	if (fieldObj == null) {
		return true;
	}
	
    var val = trim(fieldObj.value);
    if ( (!isReqd && val == '') || val.match(intRE) || val.match(floatRE))
	{
        return true;
    }
	else
	{
		if (fieldLbl != '')
		{
	        msg += fieldLbl + (isReqd ? ' is required and ' : '') + ' should be a number with / without decimals';
		}
		fieldObj.select();
		fieldObj.focus();
        return false;
    }
}

function isValidMoney(fieldObj, fieldLbl, isReqd)
{
	if (fieldObj == null) {
		return true;
	}
	
    var val = trim(fieldObj.value);
    if ( (!isReqd && val == '') || val.match(intRE) || val.match(moneyRE))
	{
        return true;
    }
	else
	{
		if (fieldLbl != '')
		{
			msg += fieldLbl + (isReqd ? ' is required and ' : '') + ' should be a number without decimals or with max 2 decimals';
		}
		fieldObj.select();
		fieldObj.focus();
        return false;
    }
}

function isValidFutureDate(fieldObj, fieldLbl)
{
	if (fieldObj == null) {
		return true;
	}
	
	if (isValidDate(fieldObj, fieldLbl))
	{
		//check for future validation
		var parts = fieldObj.value.split('/');
		var dt = new Date(parts[2], parts[1]-1, parts[0]);
		if (dt - new Date() > 0)
		{
			return true;
		}
		else
		{
			if (fieldLbl != '')
			{
				msg += fieldLbl + ' must be a future date';
			}
			fieldObj.select();
			fieldObj.focus();
			return false;
		}
	}
	return false;
}

function isValidDate(fieldObj, fieldLbl, isReqd)
{
	if (fieldObj == null) {
		return true;
	}
	
    var val = trim(fieldObj.value);
    if (!isReqd && val == '')
	{
        return true;
    }

    var isValidFormat = val.match(dateRE);
    if (isValidFormat)
	{
        var dateParts = val.split('/');
        var dt = eval(dateParts[0]);
        var mn = eval(dateParts[1]);
        var yr = eval(dateParts[2]);
		
        isValidFormat = isValidFormat && yr >= 2000;
        isValidFormat = isValidFormat && (mn >= 1 && mn <= 12);

        if (isValidFormat)
		{
            var minDt = 1;
            var maxDt;
            if (mn == 1 || mn == 3 || mn == 5 || mn == 7 || mn == 8 || mn == 10 || mn == 12)
			{
                maxDt = 31;
            }
			else if (mn == 4 || mn == 6 || mn == 9 || mn == 11)
			{
                maxDt = 30;
            }
			else if (mn == 2)
			{
                maxDt = yr % 4 == 0 ? 29 : 28;
            }
            isValidFormat = isValidFormat && (dt >= minDt && dt <= maxDt);
        }
    }
    
    if (isValidFormat)
	{
        return true;
    }
	else
	{
		if (fieldLbl != '')
		{
			msg += fieldLbl + (isReqd ? ' is required and ' : '') + ' should be a valid date in DD/MM/YYYY format';
		}
		fieldObj.select();
		fieldObj.focus();
        return false;
    }
}

function isValidLogin(fieldObj, fieldLbl)
{
	if (fieldObj == null) {
		return true;
	}
	
	var val = trim(fieldObj.value);
	var tempMsg = '';
	if (val.length < 4)
	{
		tempMsg = ' should have at least 4 characters';
	}
	
	if (tempMsg == '') {
		for (var i = 0; i < val.length; i++)
		{
			var chrCode = val.charCodeAt(i);
			if (chrCode == 46 || (chrCode >= 48 && chrCode <= 57) || (chrCode >= 65 && chrCode <= 90) || (chrCode >= 97 && chrCode <= 122))
			{
				if (i == 0 && (chrCode >= 48 && chrCode <= 57))
				{
					tempMsg = ' first character must be an alphabet';
					break;
				}
			}
			else
			{
				tempMsg = ' contains invalid characters';
			}
		}
	}
	
	if (tempMsg != '')
	{
		if (fieldLbl != '')
		{
			msg += fieldLbl + tempMsg;
		}
		fieldObj.select();
		fieldObj.focus();
		return false;
	}
	return true;
}

function updateTips(t, tips) {
	tips
		.text(t)
		.addClass('ui-state-highlight');
	setTimeout(function() {
		tips.removeClass('ui-state-highlight', 1500);
	}, 500);
}

function checkLength(o,n, t) {
	if ( o.val() == '' ) {
		o.addClass('ui-state-error');
		updateTips(n + " is required.", t);
		//alert(n + " is required.");
		return false;
	} else {
		return true;
	}

}

function checkRegexp(o,regexp,n, t) {

	if ( !( regexp.test( o.val() ) ) ) {
		o.addClass('ui-state-error');
		updateTips(n, t);
		//alert(n);
		return false;
	} else {
		return true;
	}

}
/******************************************************************************
UTILITY FUNCTIONS
******************************************************************************/
function getObj(objId)
{
	return document.getElementById(objId);	
}

function trim(str)
{
    return str.replace(/^\s+/g, '').replace(/\s+$/g, '');
}

function setVisibility(objId, status)
{
	var obj = getObj(objId);
	if (obj != null)
	{
		obj.style.display = status ? "" : "none";
	}
}

function setObjVisibility(obj, status)
{
	if (obj != null)
	{
		obj.style.display = status ? "" : "none";
	}
}

function isVisible(objId)
{
	var obj = getObj(objId);
	return obj != null && obj.style.display != "none";
}

function isObjVisible(obj)
{
	return obj != null && obj.style.display != "none";
}

function newElement(tag)
{
	return document.createElement(tag);
}

function getSelectedRadioVal(radioListObj) {
	for (i = 0; i < radioListObj.length; i++) {
		if (radioListObj[i].checked) {
			return radioListObj[i].value;
		}
	}
	return "-1";
}

function evalScripts(domObj) {
	var scripts = domObj.getElementsByTagName('script');
	//alert(scripts.length);
	for (var i = 0; i < scripts.length; i++) {
		//alert(scripts[i].innerHTML);
		eval(scripts[i].innerHTML);
		//eval('alert("evaled script' + i + '");');
	}
}

function addOption(selectObj, val, text) {
	var newOptionObj = document.createElement('OPTION');
	newOptionObj.setAttribute('value', val);
	newOptionObj.innerHTML = text;
	selectObj.appendChild(newOptionObj);
}

function removeAllChildren(parentObj) {
	while (parentObj.childNodes.length > 0) {
		parentObj.removeChild(parentObj.firstChild);
	}
}

function destroySubTree(parentObj) {
	//alert(parentObj);
	if (!parentObj) {
		return;
	}
	//alert(parentObj.nodeType);
	
	if (parentObj.nodeType != 1) {
		//alert('returning');
		return;
	}
	
	//alert(parentObj.tagName);
	
	//while (parentObj.hasChildNodes) {
	for (var i = 0; i < parentObj.childNodes.length; i++) {
		//alert('before recursion: ' + parentObj);
		destroySubTree(parentObj.childNodes[i]);
		//alert('before removechild: ' + parentObj);
		//parentObj.removeChild(parentObj.childNodes[0]);
		if (parentObj.childNodes[i].id) { // != '' && parentObj.childNodes[i].id != undefined) {
			parentObj.childNodes[i].id = 'CHANGED';
		}
	}
}

function moveOptions(fromSelect, toSelect) {
	if (fromSelect == null || toSelect == null) {
		return;
	}
	
	var toList = new Array();
	var selStatus = new Array();
	var toLen = toSelect.options.length;
	for (var i = 0; i < toLen; i++) {
		var eachOption = toSelect.options[i];
		toList[eachOption.text] = eachOption.value;
		selStatus[eachOption.value] = eachOption.selected;
	}
	
	var fromLen = fromSelect.options.length;
	for (var i = 0; i < fromLen; i++) {
		if (fromSelect.options[i].selected) {
			var eachOption = fromSelect.options[i];
			toList[eachOption.text] = eachOption.value;
			fromSelect.removeChild(eachOption);
			// decrement i to avoid skipping options in the list
			i--;
			fromLen--;
		}
	}
	
	//toList.sort();
	var listLen = toList.length;
	var counter = 0;
	var keys = new Array();
	for (var key in toList) {
		keys[counter++] = key;
	}
	keys.sort();
	
	for (var i = 0; i < keys.length; i++) {
		var key = keys[i];
		var eachOption = new Option();
		eachOption.text = key;
		eachOption.value = toList[key];
		eachOption.selected = selStatus[toList[key]];

		toSelect[i] = eachOption;
	}
}

function selectAll(selectObj) {
	if (selectObj == null) {
		return;
	}
	
	var len = selectObj.options.length;
	for (var i = 0; i < len; i++) {
		selectObj.options[i].selected = true;
	}
}

function copyObjAttrib(sourceObj, destObj, attrib) {
	var val = sourceObj.getAttribute(attrib);
	if (val != '') {
		destObj.setAttribute(attrib, val);
	}
}


function selectAllCB(cbObj, childID, count) {
	for (var i = 0; i < count; i++) {
		var eachCB = getObj(childID + i);
		eachCB.checked = cbObj.checked;
	}
}

function moveUp(listObj) 
{
	for (var i = 0; i < listObj.options.length; i++) 
	{
		if (listObj.options[i].selected && listObj.selectedIndex != 0 ) 
		{
			var tempVal = listObj.options[i].value;
			var tempText = listObj.options[i].text;
			listObj.options[i].value = listObj.options[i - 1].value;
			listObj.options[i].text = listObj.options[i - 1].text
			listObj.options[i-1].value = tempVal;
			listObj.options[i-1].text = tempText;
			listObj.options[i].selected = false;
			listObj.options[i-1].selected = true;
			break;
      }
   }
}

function moveDown(listObj)
{
	if(listObj.selectedIndex + 1 == listObj.options.length) {
		return;
	}
	
	for (var i = 0; i < listObj.options.length; i++) 
	{
		if (listObj.options[i].selected && listObj.selectedIndex != listObj.options.length )
		{
			var tempVal = listObj.options[i].value;
			var tempText = listObj.options[i].text;
			listObj.options[i].value = listObj.options[i+1].value;
			listObj.options[i].text = listObj.options[i+1].text
			listObj.options[i+1].value = tempVal;
			listObj.options[i+1].text = tempText;
			listObj.options[i].selected = false;
			listObj.options[i+1].selected = true;
			break;
      	}
   	}
}

function showUserDiv(letter) {
	if (letter == '') {
		setAllUserDivVisibility(true);
	} else {
		setAllUserDivVisibility(false);
		var userDiv = getObj(letter + '_userDiv');
		if (userDiv != null) {
			setObjVisibility(userDiv, true);
		}
	}
}

function setAllUserDivVisibility(stat) {
	for (var i = 65; i < 91; i++) {
		var char = String.fromCharCode(i).toLowerCase();
		var eachDiv = getObj(char + '_userDiv');
		if (eachDiv != null) {
			setObjVisibility(eachDiv, stat);
		}
	}
}
/******************************************************************************
AJAX FUNCTIONS
******************************************************************************/
function getRequestObj() {
	return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
}

function invokeAjaxReq(url, handler, method, formData) {
	if (!method) {
		method = 'GET';
	}
	var req = getRequestObj();
	req.onreadystatechange = function() {
		//alert(req.readyState + ', ' + req.status);
		if (req.readyState == 4 && req.status == 200) {
			handler(req.responseText);
		}
	}

	req.open(method, url, true);
	if (method == 'POST') {
		req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	}
	req.send(formData);
	//alert('request sent to ' + url);
}

function getIdPart(input) {
	var parts = input.split('_');
	return parts[1];
}

function getRID(input) {
	var parts = input.split('-');
	return parts[0];
}

function addRow(tblId) {
	var tableObj = getObj(tblId + '_Tbl');
	var templateRowObj = getObj(tblId + '_Row_0');
	if (tableObj != null && templateRowObj != null) {
		var tbodyObj = tableObj.getElementsByTagName('TBODY')[0];
		var rowObj = newElement('TR');
		var trArray = tbodyObj.getElementsByTagName('TR');
		var rowCount = trArray.length;
		if (rowCount % 2 == 1) {
			rowObj.className = 'altrow';
		}
		var lastRowID = trArray[rowCount - 1].id;
		var rowID = parseInt(lastRowID.split('_')[2]) + 1;
		rowObj.id = tblId + '_Row_' + (rowID);
		var rowIDRE = new RegExp('ROWID', 'g');

		var tdArray = templateRowObj.getElementsByTagName('TD');
		var tdCount = tdArray.length;
		var calScript = '';
		for (i = 0; i < tdCount; i++) {
			var tdObj = newElement('TD');
			tdObj.innerHTML = tdArray[i].innerHTML.replace(rowIDRE, rowID);
			rowObj.appendChild(tdObj);
		}
		tbodyObj.appendChild(rowObj);
		
		// setup calendar
		$(function() {
			$("#date_" + rowID).datepicker({
				showOn: 'both',
				buttonImage: 'assets/z10_icon_calendar.gif',
				buttonImageOnly: true, 
				autoSize: true, 
				dateFormat: 'dd/mm/yy'
			});
		});
		
		// setup add assignee form
		$("#add-assignee-form_" + rowID).dialog({
			autoOpen: false,
			height: 'auto',
			width: 350,
			modal: true,
			resizable: false,
			buttons: {
				'Add Assignee': function() {
					var bValid = true;
					//allFields.removeClass('ui-state-error');

					bValid = bValid && checkLength($("#fname_" + rowID),"First Name", $("#message_" + rowID));
					bValid = bValid && checkLength($("#lname_" + rowID),"Last Name", $("#message_" + rowID));

					// From jquery.validate.js (by joern), contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
					bValid = bValid && checkRegexp($("#email_" + rowID),emailRegExp,"eg. admin@zenbuu.com", $("#message_" + rowID));
					
					if (bValid) {
						addAssignee('assignee_' + rowID, $("#fname_" + rowID).val(), $("#lname_" + rowID).val(), $("#email_" + rowID).val());
						$(this).dialog('close');
					}
				},
				Cancel: function() {
					getObj('assignee_' + rowID).selectedIndex = getObj('assigneehf_' + rowID).value;
					$(this).dialog('close');
				}
			}
		});
	}
}

function addRows(selectObj) {
	for (var i = 0; i < selectObj.value; i++) {
		addRow('rec');
	}
	selectObj.selectedIndex = 0;
}

function deleteRow(tblId, rowId) {
	if (!confirm('Data entered in this row will be lost.  Are you sure you want to continue?')) {
		return;
	}
	
	var rowObj = getObj(tblId + '_Row_' + rowId);
	var tableObj = getObj(tblId + '_Tbl');
	if (tableObj != null && rowObj != null) {
		var tbodyObj = tableObj.getElementsByTagName('TBODY')[0];
		tbodyObj.removeChild(rowObj);
		
		reAlternateColors(tblId);
	}
}

function reAlternateColors(tblId) {
	var tableObj = getObj(tblId + '_Tbl');
	if (tableObj != null) {
		var trArray = tableObj.rows;
		var rowCount = trArray.length;
		for (var i = 1; i < rowCount; i++) {
			trArray[i].className = i % 2 == 1 ? 'altrow' : '';
		}
	}
}
