﻿
//************************ VirtualForm BEGINS ***************************//
//************************ VirtualForm BEGINS ***************************//
//************************ VirtualForm BEGINS ***************************//
// Dependent to: getInputTextValue type methods.

function submitVirtualForm(formId, formMethod, formAction)
{        
    submitVirtualFormGeneric(formId, formMethod, formAction, false, null, null, null);
}

function submitVirtualFormToPopup(formId, formMethod, formAction, width, height, popupTitle)
{
    submitVirtualFormGeneric(formId, formMethod, formAction, true, width, height, popupTitle);
}

function submitVirtualFormGeneric(formId, formMethod, formAction, toPopup, width, height, popupTitle)
{   
    var newWindow = null;
    var formToBeSubmitted = document.createElement("form");
    
    formToBeSubmitted.id = formId;
    formToBeSubmitted.method = formMethod; 
    formToBeSubmitted.action = formAction;
    formToBeSubmitted.style.display = "none";
    formToBeSubmitted.style.visiblity = "hidden";
    
    //alert("Gelen formAction: " + formAction + "\n\n formToBeSubmitted.action: " + formToBeSubmitted.action);
    
    var realElements = GetbyAttr("virtualFormId");
    var i;
    for(i = 0; i < realElements.length; i++)
    {
        var realElement = realElements[i];
        if(realElement.getAttribute("virtualFormId") != formId) continue;
        
        var hiddens = extractNameValueHiddens(realElements[i]);
        var j = 0;
        for(j = 0; j < hiddens.length; j++)
        {
            formToBeSubmitted.appendChild(hiddens[j]);   
        }
    }
    
    if (toPopup)
    {
        var newWindowParams = "toolbar=0, menubar=0, scrollbars=1, resizable=0, location=0";
        if(width) newWindowParams += ",width=" + width;
        if(height) newWindowParams += ",height=" + height;
        newWindow = window.open("", "raporSonucPopup", newWindowParams);
        if(popupTitle != undefined && popupTitle != null && popupTitle == "")
        {
            newWindow.document.title = popupTitle;
        }
        formToBeSubmitted.target = "raporSonucPopup";
    }

    document.body.appendChild(formToBeSubmitted);
    //alert("Gelen formAction: " + formAction + "\n\n formToBeSubmitted.action: " + formToBeSubmitted.action);
    formToBeSubmitted.submit();
    
    return false;
}
    
function GetbyAttr ( name, tag ) {
    var results = new Array();
    var elems = document.getElementsByTagName("*");
    var len = elems.length;

    if (name == "class") {
        for (var i = 0; i < len; i++) {
            if (elems[i].className) {                  
                results.push(elems[i]);
            }
        }
        return results;
    } else if (name == "for" && document.all) {
        name = "htmlFor";
    }

    for (var i = 0; i < len; i++) {
        if (elems[i].getAttribute(name)) {
            results.push(elems[i]);
        }
    }
    return results;
}
    
function extractNameValueHiddens(control)
{
    var nameValueHiddens = null;
    var controlValue = null, controlName = null;

    if(control.nodeName)
    {
        switch(control.nodeName)
        {
            case "INPUT" :
                controlName = control.name;
                if(control.getAttribute("type"))
                {
                    switch(control.getAttribute("type"))
                    {
                        case "text" :
                        case "password" :
                        case "hidden" :
                            controlValue = getInputTextValue(control);
                            break;
                        case "radio" :
                            controlValue = getInputRadioValue(control);
                            break;
                        case "checkbox" :
                            controlValue = getInputCheckboxValue(control);
                            break;
                        case "file" :
							controlValue = getInputFileValue(control);
                            break;
                    }
                }
                break;
            case "SELECT" :
                controlName = control.name;
				controlValue = getSelectOptionValue(control);
                break;
            case "TEXTAREA" :
                controlName = control.name;
				controlValue = getTextAreaValue(control);
                break;
            default : // radio/chkbox container
				nameValueHiddens = getContainerNameValuesInHiddenArray(control);
                break;
        }
    } 
    
    
    if(nameValueHiddens == null)
    {
        nameValueHiddens = new Array();
        if(controlName != null && controlValue != null && controlValue != false && controlValue != "undefined")
            nameValueHiddens[0] = createHiddenInput(controlName, controlValue); 
    }
    
    
    return nameValueHiddens;
}

// Verilen name/value ya sahip bir "input type=hidden" döndürür
function createHiddenInput(name, value, documentToBeCreatedOn)
{
    var hidden = document.createElement("input");
    hidden.type = "hidden";
    // DEBUG //hidden.type = "text";
    hidden.name = name;
    hidden.value = value;
    hidden.style.display = "none";
    hidden.style.visibility = "hidden";
    return hidden;
}

// Radio/Checkbox list gibi elementleri içeren bir konteynir kontrol alarak, 
//içindeki radio veya checkboxlardan ilk seçili olanin degerini döndürür.
function getContainerNameValuesInHiddenArray(control, documentToBeCreatedOn)
{
    var nameValueHiddens = new Array();

	if(control.childNodes && control.childNodes.length > 0)
	{
		var i, j = 0;
		for(i = 0; i < control.childNodes.length; i++)
		{
			if(control.childNodes[i].nodeName == "INPUT" && (control.childNodes[i].getAttribute("type") == "radio" || control.childNodes[i].getAttribute("type") == "checkbox"))
			{
				if(control.childNodes[i].checked) 
				{
				    nameValueHiddens[j] = createHiddenInput(control.childNodes[i].name, control.childNodes[i].value);
				    j++;
				}
			}	
		}
	}
	return nameValueHiddens;
} 

// Dependent to: getInputTextValue type methods.
//************************ VirtualForm ENDS ***************************//
//************************ VirtualForm ENDS ***************************//
//************************ VirtualForm ENDS ***************************//


String.prototype.trim = function()
{
    a = this.replace(/^\s+/, '');
    return a.replace(/\s+$/, '');
};

// validateFormSubmit --> traverseAndCheckControls
// traverseAndCheckControls --> validateControl
// traverseAndCheckControls --> traverseAndCheckControls
// validateControl --> ...

// Verilen "form" elmentinin submit edilip edilmemesi gerektigini true/false düöndürerek belirtir.
function validateFormSubmit(form)
{
    var i;
    var isValid = true;
    for(i = 0; i < form.childNodes.length; i++)
    {
        if(!traverseAndCheckControls(form.childNodes[i])) 
        {
            isValid = false; 
            break;
        }
    }
    return isValid;
}

// Verilem herhangi bir element ve alt elementlerini dolasarak, "validationId" attribute'una sahip olanlarda validasyon islemleri gerçeklestirir.
function traverseAndCheckControls(control)
{
	// Eger getAttribute metodu mevcutsa ve "validationId" attribute u varsa
//	var name = "";
//	if(control.name != null) name = control.name;
//	alert(control.nodeName + "\n" + name);
	
    if(control.getAttribute != null)
        if(control.getAttribute("validationId"))
		    // Control'ü rutinlerimize sokup valide ederiz
            if(!validateControl(control, control.getAttribute("validationId")))
			    // patlarsa form submit etmez
			    return false;

    var i;
    for(i = 0; i < control.childNodes.length; i++)
		// recursive olarak child nodelarda kontrol edilir
        if(!traverseAndCheckControls(control.childNodes[i])) 
			return false;
	
	// bu asamaya kadar sorun olmamissa, sessizce submit islemi gerçeklestirilir (metodu çagiran tarafindan)
	return true;
}

/*

validationType	 ValidationJavaScriptFunction
--------------   ----------------------------
1                isNotEmptyNumeric
2                isNotEmptyMoney
3                isNotEmptyDecimal
4                isNotEmptyDateTime
5                isNotEmpty
6                isNumeric
7                isMoney
8                isDecimal
9                isDateTime
10               isEMail
11               isNotEmptyEMail

*/

// Verilen element için, verilen validationType göre validasyon islemleri yapar
function validateControl(control, validationType)
{
	// Gönderilen kontrol için validasyon tipine göre ilgili validasyon metodunu çagirarak uyari mesaji üretilir.
	var warningMessage = "";
	var result;
    switch(parseInt(validationType))
    {
        case 1 :
            result = isNotEmptyNumeric(control);
			break;
		case 2 :
			result = isNotEmptyMoney(control);
			break;
		case 3 :
			result = isNotEmptyDecimal(control);
			break;
		case 4 :
			result = isNotEmptyDateTime(control);
			break;
		case 5 :
			result = isNotEmpty(control);
			break;
		case 6 :
			result = isNumeric(control);
			break;
		case 7 :
			result = isMoney(control);
			break;
		case 8 :
			result = isDecimal(control);
			break;
		case 9 :
			result = isDateTime(control);
			break;
		case 10 :
			result = isEMail(control);
			break;
		case 11 :
			result = isNotEmptyEMail(control);
			break;
        	default:
            		result = "";
            		break;
    }
	// Uyari mesajini kontrol ederiz
	if(result != "")
	{
	    // Gelen Mesajı kullanıcıya gösterme ve return false;
	    alert(result);
		return false;
	}
	else
	{
		return true;
	}
}


function isNotEmptyNumeric(control)
{	
	var controlsValue = extractValue(control);
	var controlsLabel = getControlsLabelText(control);
	if(!controlsValue)
	{
		if(controlsLabel)
			return controlsLabel + bosbirakilamaz;
		else
			return bosbirakilamaz;
	}
	if(CheckDecimal(controlsValue) == false)
    {
        if(controlsLabel)
            return controlsLabel + alanisayisalolmali;
        else
            return sayisalalanolmali;
    }
    return ""; // Başarılı geçme durumu
}
function isNotEmptyMoney(control)
{
	// TODO:
	return ""; // Başarılı geçme durumu
}
function isNotEmptyDecimal(control)
{
	// TODO:
	return ""; // Başarılı geçme durumu
}
function isNotEmptyDateTime(control)
{
	// TODO:
	return ""; // Başarılı geçme durumu
}
function isNotEmpty(control)
{
	var controlsValue = extractValue(control); 
    var controlsLabel = getControlsLabelText(control);
	if(controlsValue == false)
	{
		if(controlsLabel)
			return controlsLabel + bosbirakilamaz;
		else
			return bosbirakilamaz;
	}
	return ""; // Başarılı geçme durumu
}
function isNumeric(control)
{
    var controlsValue = extractValue(control); 
    var controlsLabel = getControlsLabelText(control);
    if(!controlsValue)
        return "";
    else if(IsNumericWithOnlyNumberAllowNull(controlsValue) == false)
    {
        if(controlsLabel)
            return controlsLabel + alanisayisalolmali;
        else
            return sayisalalanolmali;
    }
    return ""; // Başarılı geçme durumu
}
function isMoney(control)
{
    // return "Para değil"; // Başarısız geçme durumu
   return isNumeric(control);
   //return ""; // Başarılı geçme durumu
}
function isDecimal(control)
{
    // return "Para değil"; // Başarısız geçme durumu
    return ""; // Başarılı geçme durumu
}
function isDateTime(control)
{
    // return "Para değil"; // Başarısız geçme durumu
    return ""; // Başarılı geçme durumu
}
function isEMail(control)
{
    // return "Para değil"; // Başarısız geçme durumu
    return ""; // Başarılı geçme durumu
}
function isNotEmptyEMail(control)
{
    var controlsValue = extractValue(control); 
    var controlsLabel = getControlsLabelText(control);
    if(controlsValue == false)
    {
        if(controlsLabel)
            return controlsLabel + bosbirakilamaz;
        else
            return bosbirakilamaz;       
    }
    if(CheckEmail(controlsValue) == false)
    {
        if(controlsLabel)
            return controlsLabel + formatihatali;
        else
            return epostaformatihatali;
    }
    return ""; // Başarılı geçme durumu
}
function IsNumericWithOnlyNumberAllowNull(val)
{

strString = val
if(strString.trim() == "")
return true;
var strValidChars = "0123456789";
var strChar;
var blnResult = true;

if (strString.length == 0) return false;


    for (i = 0; i < strString.length && blnResult == true; i++)
    {
        strChar = strString.charAt(i);
        if (strValidChars.indexOf(strChar) == -1)
        {
            blnResult = false;
            return blnResult;

        }
    }
    return true;
}

//Özel sadece sub olarak kullanılan metotlar
////////////////////////////////////////////////////////////////////
function RegExTest(element,expression)
{
    return element.match(expression) != null;
}

function CheckEmail(elementvalue)
{
    var emailRE = "([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})";
    return RegExTest(elementvalue, emailRE);
}

function CheckDecimal(elementvalue)
{
    var decimalRE = "^(\\+|-)?[0-9][0-9]*(\\.[0-9]*)?$";
    return RegExTest(elementvalue,decimalRE);
}

function IsValidNonNegDecimal(elementvalue)
{
    var nonnegdecimalRE = "^[0-9][0-9]*(\\.[0-9]*)?$";
    return RegExTest(elementvalue,nonnegdecimalRE);
}
/*******************************************************/
/*                                                     */
/*                     CUSTOM FORMAT                   */
/*               (onkeydown'a atanabilir)              */
/*                                                     */
/*******************************************************/


// 3 numerik hanede bir . yerleştirir
function FormatNum(thisis,dig) 
{	
	var tempstr, newstr, str;
	var commapos, aftercomma;
	str = thisis.value;
	str = StrToMoney(str);	
	var mantissa = new String();	
	var tmp = new String();
	tmp = str;			
	if (tmp.indexOf(",",0)>0) {
		str = tmp.substring(0,tmp.indexOf(",",0))
		mantissa = tmp.substring(tmp.indexOf(",",0),tmp.length)
	}

	var output
	commapos=str.indexOf(";");
	if (commapos>=0) {
		aftercomma=str.substr(commapos);
		str=str.substr(0,commapos);
	}
	else aftercomma="";
	if (mantissa.length>dig)
	{
	    mantissa=mantissa.substring(0,dig+1);
	}
	if (str.length > 3) {
		tempstr=str;
		newstr="";
		while (tempstr.length>3)
		{
			newstr="."+tempstr.substr(tempstr.length-3)+newstr; 
			tempstr=tempstr.substr(0,tempstr.length-3);
		}		
		output = tempstr+newstr+aftercomma;
		if (mantissa.length>0) output+= mantissa;
		thisis.value = output;
	}
	else
	{
		str		= str.replace('.','');
		output	= str;
		if (mantissa.length>0) output+= mantissa;
		thisis.value = output;
	}
	return true;
}
function StrToMoney(currency) 
{	
	var num = new String();
	num = currency;
	while (num.indexOf('.',0)>0) {
		num = num.replace('.','');
	}
	return num;
}
function validateDecimalBox()
{
    if (!((event.keyCode>=48 && event.keyCode<=57) || (event.keyCode>=96 && event.keyCode<=105) ||event.keyCode == 44  || event.keyCode != 8 || event.keyCode != 9 || event.keyCode != 46 ))
	{
		return false;
	}
	return true;
}
function validateMoney(obj)
{
    var isnum = validateDecimalBox();
    if(isnum == false)
        return false;
     FormatNum(obj);
}
////////////////////////////////////////////////////////////////////


// Verilen bir form elementi için
function extractValue(control)
{
    var controlValue;
    if(control.nodeName)
    {
        switch(control.nodeName)
        {
            case "INPUT" :
                if(control.getAttribute("type"))
                {
                    switch(control.getAttribute("type"))
                    {
                        case "text" :
                        case "password" :
                        case "hidden" :
                            controlValue = getInputTextValue(control);
                            break;
                        case "radio" :
                            controlValue = getInputRadioValue(control);
                            break;
                        case "checkbox" :
                            controlValue = getInputCheckboxValue(control);
                            break;
                        case "file" :
							controlValue = getInputFileValue(control)
                            break;
                    }
                }
                break;
            case "SELECT" :
				controlValue = getSelectOptionValue(control);
                break;
            case "TEXTAREA" :
				controlValue = getTextAreaValue(control);
                break;
            default : // radio/chkbox container
				controlValue = getContainerValue(control);
                break;
        }
    } 
    return controlValue;
}

// Verilen bir "input-text" için bir path girilmisse bunu döndürür, yoksa false döndürür.
function getInputTextValue(control)
{
    return getStandardValue(control) 
}

// Verilen bir "input-radio" için bir path girilmisse bunu döndürür, yoksa false döndürür.
function getInputRadioValue(control)
{
   return getCheckableValue(control);
}

// Verilen bir "input-checkbox" için bir path girilmisse bunu döndürür, yoksa false döndürür.
function getInputCheckboxValue(control)
{
    return getCheckableValue(control);
}

// Verilen bir "input-file" için bir path girilmisse bunu döndürür, yoksa false döndürür.
function getInputFileValue(control)
{
	return getStandardValue(control)
}

// Verilen bir "select-option" için bir path girilmisse bunu döndürür, yoksa false döndürür.
function getSelectOptionValue(control)
{
	return getStandardValue(control)
}

// Verilen bir "TextArea" için bir path girilmisse bunu döndürür, yoksa false döndürür.
function getTextAreaValue(control)
{
	return getStandardValue(control)
}

// Radio/Checkbox list gibi elementleri içeren bir konteynir kontrol alarak, 
//içindeki radio veya checkboxlardan ilk seçili olanin degerini döndürür.
function getContainerValue(control)
{
	var isSelected = false;
	var selectedValue;
	
	if(control.childNodes && control.childNodes.length > 0)
	{
		var i;
		for(i = 0; i < control.childNodes.length; i++)
		{
			if(control.childNodes[i].nodeName == "INPUT" && (control.childNodes[i].getAttribute("type") == "radio" || control.childNodes[i].getAttribute("type") == "checkbox"))
			{
				if(control.childNodes[i].checked) 
				{
					isSelected = true;
					selectedValue = control.childNodes[i].value;
					break;
				}
			}	
		}
	}
	
	if(isSelected && selectedValue.trim() != "")
	{
		return selectedValue.trim();
	}
	else return false;
}

// Bir çok element için ortak deger döndürme yaklasimi.
function getStandardValue(control)
{
	if(control.value)
    {
        return control.value;   
    }
    else
    {
        return false;
    }    
}

// Radio ve checkbox için ortak deger döndürme yaklasimi.
function getCheckableValue(control)
{
	if(control.checked)
    {
        if(control.value && control.value != "")
        {
            return control.value;
        }
        else
        {
            return true;
        }
    }
    else
    {
        return false;
    }  
}

// Valide edilecek elementin, "label" ini dündürür.
function getControlsLabelText(control)
{
	if(control.getAttribute)
	{
		if(control.getAttribute("controlsLabelText"))
		{
			return control.getAttribute("controlsLabelText");
		}
		else 
			if(control.getAttribute("controlsLabel"))
			{
				return document.getElementById(control.getAttribute("controlsLabel")).innerHTML;
			}
			else
			{
				return null;
			}
	}
	else
		return null;
}
