/// <reference path="helpers.js" />

/// <reference path="json2.js" />

/// <reference path="callBackFunction.js" />

/// <reference path="waitHandler.js" />



function FormDataHandler(form, cookieNameTransform, onErrorCallback)

{

    this._form = (typeof form == 'string' ? document.forms[ form ] : form);

    this._data = new Object();

    this._callbacks = new Object();

    this._cNameTrans = cookieNameTransform;

    this._waitHandler = new WaitHandler();

    this._onErrorCallback = arguments.length == 3 ? onErrorCallback : null;

}



FormDataHandler.prototype.Init = function()

{

    Event.observe(this._form, 'submit', this._OnSubmit.bind(this));

    //ha a back buttonnal lep vissza a juzer, akkor a form elemei disablezva 

    //maradnak a cache miatt (kuldes elott ki vannak disablezva, hogy ne kuldjon 

    //el olyan elemet ami nincs hasznalva)

    var isCached = $('is_content_cached');

    if(isCached && isCached.value==1)

    {

        isCached.value = 0;

        this.RestoreItems();

    }

}



FormDataHandler.prototype.RegisterChangeCallback = function(callbackObj)

{

    this._callbacks[callbackObj.id] = callbackObj;

}



FormDataHandler.prototype.UnRegisterChangeCallback = function(id)

{

    this._callbacks[id] = null;

}



FormDataHandler.prototype._OnSubmit = function(e)

{

    try

    {

        this._waitHandler.Activate();

        if(!this.DataCheck(e))

        {

            Helpers.Events.Stop(e);

            this._waitHandler.Deactivate();

            this._OnDataError(e);

            return false;

        }

        var callbackObj;

        var doBreak = false;

        for(var callbackName in this._callbacks)

        {

            callbackObj = this._callbacks[callbackName];

            if(callbackObj != null && callbackObj.beforeRules && callbackObj.callback)

                doBreak = callbackObj.callback(e);

            

            if(doBreak)

            {

                Helpers.Events.Stop(e);

                this._waitHandler.Deactivate();

                return false;

            }

        }

        this.Save(e); 

        this.PrepareSend(e); 

        for(var callbackName in this._callbacks)

        {

            

            callbackObj = this._callbacks[callbackName];

            if(callbackObj != null && !callbackObj.beforeRules && callbackObj.callback)

                doBreak = callbackObj.callback(e);

            

            if(doBreak)

            {

                Helpers.Events.Stop(e);

                this._waitHandler.Deactivate();

                return false;

            }

        }

        

        $('is_content_cached').value = 1;

        

    }

    catch(ex)

    {

        Helpers.Log('FormDataHandler >> _OnSubmit: %o', ex);

        this._waitHandler.Deactivate();   

        return false;

    }

    

    return true;

}



FormDataHandler.prototype._OnDataError = function(ev)

{

    if(this._onErrorCallback != null)

        this._onErrorCallback();

}



FormDataHandler.prototype.Save = function(ev)

{

    var objStr = '';

    var name, value, visible;

    //var data = new Object();

    for(var i = 0, e = this._form.elements; i < e.length; i++)

    {

        name = e[i].name;

        if(!name || name.length == 0 || e[i].readOnly)

            continue;

        value = Helpers.GetInputValue(e[i], this._form);

        if(e[i].tagName && e[i].tagName.toLowerCase()=='input' && e[i].type.toLowerCase()=='checkbox')

        {

            if(!Helpers.IsElementVisible(e[i], this._form))

                continue;

            value = e[i].checked ? 1 : 0;

        }

        else if(value==null || value.length == 0)

            continue;

        else if(e[i].tagName && e[i].tagName.toLowerCase()=='input' && e[i].type.toLowerCase()=='hidden')

            continue;

        var v = Base64.encode( URL.encode( value ) );

        this._data[ name ] = v;

        if(this._cNameTrans && typeof this._cNameTrans[ name ] != 'undefined')

            this._data[ this._cNameTrans[ name ] ] = v;

    }

    objStr = JSON.stringify(this._data);

    Helpers.Log('FormDataHandler >> Save: %s', objStr); 

    this._CreateCookie(this._form.name, objStr, 365);

}



FormDataHandler.prototype.PrepareSend = function(ev)

{

    for(var i = 0, e = this._form.elements; i < e.length; i++)

    {

        try{

            if(e[i].tagName.toLowerCase() == 'select')

            {

                var hidden = document.createElement('input');

                hidden.type = 'hidden';

                hidden.name = e[i].name +'_text';

                hidden.value = Helpers.GetInputText(e[i], this._form);

                this._form.appendChild(hidden);

            }

            if(!Helpers.IsElementVisible(e[i], this._form))

            {

                e[i].disabled = true;

            }

        }

        catch(ex)

        {}

    }

}



FormDataHandler.prototype.RestoreItems = function()

{

    this._waitHandler.Deactivate();

    var elTmp;

    for(var i = 0, e = this._form.elements; i < e.length; i++)

    {

        try

        {

            if(e[i] && e[i].tagName && e[i].tagName.toLowerCase() == 'select')

            {

                try

                {

                    elTmp = Helpers.GetElement(e[i].name +'_text', this._form);

                    if(elTmp && (typeof elTmp != 'undefined') && (typeof elTmp.parentNode != 'undefined'))

                    {

                        elTmp.parentNode.removeChild(elTmp);

                        Helpers.Log("RestoreItems >> Removing item: " + e[i].name +'_text');

                    }

                }

                catch(ex2)

                { Helpers.Log("RestoreItems >> Failed item2: " + e[i].name +'_text', ''); }

            }

            if(e[i] && e[i].disabled)

            {

                Helpers.Log("RestoreItems >> Enabling item: " + e[i].name);

                e[i].disabled = false;

            }

        }

        catch(ex)

        {

            Helpers.Log("RestoreItems >> Failed item: " + e[i].name);

        }

    }

}



FormDataHandler.prototype.DataCheck = function(ev)

{

    var firstError = null;

    for(var i = 0, e = this._form.getElementsByTagName('div'); i < e.length; i++)

    {

        if((e[i].className.toLowerCase() == 'left_req')  && Helpers.IsElementVisible(e[i], this._form))

        {

            var inputs = e[i].parentNode.getElementsByTagName('input');

            var isOK = true;

            for(var j=0; j<inputs.length; j++)

            {

                if(inputs[j].type.toLowerCase() == 'text' && inputs[j].value == '')

                {

                    isOK = false;

                    break;

                }

                else if(inputs[j].type.toLowerCase() == 'checkbox' && !inputs[j].checked)

                {

                    isOK = false;

                    break;

                }

            }

            e[i].parentNode.className = isOK ? 'row' : 'row_error';

            if(!isOK && !firstError)

                firstError = e[i];

        }

    }

    if(firstError)

        Helpers.ScrollToElement(firstError, this._form);

    return firstError == null;

}



FormDataHandler.prototype.SetError = function(field)

{

    var f = Helpers.GetElement(field, this._form);

    if(f != null && typeof f != 'undefined')

    {

        var row = this._GetRowNode(f);

        if(row)

            row.className = 'row_error';

    }

}



FormDataHandler.prototype.UnsetError = function(field)

{

    var f = Helpers.GetElement(field, this._form);

    if(f != null && typeof f != 'undefined')

    {

        var row = this._GetRowNode(f);

        if(row)

            row.className = 'row';

    }

        

}



FormDataHandler.prototype._GetRowNode = function(item)

{

    while(item != null)

    {

        if(item && item.className && (item.className == 'row' || item.className == 'row_error'))

        {

            return item;

        }else

            item = item.parentNode;

    }

    return null;

}



FormDataHandler.prototype.Load = function()

{

    //Helpers.Log("A betoltesert mar a szerver a felelos!!!!");

    var dataStr = this._ReadCookie(this._form.name);

    var data = null;
	var logStr = ''; if (dataStr) logStr=dataStr;
    Helpers.Log('FormDataHandler >> Load: %s', logStr);

    if(dataStr)           

    {

        try

        {

            data = JSON.parse(dataStr);

        }

        catch(ex){ Helpers.Log('FormDataHandler >> Load: Error by eval %o', ex); }

        if(data)

            this._data = data;

//        for(var elName in this._data)

//        {

//            var val = URL.decode(Base64.decode(this._data[elName]));

//            Helpers.SetInputValue(elName, this._form, val);

//        }

    }

}



FormDataHandler.prototype._CreateCookie = function(name, value, days)

{

	var expires = "";

	if (days)

	{

		var date = new Date();

		date.setTime(date.getTime()+(days*24*60*60*1000));

		expires = "; expires="+date.toGMTString();

	}

	

	//document.cookie = name+"="+value+expires+"; path=/";

    document.cookie = name+"="+value+expires+"; path=/;" 

        + (window.location.hostname.toLowerCase() != 'localhost' ? ' domain=.' + window.location.hostname : '' ) ;

}



FormDataHandler.prototype._ReadCookie = function(name)

{

	var nameEQ = name + "=";

	var ca = document.cookie.split(';');

	for(var i=0;i < ca.length;i++)

	{

		var c = ca[i];

		while (c.charAt(0)==' ') c = c.substring(1,c.length);

		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);

	}

	return null;

}



FormDataHandler.prototype._EraseCookie = function(name)

{

	this._CreateCookie(name, "", -1);

}
