/*
scData
	args = []		: 	массив аргументов функции
	func			:	имя функции
	level			:	уровень запуска
	state			:	имя состояния
*/

SC.addHandler( "show_node", function ( node, scData, execOptions ) {
    try {
    	var cState = this.get( scData.state );
        $applyClassName( node, "hiddenBlock", !cState );
    } catch ( e ) { };
} );
SC.addHandler( "hide_node", function ( node, scData, execOptions ) {
    try {
    	var cState = this.get( scData.state );
        $applyClassName( node, "hiddenBlock", cState );
    } catch ( e ) { };
} );

SC.addHandler( "show_content_by_id", function ( node, scData, execOptions, condition ) {
    try {

        var args = scData.args;

        var subResult = args[ 0 ].split(",");

        var appliedClass = ( args[ 1 ] ) ? args[ 1 ] : "hiddenBlock";
        
        var applyFlag = true;

        var cState = this.get( scData.state );

        for ( var i=0, l=subResult.length; i<l; i++ ) {
            if ( cState == subResult[i] ) {
                applyFlag = false ;
                break;
            }
        }

        if ( condition ) applyFlag = ( !applyFlag );

        $applyClassName( node, appliedClass, applyFlag );

        if ( execOptions && execOptions.returnResult ) return applyFlag;

    } catch ( e ) { return } 
} );

SC.addHandler( "hide_content_by_id", function ( node, scData, execOptions ) {
	var hFunc = this.getHandler( "show_content_by_id" );
    hFunc.call( this, node, scData, execOptions, true );
} );

SC.addHandler( "apply_class_by_id", function ( node, scData, execOptions, remove ){
    try {
        var args = scData.args;
        var cState = this.get( scData.state );

        if ( args[ 0 ] && args[ 1 ] && cState ) {
            var applyFlag = ( cState == args[ 0 ] );
            if ( remove ) applyFlag = !applyFlag;
            var classList = args[1].split(",");
            for ( var i = classList.length; i-- > 0; ) $applyClassName( node, classList[i], applyFlag );
        }
    } catch ( e ) { }      
} );

SC.addHandler( "remove_class_by_id", function ( node, scData, execOptions ){
    try {
    	var hFunc = this.getHandler( "apply_class_by_id" );
        hFunc.call( this, node, scData, execOptions, true );
    } catch ( e ) { }
} );
          
SC.addHandler( "apply_class", function ( node, scData, execOptions, remove ){
    try {
        var args = scData.args;

        if ( args[ 0 ] ) {
            var applyFlag = ( remove )? false : true;
            $applyClassName( node, args[ 0 ], applyFlag )
        }
    } catch ( e ) { }      
} );

SC.addHandler( "remove_class", function ( node, scData, execOptions ){
    try {
    	var hFunc = this.getHandler( "apply_class" );
        hFunc.call( this, node, scData, execOptions, true );
    } catch ( e ) { }
} );

SC.addHandler( "switch_class_by_id", function ( node, scData, execOptions, unswitch ) {
    try {
        var cState = this.get( scData.state );

        if ( cState != scData.args[ 0 ] ) return;

        var switchState = Boolean($matchClassName( node, scData.args[ 1 ] ) );

        switchState = ( unswitch )? !(switchState) : switchState;

        $applyClassName( node, scData.args[ 1 ], !switchState );

    } catch ( e ) {}
} );
SC.addHandler( "unswitch_class_by_id", function ( node, scData, execOptions ) { 
    try {
    	var hFunc = this.getHandler( "switch_class_by_id" );
        hFunc.call( this, node, scData, execOptions, true );
    } catch ( e ) {}
} );

SC.addHandler( "do_click", function ( node, scData, execOptions ) {
    try {
        var cState = this.get( scData.state );
        if ( cState == scData.args[ 0 ] ) {
            $dispatchEventForElement( node, "click" );
        }
    } catch ( e ) {}
} );

SC.addHandler( "click", function ( node, scData, execOptions ) {
    try {
		$dispatchEventForElement( node, "click" );
    } catch ( e ) {}
} );

SC.addHandler( "move_node", function ( node, scData, execOptions ) {
    try {
        if ( execOptions && execOptions.container ) {
        	var pos = execOptions.pos || "begin";
        	$moveNode( node, $( execOptions.container ), { pos: pos } );
        }
    } catch ( e ) {}
} );

SC.addHandler( "exec_func_by_id", function ( node, scData, execOptions ) {
    try { 
        var args = scData.args;

        if ( !args[0] || !args[1] ) return;

        var cState = this.get( scData.state );
        if ( cState == args[ 1 ] ) {
        	var tmpArgs = ( args.length > 2 )? args.slice( 2 ) : [];
			window[ args[0] ]( node, execOptions, tmpArgs );
        }

    } catch ( e ) { };
} );

SC.addHandler( "exec_func", function ( node, scData, execOptions ) {
    try { 
        var args = scData.args;

        if ( !args[0] ) return;

        var tmpArgs = ( args.length > 1 )? args.slice( 1 ) : [];
		window[ args[0] ]( node, execOptions, tmpArgs );

    } catch ( e ) { };
} );

SC.addHandler( "sc_debug", function( node, scData, execOptions ) {
	try {
		console.debug( node, scData, execOptions );
	} catch ( e ) {}	
} );

SC.addHandler( "scroll_in", function ( node, scData, execOptions ) {
	try {
		var top = $getFullOffsetTop( node );
		if ( top == 0 ) return;
		window.scrollTo( 0, top - 25 );
	} catch ( e ) {}	                      
} );
SC.addHandler( "scroll_by_id", function ( node, scData, execOptions ) {
	try {
        var cState = this.get( scData.state );
		if ( cState == scData.args[ 0 ] ) { 
			var top = $getFullOffsetTop( node );
			if ( top == 0 ) return;
			window.scrollTo( 0, top - 25 );
		}
	} catch ( e ) {}	                      
} );

SC.addHandler( "swap_class", function ( node, scData, execOptions ) {
	try {
		var args = scData.args;

        if ( args[ 0 ] ) {
            $swapClassName( node, args[ 0 ] );
        }
	} catch ( e ) {}	                      
} );

SC.addHandler( "collect_node", function ( node, scData, execOptions ) {
	try {
		var args = scData.args;

        if ( !args[ 0 ] ) return;

        execOptions[ args[ 0 ] ] = node;
	} catch ( e ) {}	                      
} );

SC.addHandler( "clear_content", function ( node, scData, execOptions ) {
	try {
		node.innerHTML = "";
	} catch ( e ) {}	                      
} );

SC.addHandler( "collect_data", function( node, scData, execOptions ) {
    try {
        var args = scData.args;
        var obj = execOptions.obj;

        var varName = ( args[ 0 ] )? args[ 0 ] : ( node.name )? node.name : node.id;

        if ( !obj || !varName ) return;

        if ( node.nodeName == "INPUT" && node.type == "checkbox" ) {
			obj [ varName ] = ( node.checked )?  node.value : 0;
        } 
        else if ( node.nodeName == "INPUT" && node.type == "radio" ) {
            if ( obj [ varName ] == undefined && node.checked ) 
                obj [ varName ] = node.value;
        }
        else if ( node.value != undefined ) {
            obj [ varName ] = node.value;
        } 
    } catch ( e ) {};
} );

SC.addHandler( "fillin_data", function( node, scData, execOptions ) {
    try {
		var args = scData.args;

		var varName = ( args[ 0 ] )? args[ 0 ] : ( node.name )? node.name : node.id;

		if ( !execOptions || !varName ) return;
		var val = ( execOptions[ varName ] != undefined )? execOptions[ varName ] : "";

		switch ( node.nodeName ) {
			case "INPUT": 
				if ( node.type == "checkbox" || node.type == "radio" ) {
					node.checked = ( val );
				} 
				else 
				{
					node.value = val;
				}
				break;
			case "TEXTAREA":
				node.value = val;
				break;
			case "SELECT":
				node.value = val;
				break;
			default: 
				node.innerHTML = val;
		} 
    } catch ( e ) {};
} );

SC.addHandler( "apply_attr_by_id", function ( node, scData, execOptions, remove ) {
	try {

        var args = scData.args;
        var cState = this.get( scData.state );

        if ( args[ 0 ] && args[ 1 ] && cState ) {
        	var applyFlag = false;
        	var values = args[ 0 ].split( "," );
        	for( var i = values.length; i--; ) {
        		if ( cState == values[ i ] ) {
	        		applyFlag = true;
	        		break;
        		}
        	}
            if ( remove ) applyFlag = !applyFlag;

            $applyAttr( node, args[1], applyFlag );
        }
		node.className = node.className; /* piw! piw! IE8 magic!*/
	} catch ( e ) {}	                      
} );

SC.addHandler( "remove_attr_by_id", function ( node, scData, execOptions ) {
	try {
    	var hFunc = this.getHandler( "apply_attr_by_id" );
        hFunc.call( this, node, scData, execOptions, true );
	} catch ( e ) {}	                      
} );

SC.addHandler( "focus_it", function ( node, scData, execOptions ) {
	try {
		node.focus();
	} catch ( e ) {}	                      
} );

SC.addHandler( "match_init_load", function ( node, scData, execOptions, remove ) {
	try {

        var args = scData.args;
        var cState = this.get( scData.state );

        if ( !args[0] || !args[1] || !execOptions.obj || cState != args[0] ) return;

        if ( execOptions.obj[ args[1] ] ) delete execOptions.obj[ args[1] ];

	} catch ( e ) {}	                      
} );
