/**
 *	form.js
 * 	Coded by Shivprasad ajgaonkar
 */
 function form(){
	this.formName = '';
	this.moduleName = '';
	this.sqlDB = '0';
	this.sqlPrimaryKey = 'id';
	this.recId = '';
	this.dataArr = '';
	this.sqlSelect = '*';
	this.gotoFunction = '';
	this.gotoAfterLoad = '';
	this.checkBeforeSave = '';
	this.gotoOnNew = '';
	this.autoMax = '';
	this.maxCondition = '';
	this.editFlag = false;
	this.closeFlag = false;
	this.loadForm = loadForm;
	this.fillForm = fillForm;
	this.enableBtn = enableBtn;
	this.disableBtn = disableBtn;
	this.closeForm = closeForm;
	this.closeFrame = closeFrame;
	this.saveForm = saveForm;
	this.resetForm = resetForm;
	this.inArray = inArray;
	this.disableAll = disableAll;
	this.enableAll = enableAll;
	this.changedFields = new Array();
	this.formData = new Array();
	this.fillKey = 0;
}
function inArray(keyS,arr){
	for(var key in arr){
		if(keyS == arr[key]){
			return key;
		}
	}	
	return -1;
}
function loadForm(){
	this.recId = document.forms[this.formName].elements['id'].value;
	
	if(this.recId) {
		var ajaxVar = new ajaxVars();
		ajaxVar.vars['action'] = "db_fetch_assoc";
		ajaxVar.vars['sql_type'] = "select";
		ajaxVar.vars['sql_what'] = this.sqlSelect;
		ajaxVar.vars['sql_from'] = this.formName;
		ajaxVar.vars['sql_where'] = this.sqlPrimaryKey+"='"+this.recId+"'";
		ajaxVar.vars['sqlDB'] = this.sqlDB;
		ajaxVar.fnVars['orgObj'] = this;
		ajaxVar.gotoFunction = 'callData';
		ajaxVar.AjaxPostSQL();
	}else{
		this.fillForm();
	}
}
function callData(dataArr, fnVars){
	var orgObj = fnVars['orgObj'];
	orgObj.dataArr = dataArr;
	orgObj.fillForm();
}
function enableBtn(btnName){
	var frmObj = document.forms[this.formName];	
	var btnObj = document.forms[this.formName].elements[btnName];
	if(btnObj){
		btnObj.disabled = false;
		btnObj.style.backgroundColor = '#dd00ff';
		this.editFlag = true;
	}
}
function disableBtn(btnName){
	var frmObj = document.forms[this.formName];	
	var btnObj = document.forms[this.formName].elements[btnName];
	if(btnObj){
		btnObj.disabled = true;
		btnObj.style.backgroundColor = '';
		this.editFlag = false;
	}
}
function closeForm(){
	
	if(this.editFlag){
		var cnf = confirm('Do you want to save the changes before closing?');
		if(cnf){
			this.closeFlag = true;
			this.saveForm();
		}else{
			
			if(parent.location.href != location.href){
				
				var moduleUrlArr = location.href.split('?');
				var moduleArr = moduleUrlArr[0].split('/');
				var pageUrl = moduleArr[moduleArr.length-1];
				var pageName = pageUrl.replace('.php', '');
				pageName = (this.moduleName) ? this.moduleName : pageName;
				if(parent.parent.pageClose) 
					parent.parent.pageClose(pageName);
				else if(parent && parent.moduleClose) 
					parent.moduleClose(pageName);
			}else{
				window.close();
			}
		}
	}else{
		
		if(parent.location.href != location.href){
			var moduleUrlArr = location.href.split('?');
			var moduleArr = moduleUrlArr[0].split('/');
			var pageUrl = moduleArr[moduleArr.length-1];
			var pageName = pageUrl.replace('.php', '');
			pageName = pageName.replace('#', '');
			pageName = (this.moduleName) ? this.moduleName : pageName;
			if(parent.parent.pageClose) 
					parent.parent.pageClose(pageName);
			else if(parent && parent.moduleClose) 
				parent.moduleClose(pageName);
		}else{
			window.close();
		}
	}
}
function closeFrame(){
	var moduleObj = document.getElementById('submodule');
	if(moduleObj) {
		moduleObj.style.visibility = 'hidden';
	}
}
function fillForm(){
	var frmObj = document.forms[this.formName];
	
 	for(var i=0; i<frmObj.elements.length; i++){
 		var fieldObj = frmObj.elements[i];

 		fieldObj.orgObj = this;
 		switch(fieldObj.type) {
	 		case 'radio':
	 		case 'checkbox':
	 			var valueInDb = '';
	 			if(this.recId && this.dataArr != 'empty'){
		 			valueInDb = (this.dataArr[fieldObj.name]) ? this.dataArr[fieldObj.name][this.fillKey] : '';
	 			}

	 			fieldObj.orgValue = valueInDb;
				
	 			if(fieldObj.value == valueInDb) {
		 			fieldObj.checked = true;
		 			if(fieldObj.type == 'checkbox') {
	 					if(fieldObj.onclick) {
							if(!fieldObj.oldOnclick){
								fieldObj.oldOnclick = fieldObj.onclick;
							}
		 					fieldObj.onclick = function(e){
		 						this.orgObj.enableBtn('save');
		 						this.oldOnclick();
		 					};
			 			}else{
				 			fieldObj.onclick = function(e){
		 						this.orgObj.enableBtn('save');
		 					};
			 			}
		 			}
	 			}else{
		 			fieldObj.checked = false;
 					if(fieldObj.onclick) {
						if(!fieldObj.oldOnclick){
							fieldObj.oldOnclick = fieldObj.onclick;
						}
	 					fieldObj.onclick = function(e){
	 						this.orgObj.enableBtn('save');
	 						this.oldOnclick();
	 					};
		 			}else{
			 			fieldObj.onclick = function(e){
	 						this.orgObj.enableBtn('save');
	 					};
		 			}
	 			}
	 		break;
	 
	 		case 'button':
	 			switch(fieldObj.name) {
		 			case 'close':
		 			case 'exit':
		 				fieldObj.onclick = function(e) {
		 					this.orgObj.closeForm();
	 					}
	 				break;
	 				
	 				case 'new':
	 					fieldObj.onclick = function(e) {
		 					var frmObj = document.forms[this.orgObj.formName];	
		 					frmObj.elements['id'].value = 0;
		 					this.orgObj.resetForm();
		 					this.orgObj.recId = 0;
		 					eval(this.orgObj.gotoOnNew + '(this)');
	 					}
	 				break;
	 				
		 			case 'save':
		 			case 'submit':
		 				fieldObj.onclick = function(e) {
		 					this.orgObj.saveForm() ;
	 					}
	 				break;
	 			}
	 		case 'submit':
	 		break;
	 		
	 		case 'select':	 			
	 		case 'select-one':	 			
	 			var valueInDb = '';
	 			if(this.recId && this.dataArr != 'empty'){
		 			valueInDb = (this.dataArr[fieldObj.name]) ? this.dataArr[fieldObj.name][this.fillKey] : '';
	 			}
				fieldObj.orgValue = valueInDb;
				fieldObj.value = valueInDb;
				if(this.dataArr == 'empty'){
					fieldObj.selectedIndex = 0;
				}
				if(fieldObj.onchange) {
					if(!fieldObj.oldOnchange){
						fieldObj.oldOnchange = fieldObj.onchange;
					}
 					fieldObj.onchange = function(e){
 						this.orgObj.enableBtn('save');
 						this.oldOnchange();
 					};
	 			}else{
		 			fieldObj.onchange = function(e){
 						this.orgObj.enableBtn('save');
 					};
	 			}
	 		break;
	 		
	 		default:
	 			var valueInDb = '';
	 			if(this.recId && this.dataArr != 'empty'){
		 			valueInDb = (this.dataArr[fieldObj.name]) ? this.dataArr[fieldObj.name][this.fillKey] : '';
	 			}
				
				if(fieldObj.getAttribute('relateDiv') === null){
				}else{
					relObj = document.getElementById(fieldObj.getAttribute('relateDiv'));
					if(relObj){
						relObj.innerHTML = '';
						relObj.innerHTML = valueInDb;
					}
				}

				if(fieldObj.getAttribute('dateField') === null){
				}else{
					fieldObj.dateField = true;
					fieldObj.readOnly = true;
					fieldObj.id = this.formName + '_' + fieldObj.name;
					//valueInDb = (valueInDb == '0000-00-00') ? 'dd/mm/yyyy' : formatDate(valueInDb,'dd/mm/yyyy');
					valueInDb = formatDate(valueInDb,'dd/mm/yyyy');
					
					/*var calenderStr = 'Calendar.setup({ inputField:"';
					calenderStr += fieldObj.id + '", ifFormat:"%d/%m/%Y", showsTime:true,button:"';
					calenderStr += fieldObj.id + '",singleClick:true,step:1 })';
					eval(calenderStr);*/
				}
				if(fieldObj.getAttribute('dateTimeField') === null){
				}else{
					fieldObj.dateTimeField = true;
					fieldObj.readOnly = true;
					//valueInDb = (valueInDb == '0000-00-00 00:00:00') ? 'dd/mm/yyyy HH:MM:SS' : formatDate(valueInDb,'dd/mm/yyyy HH:MM:SS');
					valueInDb = formatDate(valueInDb,'dd/mm/yyyy HH:MM:SS');
					
					/*var calenderStr = 'Calendar.setup({ inputField:"';
					calenderStr += fieldObj.id + '", ifFormat:"%d/%m/%Y %H:%M:00", showsTime:true,button:"';
					calenderStr += fieldObj.id + '",singleClick:true,step:1 })';
					eval(calenderStr);*/
				}
				fieldObj.value = valueInDb;
				fieldObj.orgValue = valueInDb;
				
				if(typeof tinyMCE.get(fieldObj.name) == 'object'){
					tinyMCE.get(fieldObj.name).setContent(valueInDb);
					ed = tinyMCE.get(fieldObj.name);
					ed.orgObj = this;
					ed.onKeyDown.add(function(ed,e){
						this.orgObj.enableBtn('save');
					});
				}
				
	 			fieldObj.onkeyup = function(e) {
		 			if(this.value != this.orgValue) {
		 				this.orgObj.enableBtn('save');
		 			}
	 			}
	 			if(fieldObj.onblur) {
					if(!fieldObj.oldonblur){
						fieldObj.oldonblur = fieldObj.onblur;
					}
 					fieldObj.onblur = function(e){
 						this.orgObj.enableBtn('save');
 						this.oldonblur();
 					};
	 			}else {
	 				fieldObj.onblur = fieldObj.onkeyup;
 				}
	 		break;
 		} 		
 	}
 	this.disableBtn('save');
	if(this.gotoAfterLoad) {
		eval(this.gotoAfterLoad + '(this)');
	}
}
function resetForm(){
	
	var frmObj = document.forms[this.formName];	
	this.recId = '';

 	for(var i=0; i<frmObj.elements.length; i++){
 		var fieldObj = frmObj.elements[i];
 		fieldObj.orgValue = '';
 		switch(fieldObj.type) {
	 		case 'radio':
	 		case 'checkbox':
	 			fieldObj.checked = false;
	 		break;	 		
	 		case 'button':
	 		case 'submit':
	 		break;
	 		case 'select':
	 		case 'select-one':
				fieldObj.options.selectedIndex = 0;
	 		break;
	 		default:
				fieldObj.value = '';
				
				if(typeof tinyMCE.get(fieldObj.name) == 'object'){
					tinyMCE.get(fieldObj.name).setContent('');
				}
	 		break;
 		} 		
 	}
	if(this.gotoAfterLoad) {
		eval(this.gotoAfterLoad + '(this)');
	}
}
function saveForm(){
	if(this.checkBeforeSave){
		var chkSave = eval(this.checkBeforeSave + '(this)');
		if(!chkSave){
			return false;
		}
	}
	
	var frmObj = document.forms[this.formName];
	var idValue = document.forms[this.formName].elements['id'].value;
 	for(var i=0; i<frmObj.elements.length; i++){
 		var fieldObj = frmObj.elements[i];
 		fieldObj.orgObj = this;
 		fieldObj.orgValue = (!idValue) ? '' : fieldObj.orgValue;
 		switch(fieldObj.type) {
			case 'textarea':					
				if(typeof tinyMCE.get(fieldObj.name) == 'object'){					
					fieldObj.orgValue = tinyMCE.get(fieldObj.name).getContent();					
				}else{
					var fldValue = fieldObj.value;
					fieldObj.orgValue = fldValue;
				}
				this.formData[fieldObj.name] = fieldObj.orgValue;
				this.changedFields[this.changedFields.length] = fieldObj.name;
			break;
	 		case 'radio':
	 			if(fieldObj.checked){
	 				var fldValue = fieldObj.value;
	 				if(fieldObj.orgValue != fldValue){
			 			if(inArray(fieldObj.name,this.changedFields) < 0) {
			 				this.changedFields[this.changedFields.length] = fieldObj.name;
		 				}
	 				}
	 				this.formData[fieldObj.name] = fldValue;
	 				fieldObj.orgValue = fldValue;
 				}	 			
	 		break;
	 		case 'checkbox':
	 			var fldValue = 0;
	 			if(fieldObj.checked){
	 				fldValue = fieldObj.value;
 				}
		 		if(inArray(fieldObj.name,this.changedFields) < 0) {
		 			this.changedFields[this.changedFields.length] = fieldObj.name;
		 		}
	 			this.formData[fieldObj.name] = fldValue;
	 			fieldObj.orgValue = fldValue;
 	 		break;	
 	 		 		
	 		case 'button':
	 		case 'submit':
	 		break;
	 		
	 		case 'hidden':
	 			var fldValue = fieldObj.value;
	 			this.formData[fieldObj.name] = fieldObj.value;
	 			this.changedFields[this.changedFields.length] = fieldObj.name;
	 			fieldObj.orgValue = fldValue;
	 		break;
	 		
	 		default:
	 			var fldValue = fieldObj.value;
				if(fieldObj.dateField || fieldObj.dateTimeField){
		 			this.formData[fieldObj.name] = fieldObj.value;
	 				this.changedFields[this.changedFields.length] = fieldObj.name;
	 				if(fieldObj.dateField){
			 			var dbValArr = fieldObj.value.split('/');
	 					var dbVal = dbValArr[2] + '-' + dbValArr[1] + '-' + dbValArr[0];
	 					this.formData[fieldObj.name] = dbVal;
	 					var chk = validateDate(dbValArr[0],dbValArr[1],dbValArr[2]);
	 					if(!chk){
		 					fieldObj.value = fieldObj.orgValue;
		 					var dbValArr = fieldObj.orgValue.split('/');
	 						var dbVal = dbValArr[2] + '-' + dbValArr[1] + '-' + dbValArr[0];
		 					this.formData[fieldObj.name] = dbVal;
	 					}
		 			}
		 			if(fieldObj.dateTimeField){
			 			var dbDateTimeArr = fieldObj.value.split(' ');
			 			var timeStr = dbDateTimeArr[1];
			 			var dbValArr = dbDateTimeArr[0].split('/');
	 					var dbVal = dbValArr[2] + '-' + dbValArr[1] + '-' + dbValArr[0] + ' ' + timeStr;
	 					this.formData[fieldObj.name] = dbVal;
	 					var chk = validateDate(dbValArr[0],dbValArr[1],dbValArr[2]);
	 					if(!chk){
		 					fieldObj.value = fieldObj.orgValue;
		 					var dbValArr = fieldObj.orgValue.split('/');
	 						var dbVal = dbValArr[2] + '-' + dbValArr[1] + '-' + dbValArr[0] + ' ' + timeStr;
		 					this.formData[fieldObj.name] = dbVal;
	 					}
		 			}	
				}
	 			if(fieldObj.orgValue != fieldObj.value){
		 			if(inArray(fieldObj.name,this.changedFields) < 0) {
			 			this.changedFields[this.changedFields.length] = fieldObj.name;
			 			this.formData[fieldObj.name] = fieldObj.value;
			 			if(fieldObj.dateField){
				 			var dbValArr = fieldObj.value.split('/');
		 					var dbVal = dbValArr[2] + '-' + dbValArr[1] + '-' + dbValArr[0];
		 					this.formData[fieldObj.name] = dbVal;
		 					var chk = validateDate(dbValArr[0],dbValArr[1],dbValArr[2]);
		 					if(!chk){
			 					fieldObj.value = fieldObj.orgValue;
			 					var dbValArr = fieldObj.orgValue.split('/');
		 						var dbVal = dbValArr[2] + '-' + dbValArr[1] + '-' + dbValArr[0];
			 					this.formData[fieldObj.name] = dbVal;
		 					}
			 			}
			 			if(fieldObj.dateTimeField){
				 			var dbDateTimeArr = fieldObj.value.split(' ');
				 			var timeStr = dbDateTimeArr[1];
				 			var dbValArr = dbDateTimeArr[0].split('/');
		 					var dbVal = dbValArr[2] + '-' + dbValArr[1] + '-' + dbValArr[0];
		 					this.formData[fieldObj.name] = dbVal;
		 					var chk = validateDate(dbValArr[0],dbValArr[1],dbValArr[2]);
		 					if(!chk){
			 					fieldObj.value = fieldObj.orgValue;
			 					var dbValArr = fieldObj.orgValue.split('/');
		 						var dbVal = dbValArr[2] + '-' + dbValArr[1] + '-' + dbValArr[0] + ' ' + timeStr;
			 					this.formData[fieldObj.name] = dbVal;
		 					}
			 			}	
		 			}
	 			}
	 			fieldObj.orgValue = fldValue;
	 		break;
 		} 		
 	}
 	var fields = this.changedFields;
 	var totalFields = fields.length;
  	fields.join();
 	if(totalFields > 0) {
	 	var ajaxVar = new ajaxVars();
		ajaxVar.vars['action'] = 'update';
		ajaxVar.vars['table'] = this.formName;
		
		ajaxVar.fnVars['orgObj'] = this;
		ajaxVar.gotoFunction = 'afterSave';
		ajaxVar.dbVars = fields;
		var str = '';
		for(i=0; i<this.changedFields.length; i++){
			ajaxVar.vars[this.changedFields[i]] = this.formData[this.changedFields[i]];
			str += this.changedFields[i] + ' ' + this.formData[this.changedFields[i]] + "\n\n";
		}
		if(idValue){
			this.recId = idValue;
		}
		this.recId = parseInt(this.recId, 10);
		if(this.recId) {
			ajaxVar.vars['id'] = this.recId;
		}else{
			if(this.autoMax){
				ajaxVar.vars[this.autoMax] = 'db_function_if(max('+this.autoMax+') IS NULL, 0, max('+this.autoMax+') )+1';
				ajaxVar.vars['autoMax'] = this.autoMax;
			}
			if(this.maxCondition){
				ajaxVar.vars['maxCondition'] = this.maxCondition;
			}
		}
		ajaxVar.AjaxPostSQL();
	}else{
		this.disableBtn('save');
	}
}
function afterSave(dataArr, fnVars){
	var orgObj = fnVars['orgObj'];
	orgObj.disableBtn('save');
	orgObj.changedFields = new Array();
	orgObj.formData = new Array();
	if(!orgObj.recId) {
		document.forms[orgObj.formName].elements['id'].value = dataArr['id'][0];
	}
	if(orgObj.gotoFunction) {
		eval(orgObj.gotoFunction + '(dataArr, fnVars)');
	}
	if(orgObj.closeFlag === true){
		orgObj.editFlag = false;
		orgObj.closeForm();
	}
}
function disableAll(fldStr) {
	var noFields = new Array();
	if(fldStr){
		noFields = fldStr.split(',');
	}
	noFields[noFields.length] = 'close';
	var frmObj = document.forms[this.formName];	
	this.recId = '';
	for(var i=0; i<frmObj.elements.length; i++){
 		var fieldObj = document.forms[this.formName].elements[i];
 		if(noFields){
			var presentIndex = this.inArray(fieldObj.name, noFields);
			if(presentIndex < 0){
	 			fieldObj.disabled = true;
 			}else{
 	 			fieldObj.disabled = false;
			}
		}
	}
}
function enableAll() {
	var frmObj = document.forms[this.formName];	
 	for(var i=0; i<frmObj.elements.length; i++){
 		frmObj.elements[i].disabled = false;
	}
}
