/************************************************************************************************************
(C) www.dhtmlgoodies.com, February 2006

This is a script from www.dhtmlgoodies.com. You will find this and a lot of other scripts at our website.	

Terms of use:
You are free to use this script as long as the copyright message is kept intact. However, you may not
redistribute, sell or repost it without our permission.

Thank you!

www.dhtmlgoodies.com
Alf Magne Kalleland

************************************************************************************************************/	

// Patterns
var formValidationMasks = new Array();
formValidationMasks['email']        = /^[A-Z0-9._%\-\+]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/gi;	// Email
formValidationMasks['numeric']      = /^[0-9]+$/gi;	// Numeric
formValidationMasks['zip']          = /^[0-9]{5}\-[0-9]{4}$/gi;	// Numeric
formValidationMasks['url']          = /^(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/gi;	// URL

formValidationMasks['zipcode']      = /^[0-9]{3}\-[0-9]{4}$/gi;
formValidationMasks['telephone']    = /^[[0-9]{1,5}-]*[0-9]{1,4}-[0-9]{1,4}$/gi
formValidationMasks['telephone2']   = /^[0-9\-]+$/gi;
//formValidationMasks['zenkatakana']  = /^[ァ-ヶー]+$/;
formValidationMasks['zenkatakana']  = /^[ァ-ヶー 　]+$/;
//formValidationMasks['zenhiragana']  = /^[ぁ-ん]+$/;
formValidationMasks['zenhiragana']  = /^[ぁ-ん 　]+$/;
formValidationMasks['deliverlyday'] = /^[0-9]{1,2}\/[0-9]{1,2}$/gi;



var formElementArray = new Array();

var radios = new Array();    //    for radio button
var groups = new Array();    //    for group
var validateObj = null;


function checkInputValue( inputObj )
{
	var inputValidates = true;
	var radioElmArray = null;
    validateObj = null;
    
    if ( !formElementArray[inputObj.name] )
    {
        return true;
    }
    
	//    for input text
    if ( formElementArray[inputObj.name]['required'] && inputObj.tagName=='INPUT' && inputObj.type=='text' && ( inputObj.value.length==0 ) )
    {
        inputValidates = false;
    }
    
	//    for input radio
    //if(formElementArray[inputObj.name]['required'] && inputObj.tagName=='INPUT' && inputObj.type=='radio')
    if(formElementArray[inputObj.name]['required'] && inputObj.tagName=='INPUT' && ( (inputObj.type=='radio') || (inputObj.type=='checkbox') ) )
    {
        inputValidates = false;
        
        radioElmArray = radios[ inputObj.name ];
        
        if ( radioElmArray != null )
        {
            var i;
            for (i = 0; i < radioElmArray.length; i++) 
            {
                if ( radioElmArray[i].checked ) 
                {
                    inputValidates = true;
                }
            }
        }
    }
    
	if(formElementArray[inputObj.name]['required'] && inputObj.tagName=='SELECT' && inputObj.selectedIndex==0){
		inputValidates = false;
	}
	if(formElementArray[inputObj.name]['required'] && inputObj.tagName=='TEXTAREA' && inputObj.value.length==0){
		inputValidates = false;
	}
	if(formElementArray[inputObj.name]['mask'] && !inputObj.value.match(formValidationMasks[formElementArray[inputObj.name]['mask']]))inputValidates = false;

	if(formElementArray[inputObj.name]['freemask']){
		var tmpMask = formElementArray[inputObj.name]['freemask'];
		tmpMask = tmpMask.replace(/-/g,'\\-');
		tmpMask = tmpMask.replace(/S/g,'[A-Z]');
		tmpMask = tmpMask.replace(/N/g,'[0-9]');
		tmpMask = eval("/^" + tmpMask + "$/gi");
		if(!inputObj.value.match(tmpMask))inputValidates = false
	}	
	
	if(formElementArray[inputObj.name]['regexpPattern']){
		var tmpMask = eval(formElementArray[inputObj.name]['regexpPattern']);
		if(!inputObj.value.match(tmpMask))inputValidates = false
	}
	if(!formElementArray[inputObj.name]['required'] && inputObj.value.length==0 && inputObj.tagName=='INPUT')inputValidates = true;


    validateObj = inputObj;
    
    //    for radio button
    if ( radioElmArray != null )
    {
        validateObj = radioElmArray[0];
    }

    return inputValidates;
}

function validateInput(e,inputObj)
{
	if(!inputObj)inputObj = this;		

	var inputValidates = checkInputValue( inputObj );

    if ( validateObj == null )
    {
        return;
    }
    
    if ( formElementArray[validateObj.name]['group'] && formElementArray[validateObj.name]['group'].length > 0  )
    {
        //    グループあり
        inputValidates2 = true;
        groups[formElementArray[validateObj.name]['group']].each( function(item,index){
        
            if ( validateObj.name != item )
            {
                //    関連エレメントもチェック
	            if ( !checkInputValue( $(item) ) )
                {
                    inputValidates2 = false;
                }
            }
        });
        
        if ( !inputValidates2 )
        {
            inputValidates = false;
        }
    }
    
    var validatedObj = validateObj;
    
    var strObjId = validatedObj.id;
    
    if ( validatedObj.type == 'radio' )
    {
        strObjId = validatedObj.name;
    }
    else if (validatedObj.type == 'checkbox' )
    {
        strObjId = validatedObj.name;
        if ( strObjId.match( /\[\]$/ ) )
        {
            strObjId = strObjId.substring( 0, strObjId.length-2 );
        }
    }
    else if ( formElementArray[validatedObj.name]['group'] && formElementArray[validatedObj.name]['group'].length > 0  )
    {
        //    グループあり
        strObjId = formElementArray[validatedObj.name]['group'];
    }

    strObjId = '_' + strObjId;

    if ( $( strObjId ) )
    {
        if(inputValidates)
        {
            $( strObjId ).className = 'validInput';
        }
        else
        {
            $( strObjId ).className = 'invalidInput';
        }
    }
    isFormValid();
}

function isFormValid()
{
	//var divs = document.getElementsByTagName('DIV');
	var divs = document.getElementsByTagName('TD');
	for(var no=0;no<divs.length;no++){
		if(divs[no].className=='invalidInput')
        {
            if ( $('submit') != null )
            {
                $('submit').disabled = true;
            }
            return false;
        }
	}

    if ( $('submit') != null )
    {
        $('submit').disabled = false;
    }
	return true;	
}


function setEnable( sw, item )
{    
    var required = item.getAttribute('required');
    if(!required)required = item.required;

    if ( sw )
    {
        //    入力可能
        item.disabled = false;
        item.setStyle( "background-color", "#ffffff" );
        if ( required )
        {
            formElementArray[item.id]['required'] = 1;
        }
    }
    else
    {
        //    入力不可
        item.disabled = true;
        item.setStyle( "background-color", "#E9E9EB" );
        item.value = "";
        formElementArray[item.id]['required'] = 0;
        
    }
    validateInput( null, item );
}

function initFormValidation()
{
    var inputFields  = $$('input');
    var selectBoxes  = $$('select');
    var textAreas    = $$('textarea');

    var inputs = new Array();

    for ( var no=0; no<inputFields.length; no++ )
    {
        if( inputFields[no].id.length == 0 )
        {
            continue;
        }
        if ( (inputFields[no].type == 'radio') || (inputFields[no].type == 'checkbox') )
        {
            //    for radio button 
            if ( addRadiosToArray( inputFields[no] ) )
            {
        		inputs[inputs.length] = inputFields[no];
            }
        }
        else
        {
    		inputs[inputs.length] = inputFields[no];
        }
	}	
	for ( var no=0; no<selectBoxes.length; no++ )
    {
        if( inputFields[no].id.length == 0 )
        {
            continue;
        }
		inputs[inputs.length] = selectBoxes[no];
	}
	for ( var no=0; no<textAreas.length; no++ )
    {
        if( inputFields[no].id.length == 0 )
        {
            continue;
        }
		inputs[inputs.length] = textAreas[no];
	}
	
	for ( var no=0; no<inputs.length; no++ )
    {
		var className = inputs[no].parentNode.className;
		if(className && className.indexOf('validInput')>=0)continue;

		var required = inputs[no].getAttribute('required');
		if(!required)required = inputs[no].required;
		
		var group = inputs[no].getAttribute('group');
		if(!group)
        {
            group = inputs[no].group;
        }
        
		var mask = inputs[no].getAttribute('mask');
		if(!mask)mask = inputs[no].mask;
		
		var freemask = inputs[no].getAttribute('freemask');
		if(!freemask)freemask = inputs[no].freemask;
		
		var regexpPattern = inputs[no].getAttribute('regexpPattern');
		if(!regexpPattern)regexpPattern = inputs[no].regexpPattern;
		
		var div = document.createElement('SPAN');
		inputs[no].parentNode.insertBefore(div,inputs[no]);
		div.appendChild(inputs[no]);
		
		inputs[no].addEvent( 'blur',   validateInput );
		inputs[no].addEvent( 'change', validateInput );
		inputs[no].addEvent( 'paste',  validateInput );
		inputs[no].addEvent( 'keyup',  validateInput );
	
		formElementArray[inputs[no].name] = new Array();
		formElementArray[inputs[no].name]['mask'] = mask;
		formElementArray[inputs[no].name]['freemask'] = freemask;
		formElementArray[inputs[no].name]['required'] = required;
		formElementArray[inputs[no].name]['group']    = group;
		formElementArray[inputs[no].name]['regexpPattern'] = regexpPattern;

        if ( group )
        {
            addGroupsToArray( group, inputs[no].name );
        }

		validateInput(false,inputs[no]);
        
        //    for radio button
    	//if ( inputs[no].type == 'radio'  )
    	if ( (inputs[no].type == 'radio') || (inputs[no].type == 'checkbox')  )
        {
            radios[inputs[no].name][0].addEvent( 'click', validateInput );
            
            for ( var i=1; i<radios[inputs[no].name].length; i++ )
            {
                radios[inputs[no].name][i].addEvent( 'click',validateInput );        
                validateInput( false, radios[inputs[no].name][i] );
            }
        }
	}	
}

function addRadiosToArray( el )
{
    var createFlag = false;
	if( !radios[el.name] )
    {
        //    new radio elm
        radios[el.name] = new Array();
        createFlag = true;
    }
    
    radios[ el.name ][ radios[el.name].length ] = el;

    return createFlag;
}

function addGroupsToArray( group, name )
{
    var createFlag = false;
    if ( name.length == 0 )
    {
        return;
    }
    
	if( !groups[group] )
    {
        //    new group elm
        groups[group] = new Array();
        createFlag = true;
    }
    
    groups[ group ][ groups[group].length ] = name;

    return createFlag;
}

function checkDate( yyyy, mm, dd, diffDay ) 
{
    // 正規表現による書式チェック
    var datestr = yyyy + '/' + mm + '/' + dd;
    
    if ( !datestr.match(/^\d{4}\/\d{1,2}\/\d{1,2}$/) )
    {
        return false;
    }
    
    mm = mm - 1;    //    javascript用に月を合わせる
    
    // 月,日の妥当性チェック
    if ( (yyyy >= 0) && (mm <= 11) && (dd >= 1) && (dd <= 31) )
    {
        var vDt = new Date(yyyy, mm, dd);
        if ( isNaN( vDt ) )
        {
            return false;
        }
        else if ( (vDt.getFullYear() == yyyy) && (vDt.getMonth() == mm) && (vDt.getDate() == dd) )
        {
            if ( diffDay == 0 )
            {
                return true;
            }

            //    今日よりn日後かチェック
            var betweenDay = days_between( vDt, new Date() ); 
            if ( betweenDay >= diffDay  )
            {
                return true;
            }
        }
    }
    
    return false;
}

function days_between( date1, date2 ) 
{
    date1.setHours(0);
    date1.setMinutes(0);
    date1.setSeconds(0);

    date2.setHours(0);
    date2.setMinutes(0);
    date2.setSeconds(0);

    // The number of milliseconds in one day
    var ONE_DAY = 1000 * 60 * 60 * 24

    // Convert both dates to milliseconds
    var date1_ms = date1.getTime()
    var date2_ms = date2.getTime()

    // Calculate the difference in milliseconds
    var difference_ms = date1_ms - date2_ms;
    
    // Convert back to days and return
    return Math.round(difference_ms/ONE_DAY)

}

function getNearYear( mm, dd )
{
    mm = mm - 1;    //    javascript用に月を合わせる

    var curDate = new Date();
    var myDate = new Date( curDate.getFullYear(), mm, dd );
    
    var yyyy = curDate.getFullYear();
    if ( curDate.getTime() > myDate.getTime() )
    {
        return yyyy + 1;
    }
    
    return yyyy;
}

function getAddressFromZip( targetUrl, buttonId, zipId, ken, address )
{
    $( buttonId ).addEvent('click', function(e) {
        e = new Event(e).stop();

        if ( $( zipId ).getValue().length == 0 )
        {
            return;
        }
        var url = targetUrl + "?zip=" + encodeURIComponent( $(zipId).getValue() );
        this.disabled = true;

        var request = new Json.Remote( url, {
            onComplete: function( jsonObj ) {

                if ( jsonObj.ken == undefined )
                {
                    //    該当データなし
                    alert('該当住所は見つかりませんでした');
                    $( buttonId ).disabled = '';
                    return;
                }
                
                selectValue( $(ken), jsonObj.ken );
                $(address).value = jsonObj.address;
                $( buttonId ).disabled = '';
            }
            
        }).send();
    });
}

function selectValue( selectElm, selectValue )
{
    for ( var i=0; i<selectElm.options.length;i++ )
    {
        if ( selectElm.options[i].value == selectValue )
        {
            selectElm.selectedIndex = i;
            break;
        }
    }
}

