/**
 * File contains main JS Library for Newsfinity
 *
 * JavaScript  version 1
 * @category   JavaScript Libraries
 * @author     Eugene A. Kalosha <aristarch@zfort.net>
 * @copyright  (c) 2004-2006 by ZFort Group
 * @version    SVN: $Id: 110$
 * @link       http://www.zfort.net
 * @since      File available since Release 1.0
 */

if (typeof(Newsfinity) == 'undefined') Newsfinity = new Object();

    /**
     * Sets highlight Mode for each Text Controls on Page
     *
     * @author   Eugene A. Kalosha <aristarch@zfort.net>
     * @access   public
     * @package  newsfinity
     */
    Newsfinity.HighLightMode = function(highlightedClassName, defaultClassName)
    {
        // onblur="if(this.value=='') this.value='����� �� �����';" onfocus="if(this.value=='����� �� �����') this.value='';"
        this.defaultClassName      = ((defaultClassName != null) ? defaultClassName : 'text');
        this.highlightedClassName  = ((highlightedClassName != null) ? highlightedClassName : 'text');
    }

    /**
     * Sets highlight Mode for each Text Controls on Page
     *
     * @access  public
     */
    Newsfinity.HighLightMode.prototype.setHightLightMode = function()
    {
        // --- Creating Link to the Current Object --- //
        var currentObject = this;

        // --- Get All Input Elements on Page --- //
        var arrAllInputTags = document.getElementsByTagName('input');
        for (var i = 0; i < arrAllInputTags.length; i++)
        {
            if (arrAllInputTags[i].type == "text")
            {
                this.setHightLightModeForControl(arrAllInputTags[i]);
            }
        }

        // --- Get All TextArea Elements on Page --- //
        var arrAllTATags = document.getElementsByTagName('textarea');
        for (var i = 0; i < arrAllTATags.length; i++)
        {
            this.setHightLightModeForControl(arrAllTATags[i]);
        }
    }

    /**
     * Sets highlight Mode for Control
     *
     * @param    HTMLElement control
     * @access  public
     */
    Newsfinity.HighLightMode.prototype.setHightLightModeForControl = function(control)
    {
        control._defaultClassName      = control.className;
        control._highlightedClassName  = this.highlightedClassName;

        // --- Saving onblur and onfocus Events to Control Event Handlers Log --- //
        Newsfinity.saveEventHandlerToLog(control, 'onblur');
        Newsfinity.saveEventHandlerToLog(control, 'onfocus');

        // --- New onblur Event --- //
        control.onblur = function(eventParam)
        {
            // --- Calling previous 'onblur' Event Handlers from Control Event Handlers Log --- //
            Newsfinity.callEventHandlersFromLog(this, 'onblur', eventParam);

            this.className = this._defaultClassName;
        }

        // --- New onfocus Event --- //
        control.onfocus = function(eventParam)
        {
            // --- Calling previous 'onfocus' Event Handlers from Control Event Handlers Log --- //
            Newsfinity.callEventHandlersFromLog(this, 'onfocus', eventParam);

            this.className = this._highlightedClassName;
        }
    }

    /**
     * Open Default Popup Window
     *
     * @param string url Window Url
     * @param string windowTitle Window Title
     */
    Newsfinity.openPopupWindow = function (url, windowTitle)
    {
        var testWindow = window.open(url, "defaultPopupWindow", 'toolbar=yes,width=830,height=620,scrollbars=yes')
        if (windowTitle) testWindow.document.title = windowTitle;
        testWindow.focus();
    }

    /**
     * Open Default Window
     *
     * @param string url Window Url
     * @param string windowTitle Window Title
     */
    Newsfinity.openWindow = function (url, windowTitle)
    {
        var testWindow = window.open(url, null, 'toolbar=yes,scrollbars=yes')
        if (windowTitle) testWindow.document.title = windowTitle;
        testWindow.focus();
    }

    /**
     * AJAX Button On Click Event Handler Manager
     *
     * @author   Eugene A. Kalosha <aristarch@zfort.net>
     * @access   public
     * @package  newsfinity
     */
    Newsfinity.AJAXButtonOnClickEventHandler = function(htmlButtonId)
    {
        // --- Set referense to the current AJAX Button --- //
        this.htmlButton  = document.getElementById(htmlButtonId);
    }

    /**
     * Sets onEnter event handler to htmlObject
     *
     * @param  String htmlObjectId
     */
    Newsfinity.AJAXButtonOnClickEventHandler.prototype.attachOnEnterSubmitHandler = function(htmlObjectId)
    {
        // --- Set referense to the current AJAX Page Object --- //
        var currentObject       = this;
        var htmlObject          = document.getElementById(htmlObjectId);
        htmlObject.defaultOnKeyDownEventHandler = htmlObject.onkeydown;

        // --- Overriding OnKyDown Event for attached HTML Object --- //
        htmlObject.onkeydown = function (currentEvent)
        {
            mbEvent = ((currentEvent) ? currentEvent : event);
            if (mbEvent.keyCode == 13)
            {
                if (this.value) currentObject.htmlButton.click();
            }
            else
            {
                if (typeof(this.defaultOnKeyDownEventHandler) == 'function') this.defaultOnKeyDownEventHandler(event);
            }
        }
    }

    /**
     * Sets highlight Mode for Control
     *
     * @param    HTMLElement control
     * @param    String controlDescription
     * @access  public
     */
    Newsfinity.setOnBlurSaveMode = function(controlId, controlDescription, initialEventName, finalEventName)
    {
        var cDescription      = ((controlDescription) ? controlDescription : null);
        var initialEventName  = ((initialEventName != null) ? initialEventName : 'onblur');
        var finalEventName    = ((finalEventName) ? finalEventName : 'onfocus');
        var control = document.getElementById(controlId);
        if (!control) return false;
        
        control.previousOnBlurHandler = control.onblur;

        // --- Saving onblur and onfocus Events to Control Event Handlers Log --- //
        Newsfinity.saveEventHandlerToLog(control, 'onblur');
        Newsfinity.saveEventHandlerToLog(control, 'onfocus');

        // --- Declaring new onblur Event Handler  --- //
        control.onblur = function(eventParam)
        {
            // --- Calling previous 'onblur' Event Handlers from Control Event Handlers Log --- //
            Newsfinity.callEventHandlersFromLog(this, 'onblur', eventParam);

            // --- Check if Value Changed --- //
            if ((this._previousValue != null) && (this._previousValue == this.value)) return false;

            // --- Creating Link to the Current Object --- //
            var currentObject = this;

            if (typeof(this.owner) != "undefined")
            {
                // --- Creating Preloader --- //
                this.preLoader = new PHP2Ajax.LoadManager('ajaxPreLoader' + "_" + this.id, this.id, PHP2Ajax.LOADER_TYPE_INLINE);
                this.preLoader.setClassName('ajaxInlineLoader');
                if (cDescription)
                {
                    this.preLoader.setCaption("Saving data for Field '" + cDescription + "' ...");
                }
                else
                {
                    this.preLoader.setCaption("Saving Data ...");
                }
                this.preLoader.inlineWidth  = 300;
                this.preLoader.inlineHeight = 40;
                this.preLoader.show();

                // --- Saving Curent Control Data --- //
                var ajaxPage = this.owner;

                // --- Processing onLoad event After Saving Data --- //
                ajaxPage.onLoad = ajaxPage.onConcurrentCallStarted = function()
                {
                    // --- Hiding Preloader --- //
                    currentObject.preLoader.hide();

                    // --- Enabling Current Control --- //
                    currentObject.disabled = false;
                };

                var postData  = new Object({'id': this._siteId, 'changedControl': control.id});
                postData      = ajaxPage.getPostData(postData);
                ajaxPage.call('saveControlData', postData);

                // --- Disabling Current Control --- //
                this.disabled = true;
            }
        }

        // --- New onfocus Event --- //
        control.onfocus = function(eventParam)
        {
            // --- Calling previous Event Handlers from Control Event Handlers Log --- //
            Newsfinity.callEventHandlersFromLog(this, 'onfocus', eventParam);

            // --- In Case Input - Ignoring Previous Value --- //
            if ((this.tagName.toLowerCase() != 'input') || ((this.type.toLowerCase() != 'checkbox') && (this.type.toLowerCase() != 'radio')))
            {
                this._previousValue = this.value;
            }
        }
    }

    /**
     * Saves Event Handler for Control to Log
     *
     * @param   HTMLElement control
     * @param   String eventName
     * @access  public
     */
    Newsfinity.saveEventHandlerToLog = function(control, eventName)
    {
        if ((control[eventName] != null) && (typeof(control[eventName]) == "function"))
        {
            if (typeof(control.__eventHandlersLog) == "undefined") control.__eventHandlersLog = new Object();
            if (typeof(control.__eventHandlersLog[eventName]) == "undefined") control.__eventHandlersLog[eventName] = new Array();

            control.__eventHandlersLog[eventName][control.__eventHandlersLog[eventName].length] = control[eventName];
        }
    }

    /**
     * Cals Event Handlers for Control From Log
     *
     * @param   HTMLElement control
     * @param   String eventName
     * @param   String eventParam Event Parameter From Events Subsystem
     * @access  public
     */
    Newsfinity.callEventHandlersFromLog = function(control, eventName, eventParam)
    {
        // --- Creating Events Semaphore. --- //
        if (control.__eventLogSemafor == null)
        {
            control.__eventLogSemafor = true;
        }
        else
        {
            return true;
        }

        // --- Loading Previous Handlers From Log Handlers --- //
        if ((typeof(control.__eventHandlersLog) == "object") && (typeof(control.__eventHandlersLog[eventName]) != "undefined"))
        {
            for (var i in control.__eventHandlersLog[eventName])
            {
                if (typeof(control.__eventHandlersLog[eventName][i]) == "function")
                {
                    control._tmpCalledEventHandler = control.__eventHandlersLog[eventName][i];
                    control._tmpCalledEventHandler(eventParam);
                }
            }
        }

        control.__eventLogSemafor = null;
    }

    /**
     * Calls onChangeControlData server method for control
     *
     * @param   string  controlId
     * @param   string  controlDescription
     * @param   string  initialEventName
     * @access  public
     */
    Newsfinity.onChange = function(controlId, controlDescription, initialEventName)
    {
        var cDescription      = ((controlDescription) ? controlDescription : null);
        var initialEventName  = ((initialEventName != null) ? initialEventName : 'onchange');

        var control = document.getElementById(controlId);
        control.previousOnBlurHandler = control.onblur;

        // --- Saving onchange Events to Control Event Handlers Log --- //
        Newsfinity.saveEventHandlerToLog(control, 'onchange');

        // --- Declaring new onchange Event Handler  --- //
        control.onchange = function(eventParam)
        {
            // --- Calling previous 'onblur' Event Handlers from Control Event Handlers Log --- //
            Newsfinity.callEventHandlersFromLog(this, 'onchange', eventParam);

            // --- Check if Value Changed --- //
            if ((this._previousValue != null) && (this._previousValue == this.value)) return false;

            // --- Creating Link to the Current Object --- //
            var currentObject = this;

            if (typeof(this.owner) != "undefined")
            {
                // --- Creating Preloader --- //
                this.preLoader = new PHP2Ajax.LoadManager('ajaxPreLoader' + "_" + this.id, this.id, PHP2Ajax.LOADER_TYPE_INLINE);
                this.preLoader.setClassName('ajaxInlineLoader');
                if (cDescription)
                {
                    this.preLoader.setCaption("Loading Data For " + cDescription + " ...");
                }
                else
                {
                    this.preLoader.setCaption("Loading Data ...");
                }
                this.preLoader.inlineWidth  = 300;
                this.preLoader.inlineHeight = 40;
                this.preLoader.show();

                // --- Calling server method onChangeControlData --- //
                var ajaxPage = this.owner;

                // --- Processing onLoad event After Saving Data --- //
                ajaxPage.onLoad = ajaxPage.onConcurrentCallStarted = function()
                {
                    // --- Hiding Preloader --- //
                    currentObject.preLoader.hide();

                    // --- Enabling Current Control --- //
                    currentObject.disabled = false;
                };

                var postData  = new Object({'id': this._siteId, 'changedControl': control.id});
                postData      = ajaxPage.getPostData(postData);
                ajaxPage.call('onChangeControlData', postData);

                // --- Disabling Current Control --- //
                this.disabled = true;
            }
        }
    }


    /**
     * Send Request to the Web Server to get WorldTV widget showing status
     *
     * @param integer siteId
     */
    Newsfinity.checkWorldTVwidgetStatus = function(siteId)
    {
        var $this = this;
        this.wsUrl = '/wsdl/main.ajax.php';        
     
        if (this.serverResponse == null)
        {
        	this.serverResponse = new PHP2Ajax.JSONRequest(this.wsUrl);
        }
        this.serverResponse.clear();
        
        this.serverResponse.call('checkWorldTVwidgetStatus');
        this.serverResponse.add("siteId", siteId);
        
        this.serverResponse.setHandler(function() {
            var serverResponseData  = this.getResponse();                                               
            if ($this.setReminderCallback != null) $this.setReminderCallback(serverResponseData.Response.remainder);           	
        });
//        this.serverResponse.onResponseError = this.onResponseError;
//        this.serverResponse.onHTTPError     = this.onHTTPError; 
        this.serverResponse.currentObject   = this;
        this.serverResponse.execute();
    }

