 /* (C) Innoware Ltd 2007 */

var GridBuilderJS = new GridBuilderConstructor();


/* GridBuilderConstructor
* The main power constructor which creates and returns a new JavaScript object.
*/
function GridBuilderConstructor() {
    
	var that = {}; 

	/* Private Functions */

	function SetNewValue(res) {
		var sValue = res.value;
			
		if (sValue === '') {
			return true;
		}

		var	sBits = sValue.split('|');

		if (sBits[0] === '0') {
			alert(sBits[1]);
			return false;
		}
		else {
			document.getElementById(sBits[0]).innerHTML = sBits[1];
			return true;
		}
	}

	function AutoList(results) {
		var listTokens = results.split('|'), i, 
			AutoResults = new Array(listTokens.length), token;
		
		for(i=0; i < listTokens.length; i++) {
			if (listTokens[i] === '') {
				continue;
			}

			token = listTokens[i].split('&&');

			AutoResults[i] = {};
			AutoResults[i].id = token[0];
			AutoResults[i].text = token[1];
		}

		return AutoResults;
	}

	function CheckReplaceBlank(obj) {
		var ToBlankStrings = new Array ( "No name given", "Tasks", "Person", "Project", "Type", "Proposal", "Title not set", "Organisation", "0", "000", "No Date Set" ), i;

		for (i=0; i < ToBlankStrings.length; i++) {
			if (obj.value === ToBlankStrings[i]) {
				obj.value = '';
			}
		}
	}

	/* Public Variables */
	that.undefined;


	/* Public Functions */

	that.SetTabIndexes = function() {
	    return;
	    
		var eEditables = document.getElementsByClassName('editable'), i;

		for (i=0; i < eEditables.length; i++) {
			eEditables[i].tabIndex = i+1;
			if (document.attachEvent) { // IE needs to be shown where to tab to next
				var objWrite = document.getElementById(eEditables[i].id.replace('read','write')),
					eStrings = objWrite.getElementsByTagName('input'),
					eBlobs = objWrite.getElementsByTagName('textarea'),
					eEnums = objWrite.getElementsByTagName('select');

				if (eStrings.length > 0) {
					eStrings[0].onkeydown = that.KeyDownHandler;
				}
				if (eBlobs.length > 0) {
					eBlobs[0].onkeydown = that.KeyDownHandler;
				}
				if (eEnums.length > 0) {
					eEnums[0].onkeydown = that.KeyDownHandler;
				}
			}

			eEditables[i].onfocus = that.TabbedHere;
		}

//		if (eEditables.length > 0) {
//			that.SwitchEdit(eEditables[0].id.replace('read',''));
//		}
	};

	that.TabbedHere = function(evt) {
		evt = evt || event;
		var target = evt.target || evt.srcElement;
		
		that.SwitchEdit(target.id.replace('read',''));
	};

	that.KeyDownHandler = function(evt) {
		evt = evt || event;
		var target = evt.target || evt.srcElement,
			keyCode = evt.keyCode || evt.which;

		if (keyCode == 9) {
			// cancel the default event actions
			evt.returnValue = false;
			evt.cancel = true;
			evt.cancelBubble = true;

			var eEditables = document.getElementsByClassName('editable'), i;
				
			for (i=0; i < eEditables.length; i+=1) {
				if (eEditables[i].id === target.parentNode.id.replace('write','read')) {
					eEditables[i].blur();
					if (i+1 < eEditables.length) {
						eEditables[i+1].click();
					}
					else {
						eEditables[0].click();
					}
					break;
				}
			}

			return false;
		}	
	};

	that.ChangePage = function(iPageNum, sGridID) {
		SetNewValue(GridBuilder.ChangePage(iPageNum, sGridID));

		var eScript = document.getElementsByClassName('GBJavaScript'),
			sJavaScript = '', i;

		for (i=0; i < eScript.length; i++) {
			sJavaScript += eScript[i].innerHTML;
		}

		sJavaScript = sJavaScript.replace('<SCRIPT>','');
		sJavaScript = sJavaScript.replace('</SCRIPT>','');
		eval(sJavaScript);
	};

	that.SwitchEdit = function(id) {
		var objRead = document.getElementById('read' + id),
			objWrite = document.getElementById('write' + id),
			eStrings = objWrite.getElementsByTagName('input'),
			eBlobs = objWrite.getElementsByTagName('textarea'),
			eEnums = objWrite.getElementsByTagName('select'),
			txtarea = document.getElementById('blob' + id);

        if (txtarea && txtarea.disabled == true)
            return;

		if (objRead.style.display === 'none') {
			objRead.style.display = '';
			objWrite.style.display = 'none';
		}
		else {
            var vWidth  = objRead.clientWidth;
			objWrite.style.width = vWidth + 'px';

			objRead.style.display = 'none';
			objWrite.style.display = '';
			
			if (eStrings.length > 0) {
				eStrings[0].focus();
				CheckReplaceBlank(eStrings[0]);
			}
			if (eBlobs.length > 0) {
				eBlobs[0].focus();
				eBlobs[0].style.width = (vWidth  > 5 ? vWidth-5 : 0) + 'px';
				CheckReplaceBlank(eBlobs[0]);
			}
			if (eEnums.length > 0) {
				if (eEnums[0].className !== 'AutoSuggest') {
					eEnums[0].focus();
				}
			}
		}
	};

	that.BlurAutoSuggest = function(id) {
		var objRead = document.getElementById('read' + id),
			objWrite = document.getElementById('write' + id),
			eStrings = objWrite.getElementsByTagName('input'),
			eAutoSuggest = objWrite.getElementsByTagName('select');

		if (eAutoSuggest[0].style.visibility !== 'visible') {
			objRead.style.display = '';
			objWrite.style.display = 'none';
		}
	};

	that.UpDateCollectionCount = function(objName, collectionName, objOID) {
		SetNewValue(GridBuilder.UpDateCollectionCount(objName, collectionName, objOID));
	};

	that.AddRemoveCollectionObject = function(objName, collectionName, objOID, collectionOID) {
		SetNewValue(GridBuilder.AddRemoveCollectionObject(objName, collectionName, objOID, collectionOID));
	};

	that.GetXPObjects = function(sSearch, arrArgs) {
		var results = GridBuilder.GetXPObjects(sSearch, arrArgs[1],arrArgs[2],arrArgs[3]).value;
		return AutoList(results);
	};

	that.UpdateObject = function(editObjectOID, sText, arrArgs) {
		if (SetNewValue(GridBuilder.UpdateObject(arrArgs[1], arrArgs[2], arrArgs[3], editObjectOID))) {
			//that.SwitchEdit(arrArgs[1] + arrArgs[2] + arrArgs[3]);

			if (arrArgs[4] !== '') {
				eval(arrArgs[4]);
			}

			return false;
		}
	};

	that.EditCollection = function(objName, collectionName, objOID, sJavaScript) {
		showPopWin('GridBuilderCollections.aspx?ObjName=' + objName + '&CollectionName=' + collectionName + '&sObjOID=' + objOID,500,400);
	};

	that.EditBoolean = function(objName, booleanName, objOID, sJavaScript) {
		var sNewValue = document.getElementById('chk' + objName + booleanName + objOID).checked;

		GridBuilder.SaveBoolean(objName, booleanName, objOID, sNewValue,
			function(res) {
				if (SetNewValue(res)) {
					if (sJavaScript !== '') {
						eval(sJavaScript);
					}
				}
			});
	};

	that.EditString = function(objName, stringName, objOID, sJavaScript) {
		var sNewValue = document.getElementById('txt' + objName + stringName + objOID).value || '';

		GridBuilder.SaveString(objName, stringName, objOID, sNewValue,
			function(res) {
				if (SetNewValue(res)) {
					if (sJavaScript !== '') {
						eval(sJavaScript);
					}
				}
			});
	};

	that.EditBlob = function(objName, blobName, objOID, sJavaScript) {
		var sNewValue = document.getElementById('blob' + objName + blobName + objOID).value || '';

		GridBuilder.SaveString(objName, blobName, objOID, sNewValue,
			function(res) {
				if (SetNewValue(res)) {
					if (sJavaScript !== '') {
						eval(sJavaScript);
					}
				}
			});
	};

	that.EditEnum = function(objName, EnumName, objOID, sJavaScript) {
		var eEnumDDL = document.getElementById('enum' + objName + EnumName + objOID),
			sNewValue = eEnumDDL.options[eEnumDDL.selectedIndex].value;

		GridBuilder.SaveEnum(objName, EnumName, objOID, sNewValue,
			function(res) {
				if (SetNewValue(res)) {
					if (sJavaScript !== '') {
						eval(sJavaScript);
					}	
				}
			});
	};

	that.EditDate = function(objName, dateName, objOID, sJavaScript) {
		var sNewValue = document.getElementById('date' + objName + dateName + objOID).value || '';

		GridBuilder.SaveDate(objName, dateName, objOID, sNewValue,
			function(res) {
				if (SetNewValue(res)) {
					document.getElementById('read' + objName + dateName + objOID).innerHTML = sNewValue;

					if (sJavaScript !== '') {
						eval(sJavaScript);
					}
				}
			});
	};

	that.BlobCounter = function(sTextID, NumChars) {
		var sText = document.getElementById(sTextID).value || '';
		var iCount = NumChars - sText.length;

		if (iCount < 0)
		{	
			document.getElementById(sTextID).innerText = sText.substring(0,NumChars);
			document.getElementById('iCount'+sTextID).innerHTML = '0';						
		}
		else {
			document.getElementById('iCount'+sTextID).innerHTML = iCount;
		}
	};

	return that;
}