
/* 
    change cursor
    update status bar
    expire time
    retries
*/
                                                                                                                                                                    
var NxExec = new Class ({
    'version': '0.0.1',

    Implements: [ Options ],

    options: {
    },

    initialize: function(options){
	if ( options ) {
	    this.setOptions(options);
	}
    },

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

    parse: function ( data ) {
	for (var i = 0; i < data.length; i++) {
	    var dlen = data[i].length;
	    var ret;

	    if ( dlen < 2 ) {
		continue;
	    }

	    switch ( data[i][0] ) {
		case 'alert':
		    var ex;
		    ex='alert(\''+data[i][1]+'\');'
		    ret = eval( ex );
		    break;
		case 'script':
		    ret = eval( data[i][1] );
		    break;
		case 'redirect':
		    var url   = data[i][1];
		    var delay = data[i][2];
		    var script;

		    if ( delay > 0 ) {
			script = 'window.setTimeout("window.location=\''+url+'\'", '+delay*1000+' );';
		    }
		    else {
			script = 'window.location=\''+url+'\';';
		    }
		    ret = eval( script );
		    break;
		case 'addClass':
		    if ( $(data[i][1]) )
			$(data[i][1]).addClass(data[i][2]);
		    break;
		case 'removeClass':
		    if ( $(data[i][1]) )
			$(data[i][1]).removeClass(data[i][2]);
		    break;
		case 'assign':
		    if ( $(data[i][1]) )
		        this._dom_assign(data[i][1], data[i][2], data[i][3]);
		    break;
		default:
		    alert('Unknown type ' + data[i][0] );
		    alert( JSON.encode( data[i] ) );
		    break;
	    }

	}
/*
*/
    },

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

    _tool_willChange: function(element, attribute, newData) {
	if ('string' == typeof element)
		element = $(element);

	if (element) {
	    var oldData;		
	    eval('oldData=element.'+attribute);
	    return (newData != oldData);
	}

	return false;
    },

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

    _dom_assign: function(element, property, data) {
	if ( 'string' == typeof element )
		element = $(element);

	if ( !element ) {
	    return false;
	}
	
	switch (property) {
	    case 'innerHTML':
		element.innerHTML = data;
		break;
	    case 'outerHTML':
		if ('undefined' == typeof element.outerHTML) {
//TODO
			var r = xajax.config.baseDocument.createRange();
			r.setStartBefore(element);
			var df = r.createContextualFragment(data);
			element.parentNode.replaceChild(df, element);
		} 
		else {
		    element.outerHTML = data;
		}
		break;
	    default:
		if ( this._tool_willChange(element, property, data) )
			eval('element.' + property + ' = data;');
		break;
	}

	return true;
    }

/*
xajax.dom.append = function(element, property, data) {
	if ('string' == typeof element)
		element = xajax.$(element);
	
	eval('element.' + property + ' += data;');
	return true;
},

xajax.dom.prepend = function(element, property, data) {
	if ('string' == typeof element)
		element = xajax.$(element);
	
	eval('element.' + property + ' = data + element.' + property);
	return true;
},

xajax.dom.remove = function(element) {
	if ('string' == typeof element)
		element = xajax.$(element);
	
	if (element && element.parentNode && element.parentNode.removeChild)
		element.parentNode.removeChild(element);

	return true;
},

*/

});




var Nx = new Class ({
    'version': '0.0.1',
    Implements: [ JSON, Request, Options ],

    getOptions: function() {
	return {
	    url: '',
	    method: 'post',
	    Callback: false,

	    validateOnBlur: true,
	    errorClass: 'error',
	    errorMsgClass: 'errorMessage',
	    dateFormat: 'dd/MM/yy',
	    onFail: Class.empty,
	    showErrorsInline: true,
	    label: 'Please wait...'
	};
    },

    initialize: function(options){
	this.setOptions(this.getOptions(), options);
    },

    /* ******************************************************************** */
    setURL: function( url ){
	this.options.url = url;    
    },

    /* ******************************************************************** */
    setCallback: function( cb ){
	this.options.Callback = cb;
    },

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

    doRequest: function( params ){

        var req = new Request({
	    url: this.options.url, 
	    method: this.options.method,
	    noCache: true,
	    link: 'ignore',
	    onComplete: this.onComplete.bind(this),
	    onFailure:  function(xhr) {
		alert( 'Failure fetching Ajax response.' );
	    },
	    onException:  function(header, name) {
		alert( 'Error: ' + header + ' ' + name );
	    },
	    onCancel:  function(resp_txt, resp_xml) {
		alert( 'Ajax request was cancelled' );
	    }
	});

	req.setHeader('Last-Modified','Sat, 1 Jan 2005 05:00:00 GMT');
	req.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});

	var args = [];

	for ( var i = 0; i < arguments.length; i++ ) {
	    args.push(arguments[i]);
	}

	req.send( { data: { nxdata: JSON.encode(args) } } );

    },

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

    onComplete: function(resp_txt, resp_xml) {
	if ( resp_txt ) {
	    var list = JSON.decode(resp_txt);
	    var resp = false;

	    if ( list && list.nxresponse ) {
		resp = list.nxresponse;
	    }

	    if ( !resp ) {
		return;
	    }

	    if ( this.options.Callback ) {
		if ( !this.options.Callback(resp) )
		    return;
	    }

	    var nxe = new NxExec;
	    nxe.parse(resp);

	}
    },

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

    getFormValues: function (parent) {
	var submitDisabledElements=false;
	var prefix = "";

	if (arguments.length > 1 &&arguments[1]==true) {
	    submitDisabledElements=true;var prefix='';
	}
	if(arguments.length > 2) {
	    prefix=arguments[2];
	}
	if('string'==typeof parent) {
	    parent=$(parent);
	}

        var aFormValues={};
	if(parent) {
	    if(parent.childNodes) {
		this._getFormValues(aFormValues,parent.childNodes,submitDisabledElements,prefix);
	    }
	}
	return aFormValues;
    },


    _getFormValues: function(aFormValues,children,submitDisabledElements,prefix) { 
	var iLen=children.length;
	for ( var i=0; i < iLen; ++i ) { 
	    var child=children[i];
	    if('undefined'!=typeof child.childNodes) {
		this._getFormValues(aFormValues,child.childNodes,submitDisabledElements,prefix);
	    }
	    this._getFormValue(aFormValues,child,submitDisabledElements,prefix);
	}
    },

    _getFormValue: function(aFormValues,child,submitDisabledElements,prefix) { 
	if (!child.name)
	    return;
	if (child.disabled) {
	    if(true==child.disabled) {
		if(false==submitDisabledElements) {
		    return;
		}
	    }
	}

	if (prefix!=child.name.substring(0,prefix.length)) {
	    return;
	}

	if (child.type) {
	    if(child.type=='radio'||child.type=='checkbox') {
		if(false==child.checked) {
		    return;
		}
	    }
	}

	var name=child.name;
	var values=[];

	if ('select-multiple'==child.type) { 
	    var jLen=child.length;
	    for( var j=0;j < jLen;++j ) { 
		var option=child.options[j];
		if(true==option.selected) {
		    values.push(option.value);
		}
	    }
	}
        else { 
	    values=child.value;
	}
    
	var keyBegin=name.indexOf('[');
	if (0 <=keyBegin) {
	    var n=name;
	    var k=n.substr(0,n.indexOf('['));
	    var a=n.substr(n.indexOf('['));

	    if(typeof aFormValues[k]=='undefined') {
		aFormValues[k]=[];
	    }

	    var p=aFormValues;
	    while ( a.length!=0 ) { 
		var sa=a.substr(0,a.indexOf(']')+1);
		var lk=k;
	        var lp=p;
		a=a.substr(a.indexOf(']')+1);
	        p=p[k];
		k=sa.substr(1,sa.length-2);
	        if(k=='') { 
	    	    if('select-multiple'==child.type) { 
			k=lk;p=lp;
		    }
		    else { 
			k=p.length;
		    }
		}
		if(typeof p[k]=='undefined') {
		    p[k]=[];
		}
	    }
	    p[k]=values;
	}
	else {
	    aFormValues[name]=values;
	}
    },

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

    foo: function() {}
});







