﻿/****************************************
*
* Form 控制物件
* 	param :
* 		{Form Object}String			form		Form 名稱
* 		{Document Object}String		_document	Document
*
****************************************/
function FormControl( form, _document )
{
	if(!_document){
		_document = document;
	}
	
	if(typeof _document == "object"){
		this._document  = _document;	
	}else{
		this._document = eval(_document);
	}
	
	if(typeof form == "object"){
		this.form  = form;
	}else{
		this.form = eval("this._document." + form);
	}
}

/****************************************
 FormControl.submit( method, action )
 Form submit
	param :
		String	method		POST or GET, 非必填
		String	action		非必填
****************************************/
FormControl.prototype.submit = function( method, action )
{
	if(method){
		this.form.method = method;
	}
	if(action){
		this.form.action = action;
	}
	this.form.submit();
}

/****************************************
 FormControl.reset()
 Form Reset 回復所有 Form 值
****************************************/
FormControl.prototype.reset = function()
{
	this.form.reset();
	return true;
}

/****************************************
 FormControl.clearValue()
 清除所有 Form 值
****************************************/
FormControl.prototype.clearValue = function()
{
	for( var i = 0 ; i < this.form.length ; i++ ){
		if(this.form[i].name){
			switch (this.form[i].type.toLowerCase()) {
				case "text":
				case "textarea":
				case "file":
				case "hidden":
				case "password":
					this.setValue( this.form[i].name, "" );
					break;
				
				case "checkbox":
				case "radio":
					this.setChecked( this.form[i].name, "", "value", true );
					break;
				
				case "reset":
				case "button":
				case "submit":
				case "image":
				default:
					break;
			}
			
			if( this.form[i].nodeName == "SELECT"){
				this.setSelected( this.form[i].name, "", "value", true );
			}
		}
	}
	return true;
}

/****************************************
 FormControl.setValue( elName, value )
 設定 Value 值
	param :
		String	elName	Form 元素名稱
		String	value	值
****************************************/
FormControl.prototype.setValue = function( elName, value )
{
	var elObj = eval("this.form." + elName);
	
	if(elObj){
		elObj.value = value;
		return true;
	}else{
		return false;
	}
}

/****************************************
 FormControl.appendValue( elName, value, lf )
 附加 Value 值
	param :
		String		elName	Form 元素名稱
		String		value	值
		Boolean		lf		true:換行, false:不換行
****************************************/
FormControl.prototype.appendValue = function( elName, value, lf )
{
	var elObj = eval("this.form." + elName);
	
	if(elObj && elObj.value){
		if(lf){
			elObj.value += "\n";
		}
		elObj.value += value;
		return true;
	}else{
		return false;
	}
}

/****************************************
 FormControl.getValue( elName )
 取得 Value 值
	param :
		String	elName	Form 元素名稱
****************************************/
FormControl.prototype.getValue = function( elName )
{
	var elObj = eval("this.form." + elName);
	
	if(elObj && elObj.value){
		return elObj.value;
	}else{
		return "";
	}
}

/****************************************
 FormControl.setReadonly( elName, isReadonly )
 設定是否唯讀
	param :
		String		elName		Form 元素名稱
		Boolean		isReadonly	true:唯讀, false:非唯讀
****************************************/
FormControl.prototype.setReadonly = function( elName, isReadonly )
{
	var elObj = eval("this.form." + elName);
	
	if(isReadonly){
		elObj.readonly = true;
	}else{
		elObj.readonly = false;
	}
}

/****************************************
 FormControl.setDisable( elName, isDisable )
 設定是否無效
	param :
		String		elName		Form 元素名稱
		Boolean		isDisable	true:無效, false:有效
****************************************/
FormControl.prototype.setDisable = function( elName, isDisable )
{
	var elObj = eval("this.form." + elName);

	if(elObj){
		if(elObj.type){
			switch (elObj.type.toLowerCase()) {
				case "text":
				case "textarea":
				case "file":
				case "hidden":
				case "password":
				case "reset":
				case "button":
				case "submit":
				case "image":
					elObj.disabled = isDisable;
					break;
					
				case "select-one":
				case "select-multiple":
					elObj.disabled = isDisable;
					break;
					
				default:
					break;
			}
		}else{
			for( var i = 0 ; i < elObj.length ; i++ ){
				elObj[i].disabled = isDisable;
			}
		}
		
		return true;
	}else{
		return false;
	}
}

/****************************************
 FormControl.setDisableByItem( elName, value, type, isDisable )
 針對 Select, Checkbox, Radio, 個別 Item 設定是否無效
	param :
		String			elName		Form 元素名稱
		String(Array)	value		值
		String			type		value, innerHTML, index
		Boolean			isDisable	true:無效, false:有效
****************************************/
FormControl.prototype.setDisableByItem = function( elName, value, type, isDisable )
{
	var elObj = eval("this.form." + elName);
	
	if(elObj){
		if(type == "index"){
			var idx = Number(value);
		}else{
			var idx = this.getItemIdx( elName, value, type );
		}
		elObj[idx].disabled = isDisable;
		return true;
	}else{
		return false;
	}
}

/****************************************
 FormControl.setSelected( elName, value, type, unSelected )
 設定 Selected
	param :
		String			elName		Form 元素名稱
		String(Array)	value		值
		String			type		value, innerHTML, index
		Boolean			unSelected	是否取消原本的 Selected, 非必填 default : true
****************************************/
FormControl.prototype.setSelected = function( elName, value, type, unSelected )
{
	var elObj = eval("this.form." + elName);
	
	if(elObj && elObj.nodeName == "SELECT"){
		if(typeof value == "object"){
			var arrValue = value;
		}else{
			var arrValue = [ value ];
		}
		
		if(arguments.length < 4){
			unSelected = true;
		}
		
		if(unSelected){
			for( var i = 0 ; i < elObj.length ; i++ ){
				elObj[i].selected = false;
			}
		}
		
		for( var j = 0 ; j < arrValue.length ; j++ ){
			var _value = arrValue[j];
			if(type == "index"){
				var idx = Number(_value);
			}else{
				var idx = this.getItemIdx( elName, _value, type );
			}
			if(elObj[idx]){
				elObj[idx].selected = true;
			}
		}
		
		return true;
	}else{
		return false;
	}
}

/****************************************
 FormControl.setSelectedAll( elName, type )
 設定 Selected All
	param :
		String		elName		Form 元素名稱
		Boolean		type		true:全選, false:全取消, 非必填 預設反向
****************************************/
FormControl.prototype.setSelectedAll = function( elName, type )
{
	var elObj = eval("this.form." + elName);
	
	if(elObj && elObj.type.toLowerCase() == "select-multiple"){
		for( var i = 0 ; i < elObj.length ; i++ ){
			if(arguments.length == 1 || !type){
				if(!elObj[i].selected){
					elObj[i].selected = true;
				}else{
					elObj[i].selected = false;
				}
			}else{
				if(type){
					elObj[i].selected = true;
				}else{
					elObj[i].selected = false;
				}
			}
		}
		
		return true;
	}else{
		return false;
	}
}

/****************************************
 FormControl.getSelected( elName )
 取得 Selected 資料
	param :
		String			elName		Form 元素名稱
	return :
		Array
****************************************/
FormControl.prototype.getSelected = function( elName )
{
	var elObj = eval("this.form." + elName);
	
	if(elObj && elObj.nodeName == "SELECT"){
		var arrValue = new Array;
		for( var i = 0 ; i < elObj.length ; i++ ){
			if(elObj[i].selected){
				arrValue.push( elObj[i].value );
			}
		}
		
		if(arrValue.length == 0){
			return "";
		}else{
			return arrValue;
		}
	}else{
		return false;
	}
}

/****************************************
 FormControl.isSelectedByItem( elName, value, type )
 是否 Selected
	param :
		String			elName		Form 元素名稱
		String			value		值
		String			type		value, innerHTML, indexe
	return :
		Boolean
****************************************/
FormControl.prototype.isSelectedByItem = function( elName, value, type )
{
	var elObj = eval("this.form." + elName);
	
	if(elObj && elObj.nodeName == "SELECT"){
		if(type == "index"){
			var idx = Number(value);
		}else{
			var idx = this.getItemIdx( elName, value, type );
		}
		
		if(elObj[idx]){
			return elObj[idx].selected;
		}else{
			return false;
		}
	}else{
		return false;
	}
}

/****************************************
 FormControl.appendOption( elName, value, innerHTML )
 新增 Option
	param :
		String		elName		Form 元素名稱
		String		value		值
		String		innerHTML	文字, 非必填 default = value
****************************************/
FormControl.prototype.appendOption = function( elName, value, innerHTML )
{
	var elObj = eval("this.form." + elName);
	
	if(elObj && elObj.nodeName == "SELECT"){
		if(!innerHTML) innerHTML = value;
		var newOption = this._document.createElement("option");
		newOption.value = value;
		newOption.innerHTML = innerHTML;
		elObj.appendChild(newOption);
		
		return true;
	}else{
		return false;
	}
}

/****************************************
 FormControl.removeOption( elName, value, type )
 移除 Option
	param :
		String		elName		Form 元素名稱
		String		value		值
		String		type		value, innerHTML, index
****************************************/
FormControl.prototype.removeOption = function( elName, value, type )
{
	var elObj = eval("this.form." + elName);
	
	if(elObj && elObj.nodeName == "SELECT"){
		if(type == "index"){
			var idx = Number(value);
		}else{
			var idx = this.getItemIdx( elName, value, type );
		}
		
		if(elObj[idx]){
			elObj.removeChild(elObj[idx]);
			return true;
		}else{
			return false;	
		}
	}else{
		return false;
	}
	
}

/****************************************
 FormControl.outInOption( outElName, inElName )
 針對兩個 Select, 做 Option 的移入移出
	param :
		String		outElName		要移出的 Form 元素名稱
		String		inElName		要移入的 Form 元素名稱
****************************************/
FormControl.prototype.outInOption = function( outElName, inElName )
{
	var outElObj = eval("this.form." + outElName);
	var inElObj = eval("this.form." + inElName);
	var arrItem = this.getSelected( outElName );
	
	if(outElObj && outElObj.nodeName == "SELECT" &&
	   		arrItem.length > 0 &&
	   		inElObj && inElObj.nodeName == "SELECT"){
		for( var i = 0 ; i < arrItem.length ; i++ ){
			var idx = this.getItemIdx( outElName, arrItem[i], 'value' );
			this.appendOption( inElName, outElObj[idx].value, outElObj[idx].innerHTML );
			this.removeOption( outElName, idx, 'index' );
		}
		
		return true;
	}else{
		return false;
	}
}

/****************************************
 FormControl.setChecked( elName, value, type, unSelected )
 設定 Checked
	param :
		String			elName		Form 元素名稱
		String(Array)	value		值
		String			type		value, index
		Boolean			unSelected	是否取消原本的 Selected, 非必填 default : true
****************************************/
FormControl.prototype.setChecked = function( elName, value, type, unSelected )
{
	var elObj = eval("this.form." + elName);
	
	if(elObj[0] && (elObj[0].type.toLowerCase() == "checkbox" || elObj[0].type.toLowerCase() == "radio")){
		if(typeof value == "object"){
			var arrValue = value;
		}else{
			var arrValue = [ value ];
		}
		if(arguments.length < 4){
			unSelected = true;
		}
		
		if(unSelected){
			for( var i = 0 ; i < elObj.length ; i++ ){
				elObj[i].checked = false;
			}
		}
		
		for( var j = 0 ; j < arrValue.length ; j++ ){
			var _value = arrValue[j];
			if(type == "index"){
				var idx = Number(_value);
			}else{
				var idx = this.getItemIdx( elName, _value, type );
			}
			if(elObj[idx]){
				elObj[idx].checked = true;
			}
		}
		
		return true;
	}else{
		return false;
	}
}

/****************************************
 FormControl.setCheckedAll( elName, type )
 設定 Checked All
	param :
		String		elName		Form 元素名稱
		Boolean		type		true:全選, false:全取消, 非必填 預設反向
****************************************/
FormControl.prototype.setCheckedAll = function( elName, type )
{
	var elObj = eval("this.form." + elName);
	
	if(elObj[0] && elObj[0].type.toLowerCase() == "checkbox"){
		for( var i = 0 ; i < elObj.length ; i++ ){
			if(arguments.length == 1 || !type){
				if(!elObj[i].checked){
					elObj[i].checked = true;
				}else{
					elObj[i].checked = false;
				}
			}else{
				if(type){
					elObj[i].checked = true;
				}else{
					elObj[i].checked = false;
				}
			}
		}
		return true;
	}else{
		return false;
	}
}

/****************************************
 FormControl.getChecked( elName )
 取得 Checked 資料
	param :
		String			elName		Form 元素名稱
	return :
		Array
****************************************/
FormControl.prototype.getChecked = function( elName )
{
	var elObj = eval("this.form." + elName);
	
	if(elObj[0] && (elObj[0].type.toLowerCase() == "checkbox" || elObj[0].type.toLowerCase() == "radio")){
		var arrValue = new Array;
		for( var i = 0 ; i < elObj.length ; i++ ){
			if(elObj[i].checked){
				arrValue.push( elObj[i].value );
			}
		}
	
		if(arrValue.length == 0){
			return false;
		}else{
			return arrValue;
		}
	}else{
		return false;
	}
}

/****************************************
 FormControl.isCheckedByItem( elName, value, type )
 是否 Checked
	param :
		String			elName		Form 元素名稱
		String			value		值
		String			type		value, innerHTML, indexe
	return :
		Boolean
****************************************/
FormControl.prototype.isCheckedByItem = function( elName, value, type )
{
	var elObj = eval("this.form." + elName);
	
	if(elObj[0] && (elObj[0].type.toLowerCase() == "checkbox" || elObj[0].type.toLowerCase() == "radio")){
		if(type == "index"){
			var idx = Number(value);
		}else{
			var idx = this.getItemIdx( elName, value, type );
		}
		
		if(elObj[idx]){
			return elObj[idx].checked;
		}else{
			return false;
		}
	}else{
		return false;
	}
}

/****************************************
 FormControl.getItemIdx( elName, value, type )
 取得 Select, Checkbox, Radio, Item idx 
	param :
		String			elName		Form 元素名稱
		String(Array)	value		值
		String			type		value, innerHTML
	return :
		Number
****************************************/
FormControl.prototype.getItemIdx = function( elName, value, type ){
	var elObj = eval("this.form." + elName);

	switch (type) {
		case "value":
			for( var i = 0 ; i < elObj.length ; i++ ){
				if(elObj[i].value == value)
				return i;
			}
			break;
		case "innerHTML":
			for( var i = 0 ; i < elObj.length ; i++ ){
				if(elObj[i].innerHTML == value)
				return i;
			}
			break;
		default:
			return 0;
			break;
	}
}

/****************************************
 FormControl.obj2Form( obj )
 將 Object 資料填入 Form 表單
	param :
		{Object}		obj		Object 資料 (JSON)
****************************************/
FormControl.prototype.obj2Form = function( obj )
{
	for(var elName in obj){
		var val = eval("obj." + elName);
		var elObj = eval("this.form." + elName);
		if(elObj.type){
			switch (elObj.type.toLowerCase()) {
				case "text":
				case "textarea":
				case "file":
				case "hidden":
				case "password":
				case "reset":
				case "button":
				case "submit":
					this.setValue( elName, val );
					break;
				
				case "select-one":
				case "select-multiple":
					this.setSelected( elName, val, "value", true );
					break;
				
				default:
					break;
			}
		}else{
			this.setChecked( elName, val, "value", true );
		}
	}
	
	return true;
}

/****************************************
 FormControl.form2Obj()
 將 Form 表單資料轉成 Object
	return :
		{Object}
****************************************/
FormControl.prototype.form2Obj = function( obj )
{
	var obj = new Object;
	for( var i = 0 ; i < this.form.length ; i++ ){
		if(this.form[i].name){
			switch (this.form[i].type.toLowerCase()) {
				case "text":
				case "textarea":
				case "file":
				case "hidden":
				case "password":
				case "reset":
				case "button":
				case "submit":
				case "image":
					obj[this.form[i].name] = this.getValue( this.form[i].name );
					break;
				
				case "checkbox":
				case "radio":
					obj[this.form[i].name] = this.getChecked( this.form[i].name );
					break;
	
				case "select-one":
				case "select-multiple":
					obj[this.form[i].name] = this.getSelected( this.form[i].name );
					break;
			
				default:
					break;
			}
		}
	}
	
	return obj;
}




// --------------------------------------------------------------------------------
// setSubmitDisabled( boolean );  // true=設定可以作用submit/false設定不能作用submit
// --------------------------------------------------------------------------------
FormControl.prototype.setSubmitDisabled = function( bool ) 
{
    for(var i=0;i<this.form.elements.length;i++) {
        if( this.form.elements[i].type=="submit" ) {
            this.form.elements[i].disabled = bool ;
        }
    }
}

// --------------------------------------------------------------------------------
// 跑一圈 Elements , 設定大部份的元件
// setAllElem("style.backgroundColor","#ffffff");
// --------------------------------------------------------------------------------
FormControl.prototype.setAllElem = function( obj_str , obj_val ) 
{
    for(var i=0;i<this.form.elements.length;i++) {

        //特殊元件不做處理
        if(this.form.elements[i].type=='submit') {
            continue;
        }
        
        if(typeof(obj_val)=='number') {
            eval('this.form.elements[i].'+obj_str+'='+obj_val);
        } else {
            eval('this.form.elements[i].'+obj_str+'="'+obj_val+'"');
        }

    }
}

// --------------------------------------------------------------------------------
// 檢查值域的功能是否在區間中, 成立傳回 true , 失敗傳回 false
// if(  obj.checkArea( ff.form.input1.value,'string',4,16 )==false  ){ }
//
// @param   string, 傳入要check的值
// @param   string, 傳入型態 s/str/string or i/int/integer
// @param   int,    最小值
// @param   int,    最大值
// @return
//          boolean
// --------------------------------------------------------------------------------
FormControl.prototype.checkArea = function( val,type,min,max) 
{
    //檢查傳入型態
    if( type=='str' || type=='string' || type=='s' ) {
        type='s';
    } else if ( type=='int' || type=='integer' || type=='i' ) {
        type='i';
    } else {
        alert('error - 傳入型態錯誤!! ');
        return false;
    }

    //轉換 val 的值
    if(type=='s') {
        if(typeof(val)=='undefine') {
            val='';
        }
    }else if(type=='i') {
        val=parseInt(val);  //轉數值
        if(val<=0) {
            val=0;
        }
    }

    min=parseInt(min);
    max=parseInt(max);

    //開始 check
    if(type=='s') {
        if( val.length>=min && val.length<=max ) {
            return true;
        } else {
            return false;
        }
    }else if(type=='i') {
        if( val>=min && val<=max ) {
            return true;
        } else {
            return false;
        }
    }

    alert('error - 4325789423577027035702340 ');

}
