
var isIE = document.all ? true : false;

var DynFormsDefaults = {
	IsReqColor: "#99ccff"
}

//Initialize DynForms
AddEvent(window, "load", function() 
{
	var divs = document.getElementsByTagName("DIV");
	for(var i = 0; i < divs.length; i++)
		if(divs[i].className.match(/\bDynForm\b/))
			InitializeDynForm(divs[i]);
});



function SubmitDynForm(e)
{
	var src = e.target || e.srcElement;	
	
	var dynForm = GetDynFormFromChild(src);
    
	if(dynForm.IsReqFieldsEmpty())
		return;

	var xmsg = new XmlMessage("SubmitDynForm");	
	xmsg.AddParam("FormID", dynForm.FormID);
	for(var i = 0; i < dynForm.InputFields.length; i++)
		dynForm.InputFields[i].AddXmlParams(xmsg);
	xmsg.SendAndReceive();	
	if(!xmsg.IsResponseReceived())
		return;
	
	dynForm.innerHTML = '<span class="DynResult">' + xmsg.GetResponse("Result") + '</span>';
	
}

function GetDynFormFromChild(childCtr)
{

	var dynForm = childCtr;
	
	while(dynForm != null &&
	      dynForm.nodeName != "HTML" &&
	      dynForm.nodeName != "BODY" &&
	      !(dynForm.nodeName == "DIV" && IsOfClass(dynForm, "DynForm")))
	         dynForm = dynForm.parentNode;

	if(dynForm == null || dynForm.nodeName == "HTML" || dynForm.nodeName == "BODY") 
	{
		alert("Hata olustu. DynForm bulunamiyor.");
		return;
	}

	if(!dynForm.IsInitialized){
		InitializeDynForm(dynForm);}
	return dynForm;
}

//dynForm'a gerekli property'leri ve function'lari atar
function InitializeDynForm(dynForm)
{
	//FormID
	dynForm.FormID = dynForm.id.slice(8);
	
	//ReqField
	var reqFields = dynForm.firstChild;
	while(reqFields != null && !(IsHdnFld(reqFields) && reqFields.id.indexOf("DynReqs") == 0))
		reqFields = reqFields.nextSibling;

	if(reqFields != null)
		reqFields = reqFields.value;
	else
		reqFields = "";


	//InputFields
	var fields = dynForm.getElementsByTagName("div");
	dynForm.InputFields = Array();
	dynForm.ReqFields = Array();
	
	for(var i = 0; i < fields.length; i++)
	{
		if(fields[i].className.indexOf("InputField") == -1)
			continue;
		
		dynForm.InputFields[dynForm.InputFields.length] = fields[i];
		
		InitializeDynField(fields[i], reqFields);
		
		if(fields[i].IsReq)
			dynForm.ReqFields[dynForm.ReqFields.length] = fields[i];
	}

	//IsReqFieldsEmpty
	dynForm.IsReqFieldsEmpty = function() {
		var ret = false;
		for(var i = 0; i < this.ReqFields.length; i++)
		{
			if(this.ReqFields[i].IsEmpty())
			{
				ret = true;
				this.ReqFields[i].MarkAsReq();
			}
		}
		return ret;
	}

	//IsInitialized
	dynForm.IsInitialized = true;
}

//DynInputField'larin gerekli property ve function'larini atar
function InitializeDynField(fld, reqFields)
{	
	//IsReq
	var regex = new RegExp("" + fld.id + "");
	fld.IsReq = (regex.exec(reqFields) != null);

	//FieldType
	var hdnFieldType = fld.firstChild;
	while(hdnFieldType != null && !(IsHdnFld(hdnFieldType) && hdnFieldType.id.match(/DynFieldType$/) != null))
		hdnFieldType = hdnFieldType.nextSibling;

	if(hdnFieldType == null)
		throw "DynInputField'larin FieldType'ini tutan bir hidden alani olmasi gerekir. Field ID: " + fld.id;

	fld.FieldType = hdnFieldType.value;
	switch(fld.FieldType)
	{
		case "DynTextBox":
			InitializeDynTextBox(fld);
			break;
		
		case "DynTextAreaBox":
			InitializeDynTextAreaBox(fld);
			break;

		case "DynDropDown":
			InitializeDynDropDown(fld);
			break;

		case "DynSwitch":
			InitializeDynSwitch(fld);
			break;

		case "DynRadio":
			InitializeDynRadio(fld);
			break;
		
		case "DynDateBox":
			InitializeDynDateBox(fld);
			break;

		default:
			throw "Bilinmeyen DynFieldType. Type: " + fld.FieldType;
	}
}
function InitializeDynTextAreaBox(fld)
{
	
	//FieldType
	fld.FieldType = "DynTextAreaBox";
 
	//TextBox
	var inpts = fld.getElementsByTagName("textarea");

	for(var i = 0; i < inpts.length; i++)
	{       
	       fld.TextBox = inpts[i];	
			break;
	}
	//DynField
	fld.TextBox.DynField = fld;
	//Format
	var hdnFormat = fld.firstChild;
	while(hdnFormat != null && !(IsHdnFld(hdnFormat) && hdnFormat.id.match(/DynFieldFormat$/) != null))
		hdnFormat = hdnFormat.nextSibling;
	if(hdnFormat == null)
		throw fld.id + " DynField'inin format bilgisi bulunamadi";
	fld.Format = hdnFormat.value;

	//FormatEx
	var formatEx = fld.firstChild;
	while(formatEx != null && !IsOfClass(formatEx, "DynFieldFormatEx"))
		formatEx = formatEx.nextSibling;
	fld.FormatEx = formatEx;

	InitDynFormatEvents(fld);

	//GetValue
	fld.GetValue = function() {
		return this.TextBox.value;
	};

	//IsEmpty
	fld.IsEmpty = function() {
		return this.GetValue() == "";
	};

	//AddXmlParams
	fld.AddXmlParams = function(xmsg) {
		xmsg.AddParam(this.TextBox.id, this.TextBox.value)
	};

	//MarkAsReq
	fld.MarkAsReq = function() {
		this.TextBox.style.backgroundColor = DynFormsDefaults.IsReqColor;
		AddEvent(this.TextBox, "focus", function(e) {
			var ctr = e && e.target ? e.target : event.srcElement;
			ctr.style.backgroundColor = "";
		});
	}

	//DisplayFormatExample
	fld.DisplayFormatExample = function() {
		if(this.FormatEx.innerHTML != "")
			this.FormatEx.style.visibility = "visible";
	}	
}

function InitializeDynTextBox(fld)
{
	
	//FieldType
	fld.FieldType = "DynTextBox";
  
	//TextBox
	var inpts = fld.getElementsByTagName("INPUT");
	for(var i = 0; i < inpts.length; i++)
		if(inpts[i].type == "text") {
			fld.TextBox = inpts[i];	
			break;
		}
 
	//DynField
	fld.TextBox.DynField = fld;

	//Format
	var hdnFormat = fld.firstChild;
	while(hdnFormat != null && !(IsHdnFld(hdnFormat) && hdnFormat.id.match(/DynFieldFormat$/) != null))
		hdnFormat = hdnFormat.nextSibling;
	if(hdnFormat == null)
		throw fld.id + " DynField'inin format bilgisi bulunamadi";
	fld.Format = hdnFormat.value;

	//FormatEx
	var formatEx = fld.firstChild;
	while(formatEx != null && !IsOfClass(formatEx, "DynFieldFormatEx"))
		formatEx = formatEx.nextSibling;
	fld.FormatEx = formatEx;

	InitDynFormatEvents(fld);

	//GetValue
	fld.GetValue = function() {
		return this.TextBox.value;
	};

	//IsEmpty
	fld.IsEmpty = function() {
		return this.GetValue() == "";
	};

	//AddXmlParams
	fld.AddXmlParams = function(xmsg) {
		xmsg.AddParam(this.TextBox.id, this.TextBox.value)
	};

	//MarkAsReq
	fld.MarkAsReq = function() {
		this.TextBox.style.backgroundColor = DynFormsDefaults.IsReqColor;
		AddEvent(this.TextBox, "focus", function(e) {
			var ctr = e && e.target ? e.target : event.srcElement;
			ctr.style.backgroundColor = "";
		});
	}

	//DisplayFormatExample
	fld.DisplayFormatExample = function() {
		if(this.FormatEx.innerHTML != "")
			this.FormatEx.style.visibility = "visible";
	}	
}
function InitializeDynDropDown(fld)
{
	//FieldType
	fld.FieldType = "DynDropDown";
	
	//SelectBox
	fld.SelectBox = fld.getElementsByTagName("SELECT")[0];	
	
	//GetValue    
	fld.GetValue = function() {
		return this.SelectBox[this.SelectBox.selectedIndex].value;
	};
	
	//IsEmpty
	fld.IsEmpty = function() {
		return this.GetValue() == "";
	};
	
	//AddXmlParams
	fld.AddXmlParams = function(xmsg) {
		xmsg.AddParam(this.SelectBox.id, this.GetValue())
	};
	
	//MarkAsReq
	fld.MarkAsReq = function() {
		this.SelectBox.style.backgroundColor = DynFormsDefaults.IsReqColor;
		AddEvent(this.SelectBox, "focus", function(e) {
			var ctr = e && e.target ? e.target : event.srcElement;
			ctr.style.backgroundColor = "";
		});
	}
}

function InitializeDynSwitch(fld)
{
	//FieldType
	fld.FieldType = "DynSwitch";	
	
	//CheckBoxs
	fld.CheckBoxs = new Array();
	var inpts = fld.getElementsByTagName("INPUT");
	for(var i = 0; i < inpts.length; i++)
		if(inpts[i].type == "checkbox")
			fld.CheckBoxs[fld.CheckBoxs.length] = inpts[i];
	
	//GetValue    
	fld.GetValue = function() {
		var ret = "";
		for(var i = 0; this.CheckBoxs.length; i++)
			ret = this.CheckBoxs[i].checked ? "|" + this.CheckBoxs[i].id : "";
		ret = ret.length != 0 ? ret.slice(0) : "";
		
		return ret;
	};
	
	//IsEmpty
	fld.IsEmpty = function() {
		return false;
	};
	
	//AddXmlParams
	fld.AddXmlParams = function(xmsg) { 
		for(var i = 0; i < this.CheckBoxs.length; i++){
			xmsg.AddParam(this.CheckBoxs[i].id, this.CheckBoxs[i].checked);
		}
	};
	
	//MarkAsReq
	fld.MarkAsReq = function() {
	};
}

function InitializeDynRadio(fld)
{
	//FieldType
	fld.FieldType = "DynRadio";	
	
	//RadioBtns
	fld.RadioBtns = new Array();
	var inpts = fld.getElementsByTagName("INPUT");
	for(var i = 0; i < inpts.length; i++)
		if(inpts[i].type == "radio")
			fld.RadioBtns[fld.RadioBtns.length] = inpts[i];
	
	//GetValue    
	fld.GetValue = function() {
		for(var i = 0; i < this.RadioBtns.length; i++)
			if(this.RadioBtns[i].checked)
				return this.RadioBtns[i].id;
		
		return "";
	};
	
	//IsEmpty
	fld.IsEmpty = function() {
		return fld.GetValue() == "";
	};
	
	//AddXmlParams
	fld.AddXmlParams = function(xmsg) { 
		for(var i = 0; i < this.RadioBtns.length; i++)
			if(this.RadioBtns[i].checked)
			{
				xmsg.AddParam(this.RadioBtns[i].id, this.RadioBtns[i].checked);
				break;
			}
	};
	
	//MarkAsReq
	fld.MarkAsReq = function() {
	};
}

function InitializeDynDateBox(fld)
{
	//FieldType
	fld.FieldType = "DynRadio";	
	
	//DateBox
	var inpts = fld.getElementsByTagName("INPUT");
	for(var i = 0; i < inpts.length; i++)
		if(inpts[i].type == "text") {
			fld.DateBox = inpts[i];	
			break;
		}

	//DynField
	fld.DateBox.DynField = fld;

	//Format
	var hdnFormat = fld.firstChild;
	while(hdnFormat != null && !(IsHdnFld(hdnFormat) && hdnFormat.id.match(/DynFieldFormat$/) != null))
		hdnFormat = hdnFormat.nextSibling;
	if(hdnFormat == null)
		throw fld.id + " DynField'inin format bilgisi bulunamadi";
	fld.Format = hdnFormat.value;

	InitDynFormatEvents(fld);
	
	//FormatEx
	var formatEx = fld.firstChild;
	while(formatEx != null && !IsOfClass(formatEx, "DynFieldFormatEx"))
		formatEx = formatEx.nextSibling;
	fld.FormatEx = formatEx;

	InitDynFormatEvents(fld);

	//GetValue
	fld.GetValue = function() {
		return this.DateBox.value;
	};

	//IsEmpty
	fld.IsEmpty = function() {
		return this.GetValue() == "";
	};

	//AddXmlParams
	fld.AddXmlParams = function(xmsg) {
		xmsg.AddParam(this.DateBox.id, this.DateBox.value)
	};

	//MarkAsReq
	fld.MarkAsReq = function() {
		this.DateBox.style.backgroundColor = DynFormsDefaults.IsReqColor;
		AddEvent(this.DateBox, "focus", function(e) {
			var ctr = e && e.target ? e.target : event.srcElement;
			ctr.style.backgroundColor = "";
		});
	}

	//DisplayFormatExample
	fld.DisplayFormatExample = function() {
		if(this.FormatEx.innerHTML != "")
			this.FormatEx.style.visibility = "visible";
	}	
}

function InitDynFormatEvents(fld)
{
	if(fld.Format == "")
		return;
	
	//Regex	
	if(fld.Format.match(/^regex/))
		AddEvent(fld.TextBox, "blur", function(e) 
		{
			var regdata = /^regex:\/(.*)\/([img]*)$/.exec(fld.Format);			
			var re = new RegExp(regdata[1], regdata[2]);
			var txtbox = (e && e.target) ? e.target : event.srcElement;
			if(!txtbox.value.match(re))
			{
				txtbox.DynField.DisplayFormatExample();
				alert("Format error");
				txtbox.value = "";
			}
		});
	
	//FreeFormat
	else if(fld.Format.slice(0, 1) == "#")
	{
		fld.TextBox.FreeFormat = fld.Format.slice(1);
		//blur
		AddEvent(fld.TextBox, "blur", CheckFreeFormat);
		
		//browser'ina gore keypress ve keydown
		if(isIE)
			fld.TextBox.onkeypress = MaskFreeFormat;
		else
			fld.TextBox.setAttribute("onkeypress", "return MaskFreeFormat(event)")
	}
	
	//Predefined
	else
	{
		switch(fld.Format)
		{
			case "unit":
				AddEvent(fld.TextBox, "blur", CheckUnit);
				if(isIE)
					fld.TextBox.onkeypress = MaskUnit;
				else
					fld.TextBox.setAttribute("onkeypress", "return MaskUnit(event)");				
				break;
		
			case "numeric":
				break;
			
			case "email":
				AddEvent(fld.TextBox, "blur", CheckMailFormat);
				if(isIE)
					fld.TextBox.onkeypress = MaskMail;
				else
					fld.TextBox.setAttribute("onkeypress", "return MaskMail(event)");
				break;
			
			case "date":
				AddEvent(fld.DateBox, "blur", CheckDateFormat);
				break;
				
			default:
				throw fld.Format + " tipinde bir DynInputField formati bulunmamaktadir.";
		}
	}
}

function CheckFreeFormat(e)
{
	var txtbox = (e && e.target) ? e.target : event.srcElement;
	if(!IsMatchForFreeFormat(txtbox.value, txtbox.FreeFormat))
	{
		txtbox.DynField.DisplayFormatExample();
		alert("Format error");
		txtbox.value = "";
	}
}

function IsMatchForFreeFormat(value, format)
{
	if(value == "")
		return true;
	
	if(value.length > format.length)
		return false;
	
	for(var i = 0; i < value.length; i++)
	{
		switch(format.charAt(i))
		{
			case 'X':
				continue;
			
			case '!':
				if(!value.charAt(i).match(/[A-Z]/))
					return false;
				continue;
			
			case '9':
				if(!value.charAt(i).match(/\d/))
					return false;
				continue;
			
			default:
				if(format.charAt(i) != value.charAt(i))
					return false;
				break;
		}
	}
	
	return true;
}

function MaskFreeFormat(e)
{
	if(!isIE && e.charCode == 0)
		return;
		
	var format = isIE ? event.srcElement.FreeFormat : e.target.FreeFormat;
	
	return AdjustFormatExampleAndReturnResult(IsMatchForFreeFormat(GetAfterKeyPressValue(e), format), e);
}

function CheckMailFormat(e)
{
	var txtbox = e && e.target ? e.target : e.srcElement;
	
	if(txtbox.value == "")
		return;
	
	if(!IsEmail(txtbox.value))
	{
		txtbox.DynField.DisplayFormatExample();
		alert("Girilen deger email adresi olmalidir.")
		txtbox.value = "";
	}
}

function MaskMail(e)
{
	if(!isIE && e.charCode == 0)
		return;
		
	var sreg = "(?:^\\w+$)|" +
				"(?:^\\w+([-+.]\\w+)*[-+.]?$)|" + 
				"(?:^\\w+([-+.]\\w+)*@$)|" + 
				"(?:^\\w+([-+.]\\w+)*@\\w+$)|" + 
				"(?:^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*[-.]$)|" + 
				"(?:^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.$)|" + 
				"(?:^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+$)|" + 
				"(?:^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*[-.]$)";
	var re = new RegExp(sreg, "i");
		
	return AdjustFormatExampleAndReturnResult(GetAfterKeyPressValue(e).match(re) != null, e);
}

function CheckUnit(e)
{
	var txtbox = e && e.target ? e.target : e.srcElement;
	
	if(txtbox.value == "")
		return;
	
	if(!txtbox.value.match(/^-?\d+$/))
	{
		txtbox.DynField.DisplayFormatExample();
		alert("Format error");
		txtbox.value = "";
	}
}
function MaskUnit(e)
{
	if(!isIE && e.charCode == 0)
		return;

	return AdjustFormatExampleAndReturnResult(GetAfterKeyPressValue(e).match(/^-?\d*$/) != null, e);
}

function CheckDateFormat(e)
{
	var datebox = e && e.target ? e.target : e.srcElement;
	
	if(datebox.value == "")
		return;
	
	if(!IsUserFormattedDate(datebox.value))
	{
		datebox.DynField.DisplayFormatExample();
		alert("Format error");
		datebox.value = "";
	}
}

function GetAfterKeyPressValue(e)
{
	if(isIE)
	{
		var sel = document.selection.createRange();
		var range = sel.text.length;
		sel.moveStart("character", -100);
		var startIndex = sel.text.length - range;
		var endIndex = sel.text.length;

		return event.srcElement.value.slice(0, startIndex) + 
				String.fromCharCode(event.keyCode) +
				event.srcElement.value.slice(endIndex, event.srcElement.value.length);			
	}
	else
	{
		if(e.charCode == 0)
			throw "GetAfterKeyPressValue alphanumeric key eventleri icin cagrilmalidir";
		
		return e.target.value.slice(0, e.target.selectionStart) + 
				String.fromCharCode(e.charCode) + 
				e.target.value.slice(e.target.selectionEnd, e.target.value.length);		
	}
}

function AdjustFormatExampleAndReturnResult(isOK, e)
{
	if(!isOK)
	{
		if(e && e.target)
			e.target.DynField.DisplayFormatExample();
		else
			event.srcElement.DynField.DisplayFormatExample();
	}
	
	return isOK;
}

function IsOfClass(ctr, className)
{
	var re = new RegExp("\\b" + className + "\\b");
	return ctr != null && ctr.nodeType == 1 && ctr.className.match(re);
}

//----------------------------------------------------------------------------------------------
//Asagidaki methodelar Gor.js'de var

function AddEvent(ctr, evt, lis)
{
	if(isIE)
		ctr.attachEvent("on" + evt, lis);
	else
		ctr.addEventListener(evt, lis, false);
}

//Gor.js'de bu function'in adi CheckDateMask. Asagidaki isim daha cok uydugu icin degistirildi.
function IsUserFormattedDate(dateValue)
{
	if(dateValue.length < User.DateFormat.length)
		return false;
	
	var f = new DateFormat(User.DateFormat);
	return f.Check(dateValue);
}







