/**
 * @fileoverview js/main
 * 
 * @description main network functions<br />
 * 
 * @author bKarolyi, Worbyd
 */

/**
 * javascript language function
 * @param {Object} text
 */
function __( text, replace_pattern )
{ 
  if ( typeof dict == "undefined" )
  {
    return text; 
  }
  
  for ( i_dict = 0; i_dict < dict.length; i_dict++ )
  {
    var act_dict = dict[i_dict];
    if ( act_dict.source == text )
    {
      var target = replaceLanguagePattern( act_dict.target, replace_pattern );
      return target;
    }
  }
  
  text = replaceLanguagePattern( text, replace_pattern );
  return text;
}

function replaceLanguagePattern( target, pattern )
{
  for ( i in pattern )
  {
    var regexp = new RegExp( i, "g" );
    target = target.replace( regexp, pattern[i] );
  }
  return target;
}

if ( typeof console == "undefined" )
{
  var console = 
  {
    log: function()
    {}
  };
}

/**
 * YUI helper methods for manipulating Dom elements
 * @type   object
 */
var Dom = YAHOO.util.Dom,
    /**
     * YUI utilities for managing DOM Events and tools for building event systems
     * @type   object
     */
    Event = YAHOO.util.Event,
    /**
     * YUI simplified interface to the XMLHttpRequest object
     * @type   object
     */
    Connect = YAHOO.util.Connect,
    /**
     * YUI JSON parser
     * @type   object
     */
    JSON = YAHOO.lang.JSON,
    /**
     * @description selector
     */
    $ = YAHOO.util.Selector.query,
    /**
     * true if browser is Firefox
     * @type   Boolean
     */
    ff = ( YAHOO.env.ua.gecko > 0 ),
    /**
     * true if browser is Firefox 3
     * @type   Boolean
     */
    ff3 = ( YAHOO.env.ua.gecko >= 1.9 ),
    /**
     * true if browser is Internet Explorer
     * @type   Boolean
     */
    ie = ( YAHOO.env.ua.ie > 0 ),
    /**
     * true if browser is Internet Explorer 6.0
     * @type   Boolean
     */
    ie6 = ( YAHOO.env.ua.ie == 6 ),
    /**
     * true if browser is Internet Explorer 7.0
     * @type   Boolean
     */
    ie7 = ( YAHOO.env.ua.ie == 7 ),
    /**
     * true if operating system is Linux
     */
    linux = ( navigator.userAgent.toLowerCase().indexOf( "linux" ) != -1 ),
    /**
     * true if browser is Opera
     * @type Boolean
     */ 
    opera = ( YAHOO.env.ua.opera );
    
    
YAHOO.log = function( text )
{
  if ( typeof console != "undefined" ) 
  {
    //console.log(text);
  }
}

/**
 * @namespace network namespace
 */
var nw =
{
  /**
  * Ajax call 
  * Method for initiating an asynchronous request via the XHR object.
  * @param String url
  * @param Object callback name of the callback function
  * example:<br />
  * var callback =<br /> 
  * {<br />
  *   success: function(o)<br />
  *   {<br />
  *     //o.responseText;<br />
  *   },<br />
  *   failure: function()<br />
  *   {<br />
  *   <br />
  *   }<br />
  * }<br />
  * 
  * @param String [method] "post" || "get"<br /> 
  * default is get
  * @param Object [postData] data to post<br /> 
  * example:<br />
  * "variable=value&variable2=value2"<br />  
  */
  ajax: function( url, callback, method, postData )
  {
    method = method || "get";
    postData = postData || null
    Connect.resetFormState();
    var transaction = Connect.asyncRequest( method, url, callback, postData );
    return transaction;
  },
  /**
   * 
   * Ajax call with form sending<br /> 
   * Method for initiating an asynchronous request via the XHR object.
   * @param {String | HTMLelement} id of the form or the form
   * @param Object callback name of the callback function
   * example:<br /> 
   * var callback = <br /> 
   * {<br /> 
   *   success: function(o)<br /> 
   *   {<br /> 
   *     //o.responseText;<br /> 
   *   },<br /> 
   *   failure: function()<br /> 
   *   {<br /> 
   *   <br /> 
   *   }<br /> 
   * }<br /> 
   * @param {Boolean} true if there is file upload
   * 
   */
  ajaxForm: function( form_element, callback, postData, upload )
  {
    form_element = Dom.get( form_element );
    var url = form_element.action;
    var method = form_element.method;
    upload = upload || false;
    postData = postData || null;
    Connect.setForm( form_element, upload );
    var transaction = Connect.asyncRequest( method, url, callback, postData );
    return transaction;
  },
  /**
   * ajax call updates tag after getting data
   * @param {String} url ajax url
   * @param {String} id Elements id to update
   * @param {String} method default is get
   */
  ajaxUpdate: function( url, id, method, postData )
  {
    var n_ajax = new n_ajax_class( url, id, 
    function( o )
    {
      Dom.get( id ).innerHTML = o.responseText;
    },  null, method, postData );
    n_ajax.send();
    
    return true;
  },
   /**
   * shows alert dialog <br / >
   * an alias for this.showAlertDialog
   * @param {String} text alert text to show
   */
  alert: function( text )
  {
    alert_lightbox.showAlertDialog( text );
  },
  /**
   * 
   * @param {Object} boxnames
   * @param {Object} current_num
   * @param {Object} active_classname
   */
  changeTab: function( tab_id, max_num, current_num, active_classname )
  {
    active_classname = active_classname || "n_activetab";
    var current_tab = Dom.get( "n_" + tab_id + "tab_" + current_num );
    if ( Dom.hasClass( current_tab, active_classname ) )
    {
      return true;
    }
    
    var tabs = [];
    
    for( i_tabs = 1; i_tabs <= max_num; i_tabs++ )
    {
      var act_tab_obj = {};
      if ( Dom.get( "n_" + tab_id + "tab_" + i_tabs ) )
      {
        act_tab_obj.tab = Dom.get( "n_" + tab_id + "tab_" + i_tabs );
        act_tab_obj.content = Dom.get( "n_" + tab_id + "content_" + i_tabs );
        if ( Dom.get( "n_" + tab_id + "extracontent_" + i_tabs ) )
        {
          act_tab_obj.extracontent = Dom.get( "n_" + tab_id + "extracontent_" + i_tabs )
        }
        tabs.push( act_tab_obj );
      }
      
    }
    
    for( i_tab_obj = 0; i_tab_obj < tabs.length; i_tab_obj++ )
    {
      var act_tab_obj = tabs[i_tab_obj];
      if ( act_tab_obj.tab == current_tab )
      {
        Dom.addClass( act_tab_obj.tab, active_classname );
        if ( act_tab_obj.content )
        {
          this.show( act_tab_obj.content );
        }
        if ( act_tab_obj.extracontent )
        {
          this.show( act_tab_obj.extracontent );
        }
      }
      else
      {
        Dom.removeClass( act_tab_obj.tab, active_classname );
        if ( act_tab_obj.content )
        {
          this.hide( act_tab_obj.content );
        }
        if ( act_tab_obj.extracontent )
        {
          this.hide( act_tab_obj.extracontent );
        }
      }
    }
    
    return true;
  },
  /**
   * shows confirm dialog<br / >
   * an alias for this.showAlertDialog
   * @param {Object} text confirm question to show
   * @param {Object} handleYes callback function for Yes button
   */
  confirm: function( text, handleYes )
  {
    confirm_lightbox.showConfirmDialog( text, handleYes );
  },
  /**
  * get dom element's real height<br /> 
  * @param {string || HTMLelement} el HTML element or id of the HTML element
  * @returns {Number} height of the element<br /> 
  * or false if failed to get height ( perhaps not displayed )
  */
  getRealHeight: function( el, remove_padding )
  {
    el = Dom.get( el );
    if ( !el )
    {
      return false;
    }
    
    var hidden = ( Dom.hasClass( el, "n_invisible" ) ) ? true : false; 

    if ( hidden )
    {
      Dom.removeClass( el, "n_invisible" );
    }
    
    var region = Dom.getRegion( el );
    var top = parseInt( region.top );
    var bottom = parseInt( region.bottom );

    if ( hidden )
    {
      Dom.addClass( el, "n_invisible" );
    }
    
    var real_height = bottom - top;
    if ( remove_padding && !ie6 )
    {
      var padding_top = parseInt( Dom.getStyle( el, "padding-top" ) );
      var padding_bottom = parseInt( Dom.getStyle( el, "padding-bottom" ) );
      real_height -= padding_top;
      real_height -= padding_bottom;
    }
    
    
    return real_height;
  },
  /**
   * makes element hidden
   * @param {HTMLelement || String} id element or id of the element to hide 
   */
  hide: function( id )
  {
    if ( !Dom.get( id ) )
    {
      return false;
    }
    Dom.addClass( id, "n_invisible" );
  },
  /**
  * hides custom dialog
  * @id id of the markup code
  */
  hideLight: function( id )
  {
    custom_lightbox.hideCustomDialog( id );
  },
  /**
  * hides ajax dialog
  */
  hideLightAjax: function()
  {
    ajax_lightbox.onReady = function()
    {}
    ajax_lightbox.hideAjaxDialog();
  },
  /**
  * an alias for hideWaitingDialog
  */
  hideWaiting: function()
  {
    waiting_lightbox.hideWaitingDialog();
  },
  /**
   * checks if an element is in the specified array
   * @param {Object} el an element to check
   * @param {Array} arr the array we search in
   * @return {Number} the position of the element in the array -1 if element is not in array
   */
  indexOf: function( el, arr )
  {
    for( i_arr_item = 0; i_arr_item < arr.length; i_arr_item++ )
    {
      var act_arr_item = arr[i_arr_item];
      if ( act_arr_item == el )
      {
        return i_arr_item;
      }
    }
    
    return -1;
  },
  /**
   * whether an input field is empty
   * @param {HTMLElement || String} element or id of the element to check
   * @param {Boolean} trimmed trim the value or not
   */
  isEmptyField: function( el, trimmed )
  {
    el = Dom.get( el );
    var value = el.value;
    
    if ( trimmed )
    {
      value = YAHOO.lang.trim( el.value );
    }
    
    return ( value == "" ) ? true : false;
  },
  /**
   * checks if an element is in the specified array
   * @param {Object} el an element to check
   * @param {Object} arr the array we search in
   * @return true if element is in the array
   */
  isInArray: function( el, arr )
  {
    for( i_arr_item = 0; i_arr_item < arr.length; i_arr_item++ )
    {
      var act_arr_item = arr[i_arr_item];
      if ( act_arr_item == el )
      {
        return true;
      }
    }
    
    return false;
  },
  /**
   * whether an element is visible
   * @param {String | HTMLelement} el element or id of the element to check
   * @return true if visible
   */
  isVisible: function( el )
  {
    el = Dom.get( el );
    if ( Dom.hasClass( el, "n_invisible" ) )
    {
      return false;
    }
    else
    {
      return true;
    }
  },
  /**
  * an alias for showCustomDialog
  * @param {Object} id id of the markup code
  * @param {Object} config config properties for setting custom dialog
  */
  openLight: function( id, config )
  {

    custom_lightbox.showCustomDialog( id, config );
  },
  /**
  * an alias for showAjaxDialog
  * @param {Object} id id of the markup code
  * @param {Object} config config properties for setting ajax dialog
  */
  openLightAjax: function( url, config )
  {
    ajax_lightbox.showAjaxDialog( url, config );
  },
  /**
   * an alias for showWaitingDialog
   */
  openWaiting: function()
  {
    waiting_lightbox.showWaitingDialog();
  },
  /**
   * remove accents from string
   * @param {String} str string to remove accents
   * @return string with removed accents
   */
  removeAccents: function( str )
  {
    var temp_str = "";

    for ( i_letter = 0; i_letter < str.length; i_letter++ )
    {
      var letter = "";
      switch ( str.charAt( i_letter ) )
      {
        case "ö":
          letter = "o";
          break;
        case "ü":
          letter = "u";
          break;
        case "ó":
          letter = "o";
          break;
        case "ő":
          letter = "o";
          break;
        case "ú":
          letter = "u";
          break;
        case "é":
          letter = "e";
          break;
        case "á":
          letter = "a";
          break;
        case "ű":
          letter = "u";
          break;
        case "í":
          letter = "i";
          break;
        default:
          letter = str.charAt( i_letter );
      }

      temp_str = temp_str+letter;
    }
    
    return temp_str;
  },
  /**
   * scrolls the page to the current element
   * @param {String||HTMLElement} el element or id of the element to scroll
   * @param {Number} diff number to decrease the coordinate y with. Default is 10
   */
  scrollTo: function( el, diff )
  {
    el = Dom.get( el );
    if ( !el )
    {
      return false;
    }
    diff = diff || 10;
    var is_hidden = false;
  
    if(Dom.getStyle(el, "display") == "none")
    {
      is_hidden = true;
      Dom.setStyle(el, "display", "block");
    }
    
    var pos_y = Dom.getY(el);
    
    if(is_hidden)
    {
      Dom.setStyle(el, "display", "none");
    }
    window.scrollTo( 0, pos_y - diff );
  },
  /**
   * makes element visible
   * @param {HTMLelement || String} id element or id of the element to show 
   */
  show: function( id )
  {
    if ( !Dom.get( id ) )
    {
      return false;
    }
    Dom.removeClass( id, "n_invisible" )
  },
  /**
   * show or hide current element 
   * @param {String || HTMLelement} show_el element or id of the element to show 
   * @param {HTMLelement} check_el optional if checked   
   */
  toggle: function( show_el, check_el )
  {
    show_el = Dom.get( show_el );
    check_el = Dom.get( check_el );
    
    var visible;
    
    if ( check_el )
    {
      if ( check_el.nodeName.toLowerCase() == "input" && check_el.type == "checkbox")
      {
        visible = ( check_el.checked ) ? false: true;
      }   
    }
    else
    {
      visible = ( this.isVisible( show_el ) ) ? true : false; 
    }
    
    
    if ( visible )
    {
      this.hide( show_el );
    }
    else
    {
      this.show( show_el );
    }
    return true;
  }
}

/**
 * @description simplified ajax handler class for instantiation 
 * @param {String} url for sending request to
 * @param {String || HTMLelement} hide_el html element or id of the element we want to add indicator during the transaction
 * @param {function} onReady runs this function after the transaction was successed
 * @param {Object} payload a collection of data we want to transfer
 * @param {String} method method of the ajax call post || get
 * @param {String} postData variables we want to post
 * @class 
 */
var n_ajax_class = function( url, hide_el, onReady, payload, method, postData )
{
  /**
   * @description url for sending request to
   * @type {String}
   */
  this.url = url;
  /**
   * @description html element or id of the element we want to add indicator during the transaction
   * @type {String || HTMLelement}
   */
  this.hide_el = hide_el;
  /**
   * @description runs this function after the transaction was successed
   * @type {function}
   */
  this.onReady = onReady || null;
  /**
   * @description a collection of data we want to transfer
   * @type {Object}
   */
  this.payload = payload || {};
  /**
   * @description method of the ajax call post || get
   * @type {String}
   */
  this.method = method || null;
  /**
   * @description variables we want to post
   * @type {String}
   */
  this.postData = postData || null;
  /**
   * @description an instance of the indicator class
   * @type {Object}
   */
  this.ind = ( this.hide_el ) ? new indicator.handler( hide_el ) : null;
  /**
   * @description stores the original object where the send is called from
   * @type {Object}
   */
  this.caller_obj = null;
  /**
   * @description yui ajax object
   * @type Object
   */
  this.transaction = null;
  
  /**
   * @description if response is in json format, stores it
   * @type {Object}
   */
  this.json_response = null;
  
  this.indicator_is_disabled = false;
  
  this.handleAjaxError = function( o )
  {

  };
  
  this.handleDefalultError = function( message )
  {
    nw.alert( message );
    return true;
  };
  
  /**
   * @description default function for error handling after the transaction was succeeded 
   * @param {Object} o the transaction object
   */
  this.responseHandler = function( o )
  {
    nw.hideWaiting();
    this.json_response = null;
    
    if ( this.ind )
    {
      this.ind.hide();
    }
    
    if ( o.getResponseHeader )
    {
      try
      {
        eval( "var response_error = "+ o.getResponseHeader['Errormsg'] );
      }
      catch(e)
      {
        
      }
    }
    
    if ( typeof response_error != "undefined" )
    {
      this.handleDefalultError.call( this.caller_obj, response_error );
      return false; 
    }
    
    if ( o.getResponseHeader )
    {
      try
      {
        eval( "var response_success = " + o.getResponseHeader['Successmsg'] );
      }
      catch(e)
      {
        
      }
    }
    
    if ( typeof response_success != "undefined" )
    {
      this.handleDefalultError.call( this.caller_obj, response_success );
      return false; 
    }

    try 
    {
      var response = JSON.parse( o.responseText );
      this.json_response = response;
      if ( response.type == 0 )
      {
        this.handleDefalultError.call( this.caller_obj, response.message );
        return false;
      }      
      else if ( response.type == 1 )
      {
        if ( this.onReady )
        {
          this.onReady.call( this.caller_obj, o, this.payload );
          return false;
        }        
      }
    }
    catch ( e ) 
    {
      
    }
    return true;
  };
  
  this.handleFailure = function( o )
  {};
  
  /**
   * @description sends an ajax request
   * @param {Object} caller_obj stores the original object where the send is called from
   */
  this.send = function( caller_obj )
  {
    this.caller_obj = caller_obj;
    if ( this.ind )
    {
      delete this.ind;
      this.ind = new indicator.handler( this.hide_el );
      this.ind.show();
    }
    else if ( !this.indicator_is_disabled )
    {
      nw.openWaiting();
    }
    this.transaction = nw.ajax( this.url, this.sendCallback, this.method, this.postData );
  }
  
  /**
   * @description sends a form wth ajax
   * @param {Object} caller_obj stores the original object where the send is called from
   * @param {HTMLelement || String} form_el the form or id of the form 
   */
  this.sendForm = function( caller_obj, form_el )
  {
    this.caller_obj = caller_obj;
    if ( this.ind )
    {
      delete this.ind;
      this.ind = new indicator.handler( this.hide_el );
      this.ind.show(); 
    }
    else if ( !this.indicator_is_disabled )
    {
      nw.openWaiting();
    }
    
    this.transaction = nw.ajaxForm( form_el, this.sendCallback, this.postData );
  }

  /**
   * @description uploads a form with ajax
   * @param {Object} caller_obj stores the original object where the send is called from
   * @param {HTMLelement || String} form_el the form or id of the form 
   */
  this.uploadForm = function( caller_obj, form_el )
  {
    this.caller_obj = caller_obj;
    if ( this.ind )
    {
      this.ind.show(); 
    }
    else if ( !this.indicator_is_disabled )
    {
      nw.openWaiting();
    }
    
    this.transaction = nw.ajaxForm( form_el, this.sendCallback, this.postData, true );
  }
  
  /**
   * @description callback object for the transaction
   * @param {Object} o transaction
   * @namespace
   */
  this.sendCallback =
  {
    /**
     * @description successful ajax call
     * @param {Object} o the ajax object
     */
    success: function( o )
    {
      this.transaction = null;
      if ( !this.responseHandler( o ) )
      {
        this.handleAjaxError.call( this.caller_obj, o );
        return false;
      }
      
      if ( this.onReady )
      {
        this.onReady.call( this.caller_obj, o, this.payload );
        return true;
      }    
    },
    /**
     * @description ajax call failure
     */
    failure: function( o )
    {
      this.transaction = null;
      nw.hideWaiting();
      if ( this.ind )
      {
        this.ind.hide();
      }
      
      this.handleFailure.call( this.caller_obj, o );
    },
    /**
     * @description ajax call succeed on file upload
     */
    upload: function( o )
    {
      this.sendCallback.success.call( this, o );
      return true;
    },
    /**
     * @description scope of the callback object
     */
    scope: this
  }
}

/**
 * @description class for editiing field
 * @param {String} editfield_id id of the editable field
 * @class
 */
var n_editfield_simple_class = function( editfield_id )
{
  /**
   * @description stores ajax result 
   * @type {Object}
   */
  this.ajax_result = null;
  /**
   * @description wrap element of the edit field
   * @type {HTMLelement}
   */
  this.editfieldwrap = null;
  /**
   * @description stores edit id
   * @type {String}
   */
  this.editfield_id = editfield_id;
  /**
   * @description error callback element if exist
   * @type {HTMLelement}
   */
  this.errormsg_el = null;
  /**
   * @description field wrap element
   * @type {HTMLelement}
   */
  this.fieldwrap = null;
  /**
   * @description edit form 
   * @type {HTMLelement}
   */
  this.form_el = null;
  /**
   * @description field of the original text
   * @type {HTMLelement}
   */
  this.originaltextfield = null;
  /**
   * @description edit input field
   * @type {HTMLelement}
   */
  this.textinput = null;
  /**
   * @description ajax object for save changes 
   * @type {Object}
   */
  this.ajax_save = null;
  this.construct();
}

/**
 * @description n_editfield_simple_class methods
 * @namespace
 */
n_editfield_simple_class.prototype =
{
  /**
   * @description sets default html elements
   */
  construct: function()
  {
    this.editfieldwrap = Dom.get( "n_" + this.editfield_id + "_editfieldwrap"  );
    this.fieldwrap = Dom.get( "n_" + this.editfield_id + "_fieldwrap"  );
    this.originaltextfield = Dom.get( "n_" + this.editfield_id + "_originaltextfield"  );
    this.textinput = Dom.get( "n_" + this.editfield_id + "_textinput"  );
    this.form_el = Dom.get( "n_" + this.editfield_id + "_form_el"  );
    this.errormsg_el = Dom.get( "n_" + this.editfield_id + "_errormsg"  ) || null;
    return true;
  },
  /**
   * @description shows edit area
   */
  edit: function()
  {
    if ( this.originaltextfield )
    {
      if ( this.originaltextfield.childNodes[0] )
      {
        this.textinput.value = this.originaltextfield.childNodes[0].nodeValue;
      }
      else
      {
        this.textinput.value = this.originaltextfield.value;
      }
    }
    else
    {
      this.textinput.value = "";
    }
    nw.hide( this.fieldwrap );
    nw.show( this.editfieldwrap );
    this.textinput.focus();
  },
  /**
   * @description saves changes
   * @param {Object} options options for handling errors
   */
  save: function( options )
  {
    this.ajax_save = this.ajax_save || new n_ajax_class( null, this.editfieldwrap, this.saveCallback );
    if ( this.errormsg_el )
    {
      nw.hide( this.errormsg_el );
    }
    
    var min = 0;
    var max = 100;
    
    if ( options )
    {
      min = options.min || min;
      max = options.max || max; 
    }

    if ( YAHOO.lang.trim( this.textinput.value ).length <= min )
    {
      if ( this.errormsg_el )
      {
        nw.show( this.errormsg_el );
      }
      else
      {
        nw.alert( __( "Kitöltése kötelező" ) );
      }
      this.textinput.focus();
      return false;
    }
    else if ( YAHOO.lang.trim( this.textinput.value ).length > max )
    {
      if ( this.errormsg_el )
      {
        nw.show( this.errormsg_el );
      }
      else
      {
        nw.alert( __( "A szöveg hossza legfeljebb %num% karakter lehet!", { "%num%": max } ) );
      }
      this.textinput.focus();
      return false;
    }

    this.ajax_save.sendForm( this, this.form_el );
  },
  /**
   * @description callback function for saving changes
   * @param {Object} o transaction
   */
  saveCallback: function( o )
  {
    this.originaltextfield.innerHTML = this.textinput.value;
    this.hide();
    return true;
  },
  /**
   * @description hides edit area
   */
  hide: function()
  {   
    if ( this.errormsg_el )
    {
      nw.hide( this.errormsg_el );
    }
    
    nw.show( this.fieldwrap );
    nw.hide( this.editfieldwrap );
  }
}


var n_editfield_class = function()
{
  this.units = [];
}

n_editfield_class.prototype =
{
  /**
   * @description gets current unit
   * @param {HTMLelement} reload_el wrap element of the box. will be reloaded after saving edit form
   * @return unit object or false
   */
  getUnitById: function( prefix, id )
  {
    var editfield_id = id ? prefix + "_" + id : prefix;
    for ( i_unit = 0; i_unit < this.units.length; i_unit++ )
    {
      var act_unit = this.units[ i_unit ];
      if ( editfield_id == act_unit.editfield_id )
      {
        return act_unit;
      }
    }
    
    return false;
  },
  
  /**
   * @description makes a new unit if not exist already
   * @param {HTMLelement} inside_el some element inside the box
   */
  add: function( prefix, id, unit_class, config )
  {
    if ( !this.getUnitById( prefix, id ) )
    {
      var unit = new unit_class;
      var editfield_id = id ? prefix + "_" + id : prefix;
      unit.construct( editfield_id, config );
      this.units.push( unit );
      return unit;
    }
    else
    {
      return this.getUnitById( prefix, id );
    }
  }
}

/**
 * @description class for editiing field
 * @param {String} editfield_id id of the editable field
 * @class
 */
var n_editfield_unit_class = function()
{
}

n_editfield_unit_class.prototype =
{
  /**
   * @description stores ajax result 
   * @type {Object}
   */
  ajax_result: null,
  /**
   * @description wrap element of the edit field
   * @type {HTMLelement}
   */
  editfieldwrap: null,
  /**
   * @description stores edit id
   * @type {String}
   */
  editfield_id: null,
  /**
   * @description error callback element if exist
   * @type {HTMLelement}
   */
  errormsg_el: null,
  /**
   * @description field wrap element
   * @type {HTMLelement}
   */
  fieldwrap: null,
  /**
   * @description edit form 
   * @type {HTMLelement}
   */
  form_el: null,
  /**
   * @description field of the original text
   * @type {HTMLelement}
   */
  originaltextfield: null,
  /**
   * @description edit input field
   * @type {HTMLelement}
   */
  textinput: null,
  /**
   * @description ajax object for save changes 
   * @type {Object}
   */
  ajax_save: null,

  /**
   * @description sets default html elements
   */
  construct: function( editfield_id )
  {
    this.editfield_id = editfield_id;
    this.editfieldwrap = Dom.get( "n_" + this.editfield_id + "_editfieldwrap"  );
    this.fieldwrap = Dom.get( "n_" + this.editfield_id + "_fieldwrap"  );
    this.originaltextfield = Dom.get( "n_" + this.editfield_id + "_originaltextfield"  );
    this.textinput = Dom.get( "n_" + this.editfield_id + "_textinput"  );
    this.form_el = Dom.get( "n_" + this.editfield_id + "_form_el"  );
    this.errormsg_el = Dom.get( "n_" + this.editfield_id + "_errormsg"  ) || null;
    return true;
  },
  /**
   * @description shows edit area
   */
  edit: function()
  {
    if ( this.originaltextfield )
    {
      if ( this.originaltextfield.childNodes[0] )
      {
        this.textinput.value = this.originaltextfield.childNodes[0].nodeValue;
      }
      else
      {
        this.textinput.value = this.originaltextfield.value;
      }
    }
    else
    {
      this.textinput.value = "";
    }
    nw.hide( this.fieldwrap );
    nw.show( this.editfieldwrap );
    this.textinput.focus();
  },
  /**
   * @description saves changes
   * @param {Object} options options for handling errors
   */
  save: function( options )
  {
    this.ajax_save = this.ajax_save || new n_ajax_class( null, this.editfieldwrap, this.saveCallback );
    if ( this.errormsg_el )
    {
      nw.hide( this.errormsg_el );
    }
    
    var min = 0;
    var max = 100;
    
    if ( options )
    {
      min = options.min || min;
      max = options.max || max; 
    }

    if ( YAHOO.lang.trim( this.textinput.value ).length <= min )
    {
      if ( this.errormsg_el )
      {
        nw.show( this.errormsg_el );
      }
      else
      {
        nw.alert( __( "Kitöltése kötelező" ) );
      }
      this.textinput.focus();
      return false;
    }
    else if ( YAHOO.lang.trim( this.textinput.value ).length > max )
    {
      if ( this.errormsg_el )
      {
        nw.show( this.errormsg_el );
      }
      else
      {
        nw.alert( __( "A szöveg hossza legfeljebb %num% karakter lehet!", { "%num%": max } ) );
      }
      this.textinput.focus();
      return false;
    }

    this.ajax_save.sendForm( this, this.form_el );
  },
  /**
   * @description callback function for saving changes
   * @param {Object} o transaction
   */
  saveCallback: function( o )
  {
    this.originaltextfield.innerHTML = this.textinput.value;
    this.hide();
    return true;
  },
  /**
   * @description hides edit area
   */
  hide: function()
  {   
    if ( this.errormsg_el )
    {
      nw.hide( this.errormsg_el );
    }
    
    nw.show( this.fieldwrap );
    nw.hide( this.editfieldwrap );
  }
}


/**
 * animation effects
 */
nw.effect = 
{
  afterOpen: function()
  {

  },
  close: function( el )
  {
    el = Dom.get( el );
    var height = nw.getRealHeight( el );
    
    var animate = new YAHOO.util.Anim( el, 
                  {
                    height: { to: 1 } 
                  },
                  0.5,
                  YAHOO.util.Easing.backIn
    );
    
    animate.onComplete.subscribe( function()
    {
      Dom.addClass( el, "n_invisible" );
      this.edit_box.style.height = "";
    }, this, true );
    
    animate.animate();
  },
  fadeManager: function( config )
  {
    this.fadeout_element = config.fadeout_element || null;
    this.fadein_element = config.fadein_element || null;
    
    this.afterFadeOut = function()
    {
      nw.hide( this.fadeout_element );
      if ( !this.fadein_element )
      {
        return true;
      }
      Dom.setStyle( this.fadein_element, "opacity", 0 );
      nw.show( this.fadein_element );
      this.fadeIn();
    }
    
    this.afterFadeIn = function()
    {
      png.hackEntire();
      return true;
    }
    
    this.fadeOut = function()
    {
      var animate = new YAHOO.util.Anim( this.fadeout_element, 
                  {
                    opacity: { to: 0 },
                    zoom: { from: 0,
                            to: 0 }
                  },
                  0.5 );
      animate.onComplete.subscribe( this.afterFadeOut, this, true );
      
      animate.animate();
    }
    
    this.fadeIn = function()
    {
      var animate = new YAHOO.util.Anim( this.fadein_element, 
                  {
                    opacity: { to: 1 },
                    zoom: { from: 0,
                            to: 0 }
                  },
                  0.5 );
      animate.onComplete.subscribe( this.afterFadeIn, this, true );
      
      animate.animate();
    }
  },
  open: function( el )
  {
    el = Dom.get( el );
    var height = nw.getRealHeight( el );
    el.style.height = "0px";
    Dom.removeClass( el, "n_invisible" );
    
    var animate = new YAHOO.util.Anim( el, 
                  {
                    height: { to: height } 
                  },
                  0.5,
                  YAHOO.util.Easing.backOut
    );
    
    animate.onComplete.subscribe( function()
    {
      el.style.height = "auto";
      nw.scrollTo( el );
      nw.effect.afterOpen();
    }, this, true )
    
    animate.animate();
  },
  /**
   * remove HTML element
   * @param {HTMLelement} el element to remove
   */
  remove: function( el )
  {
    el = Dom.get( el );
    el.style.overflow = "hidden";
    var animate = new YAHOO.util.Anim( el,
                  {
                    height: { to: 0 },
                    opacity: { to: 0 }
                  },
                  0.3,
                  YAHOO.util.Easing.backOut
    );
    
    animate.onComplete.subscribe( function()
    {
      el.parentNode.removeChild( el );
    }, this, true );
    
    animate.animate();
    return true;
  }
}

/**
 * validation error handler functions
 * @namespace
 */
var errorHandlers = 
{
  /**
   * hides all error messages in a form
   * 
   * @param {String || HTMLelement} id  form or id of the form
   * @return {Boolean} true if succeed, false else 
   */
  hideAllErrorMsg: function( id )
  {
    var form_el = Dom.get( id );
    if ( !form_el )
    {
      return false;
    }
    
    var form_elements = form_el.elements;
    
    for ( i_elements = 0; i_elements < form_elements.length; i_elements++ )
    {
      this.hideErrorMsg( form_elements[i_elements], "field" );
    }
    
    var block_msgs = Dom.getElementsByClassName( "n_fieldseterrortext", "span" );
    Dom.addClass( block_msgs, "n_invisible" );
    
    var bottom_msgs = Dom.getElementsByClassName( "n_bottomerrortext", "p" );
    Dom.addClass( bottom_msgs, "n_invisible" );
    
    var block_n_bottom_msgs = Dom.getElementsByClassName( "n_fieldseterrortext", "p" );
    Dom.addClass( block_n_bottom_msgs, "n_invisible" );
    
    var block_n_bottom_bottom_msgs = Dom.getElementsByClassName( "n_errormsg_row", "tr" );
    Dom.addClass( block_n_bottom_bottom_msgs, "n_invisible" );
    
    return true;
  },
  /**
   * hides error message<br />
   * 
   * @param {Object} id id of the field<br />
   *   errormessage block's id is 'id'+errormsg<br />
   *   errorsign block's id is 'id'+errorsign <br />
   * @param {Object} [type]
   *   type of the error display "field" || "block"<br />
   *   default is "field"<br />
   */
  hideErrorMsg: function( id, type )
  {
    type = type || "field";
    var el = Dom.get( id );
    id = el.id;
    var is_number_validator = ( id.substring( id.length-2, id.length ) == "_1" ) ? true : false;
    
    if ( is_number_validator )
    {
      id = id.substring( 0, id.length-2 )
    }
    
    var is_date_validator = ( id.substring( id.length-5, id.length ) == "_year" ) ? true : false;
    
    if ( is_date_validator )
    {
      id = id.substring( 0, id.length-5 )
    }
    
    if ( type == "field" )
    {
      var msg_fieldrow,
          msg_field;
      var sign_field;
      
      if ( Dom.get( id + "_errorsign" ) )
      {
        sign_field = Dom.get( id + "_errorsign" )
        Dom.addClass( sign_field, "n_invisible" );
      }
      
      if ( Dom.get( id + "_errormsg" ) )
      {
        msg_fieldrow = Dom.get( id + "_errormsg" )
        msg_field = Dom.getElementsByClassName( "n_forma_errorMessage", "p", msg_fieldrow )[0];
        
        if ( msg_field ) 
        {
          msg_field.innerHTML = "";
        }
        Dom.addClass( msg_fieldrow, "n_invisible" );
      }
    }
    else if ( type == "block" )
    {
      var block = Dom.getAncestorByClassName( el, "n_contentboxinlay" );
      var right = Dom.getElementsByClassName( "n_fieldseterrortext", "*", block )[0];
  
      right.innerHTML = "";
      Dom.addClass( right, "n_invisible" );
      
      return true;    
    }
  },
  highlightManager: function( field_id, type )
  {
    this.field_id = field_id;
    this.type = type || "field";
    this.errorfield_id = field_id + "_errormsg"; 
    this.errorsign_id = field_id + "_errorsign";
    this.init = function()
    {
      var errormsg_id = "";
      var errorsign_id = "";
      var element_to_check = ( Dom.get( field_id ) ||
                               Dom.get( field_id + "_year" ) );
      if ( element_to_check )
      {
        //ie - focus bug
        try
        {
          element_to_check.focus();
        }
        catch( e )
        {

        }
      }
      
      if ( this.type == "field" )
      {
        errormsg_id = this.field_id + "_errormsg";
        errormsg_id = Dom.getElementsByClassName( "n_forma_errorMessage", "p", errormsg_id )[0];
        errorsign_id = this.field_id + "_errorsign";
      }
      else if ( type == "block" )
      {
        var block = Dom.getAncestorByClassName( this.field_id, "n_contentboxinlay" );
        var right = Dom.getElementsByClassName( "n_fieldseterrortext", "*", block )[0];
        errormsg_id = "";
        errorsign_id = right;
      }
      else if ( type == "bottom" )
      {
        errormsg_id = this.field_id + "_errormsg";
        errorsign_id = "";
      }
      else if ( type == "block_n_bottom" )
      {
        errormsg_id = this.field_id + "_errormsg";
        
        var block = Dom.getAncestorByClassName( this.field_id, "n_contentboxinlay" );
        var right = Dom.getElementsByClassName( "n_fieldseterrortext", "*", block )[0];
        
        errorsign_id = right;
      }
      
      var elements_to_animate = [];
      
      if ( errormsg_id != "" )
      {
        if ( Dom.get( errormsg_id ) )
        {
          //zoom hack        
          if ( ie )
          {
            var contentbox = Dom.getAncestorByClassName( Dom.get( errormsg_id ), "n_contentboxinlay" );
            if ( contentbox )
            {
              var orig_bgcolor = Dom.getStyle( contentbox, "background-color" );
              Dom.setStyle( Dom.get( errormsg_id ), "background-color", orig_bgcolor );
            }          
          }
          elements_to_animate.push( errormsg_id );
        }
      }
      if ( errorsign_id != "" )
      {
        if ( !Dom.get( errormsg_id ) )
        {
          
          //zoom hack
          if ( ie )
          {
            var contentbox = Dom.getAncestorByClassName( Dom.get( errorsign_id ), "n_contentboxinlay" );
            if ( contentbox )
            {
              var orig_bgcolor = Dom.getStyle( contentbox, "background-color" );
              Dom.setStyle( Dom.get( errorsign_id ), "background-color", orig_bgcolor );
            }          
          }
          elements_to_animate.push( errorsign_id );
        }
      }
      
      if ( elements_to_animate.length != 0 )
      {
        this.start( elements_to_animate );
      }
      
      if ( errorsign_id != "" )
      {
        if ( Dom.get( errorsign_id ) )
        {
          nw.scrollTo( errorsign_id );
          return true;
        }
      }
      
      if ( errormsg_id != "" )
      {
        if ( Dom.get( errormsg_id ) )
        {
          nw.scrollTo( errormsg_id );
          return true;
        }
      }
    }
    
    this.start = function( anim_el )
    {
      var counter = 1;
     
      var fade_out_anim = new YAHOO.util.Anim( anim_el, 
                  {
                    opacity: { to: 0 }
                  },
                  0.3 );
      fade_out_anim.onComplete.subscribe( function()
      {
        fade_in_anim.animate()
      }, this, true );

      var fade_in_anim = new YAHOO.util.Anim( anim_el, 
                  {
                    opacity: { to: 1 }
                  },
                  0.3 );
      fade_in_anim.onComplete.subscribe( function()
      {
        if ( counter < 3 )
        {
          fade_out_anim.animate();
        }

        counter++;
      }, this, true );
      
      fade_out_anim.animate();
    };

  },
  /**
   * shows error message<br />
   * 
   * @param {Object} id id of the field <br />
   *   errormessage block's id is 'id'+errormsg<br />
   *   errorsign block's id is 'id'+errorsign
   * @param {Object} msg
   *   text of the error message
   * @param {Object} [type]
   *   type of the error display "field" || "block"<br /> 
   *   default is "field"<br />
   */
  showErrorMsg: function( id, msg, type )
  {
    type = type || "field";
    var el = Dom.get( id ) || Dom.get( id+"_1" ) || Dom.get( id+"_year" ) || Dom.get( id+"_field" );
    if ( !el )
    {
      return false;
    }
    
    if ( type == "field" )
    {
      var msg_fieldrow,
          msg_field;
      var sign_field;
      
      if ( eval( "Dom.get( '" + id + "_errormsg' ) != undefined " ) )
      {
        msg_fieldrow = eval( "Dom.get( '" + id + "_errormsg' )");
        msg_field = Dom.getElementsByClassName( "n_forma_errorMessage", "p", msg_fieldrow )[0];
        
        if ( msg_field && msg ) 
        {
          msg_field.innerHTML = msg;
        }
        Dom.removeClass( msg_fieldrow, "n_invisible" );
      }

      if ( eval( "Dom.get( '" + id + "_errorsign' ) != undefined " ) )
      {
        sign_field = eval ( "Dom.get( '"+id+"_errorsign' )" );
        Dom.replaceClass( sign_field, "n_validinputtext", "n_invalidinputtext" );
        sign_field.innerHTML = __( "hiba" );
        Dom.removeClass( sign_field, "n_invisible" );
      }
      
      return true;
    }
    else if ( type == "block" )
    {
      var block = Dom.getAncestorByClassName( el, "n_contentboxinlay" );
      var right = Dom.getElementsByClassName( "n_fieldseterrortext", "*", block )[0];
  
      right.innerHTML = msg;
      Dom.removeClass( right, "n_invisible" );
      
      return true;    
    }
    else if ( type == "bottom" )
    {
      var msg_field;
      
      if ( eval( "Dom.get( '" + id + "_errormsg' ) != undefined " ) )
      {
         msg_field = Dom.get( id + "_errormsg" );
         msg_field.innerHTML = msg;
         Dom.removeClass( msg_field, "n_invisible" );
      }
    }
    else if ( type == "block_n_bottom" )
    {
      var msg_field, msg_field_td;
      
      if ( eval( "Dom.get( '"+id+"_errormsg' ) != undefined " ) )
      {
         msg_field = Dom.get( id+"_errormsg" );
         msg_field_td = Dom.getElementsByClassName( "n_forma_errorMessage", "*", msg_field )[0];
         msg_field_td.innerHTML = msg;
         Dom.removeClass( msg_field, "n_invisible" );
      }
      
      var block = Dom.getAncestorByClassName( el, "n_contentboxinlay" );
      var right = Dom.getElementsByClassName( "n_fieldseterrortext", "*", block )[0];
      right.innerHTML = "Hiba";
      Dom.removeClass( right, "n_invisible" );
      
      return true;   
    }
  },
  /**
   * shows true feedback on field elements
   * 
   * @param {String || HTMLelement} id form element or id of the form element
   * @return {Boolean} true if succeed false else
   */
  showTrueFeedback: function( id )
  {
    var el = Dom.get( id );
    if ( !el )
    {
      return false;
    }
    id = el.id;
    
    var is_number_validator = ( id.substring( id.length-2, id.length ) == "_1" ) ? true : false;
    
    if ( is_number_validator )
    {
      id = id.substring( 0, id.length-2 )
    }
    
    var is_date_validator = ( id.substring( id.length-5, id.length ) == "_year" ) ? true : false;
    
    if ( is_date_validator )
    {
      id = id.substring( 0, id.length-5 )
    }
    
    if ( el.type == "submit" )
    {
      return false;
    }
    
    var msg_fieldrow,
        msg_field;
    var sign_field;
    
    if ( eval( "Dom.get( '"+id+"_errorsign' ) != undefined " ) )
    {
      sign_field = eval ( "Dom.get( '"+id+"_errorsign' )" );
      Dom.replaceClass( sign_field, "n_invalidinputtext", "n_validinputtext" );
      sign_field.innerHTML = __( "rendben" );
      Dom.removeClass( sign_field, "n_invisible" );
    }
    
    if ( eval( "Dom.get( '"+id+"_errormsg' ) != undefined " ) )
    {
      msg_fieldrow = eval( "Dom.get( '"+id+"_errormsg' )");
      msg_field = Dom.getElementsByClassName( "n_forma_errorMessage", "p", msg_fieldrow )[0];
      
      if ( msg_field )
      {
        msg_field.innerHTML = "";
      }
      Dom.addClass( msg_fieldrow, "n_invisible" );
    }
    
    return true;
  }
}

/**
 * indicators
 * @namespace 
 */
var indicator =
{
   /**
   * object for block indicator
   * @type HTMLelement
   */
  indicatorY: null,
  /**
   * iframe tag behind the indicator tag
   * @type HTMLelement  
   */
  indicatorYiframe: null,
  /**
   * hides indicator
   */
  hideIndicator: function()
  {
    Dom.setStyle( this.indicatorY, "top", "0px" );
    Dom.setStyle( this.indicatorY, "left", "0px" );
    Dom.setStyle( this.indicatorY, "width", "0px" );
    Dom.setStyle( this.indicatorY, "height", "0px" );
    Dom.setStyle( this.indicatorYiframe, "top", "0px" );
    Dom.setStyle( this.indicatorYiframe, "left", "0px" );
    Dom.setStyle( this.indicatorYiframe, "width", "0px" );
    Dom.setStyle( this.indicatorYiframe, "height", "0px" );  
      
  },
  /**
   * sets up indicator
   */
  setIndicator: function()
  {
    this.indicatorY = document.createElement( "DIV" );
    this.indicatorYiframe = document.createElement( "IFRAME" );
    var body = document.getElementsByTagName( "body" )[0];
    Dom.setStyle( this.indicatorY, "position", "absolute" );
    Dom.setStyle( this.indicatorY, "top", "0px" );
    Dom.setStyle( this.indicatorY, "left", "0px" );
    Dom.setStyle( this.indicatorY, "width", "0px" );
    Dom.setStyle( this.indicatorY, "height", "0px" );
    Dom.setStyle( this.indicatorY, "opacity", "0.6" );
    Dom.setStyle( this.indicatorY, "z-index", "100000" );
    Dom.setStyle( this.indicatorYiframe, "position", "absolute" );
    Dom.setStyle( this.indicatorYiframe, "border", "0px" );  
    Dom.setStyle( this.indicatorYiframe, "top", "0px" );
    Dom.setStyle( this.indicatorYiframe, "left", "0px" );
    Dom.setStyle( this.indicatorYiframe, "width", "0px" );
    Dom.setStyle( this.indicatorYiframe, "height", "0px" );
    if ( ie )
    {
      Dom.setStyle( this.indicatorYiframe, "visibility", "hidden" );
    }
    body.appendChild( this.indicatorY );
    body.appendChild( this.indicatorYiframe );
  },
  handler: function( el )
  {
    this.el = Dom.get( el );
    this.indicator = null;
    this.iframe = null;
    this.show = function()
    {
      if ( this.indicator )
      {
        this.hide();
      }
      
      this.indicator = document.createElement( "div" );
      this.iframe = document.createElement( "iframe" );
      Dom.setStyle( this.indicator, "position", "absolute" );
      Dom.setStyle( this.indicator, "top", "0px" );
      Dom.setStyle( this.indicator, "left", "0px" );
      Dom.setStyle( this.indicator, "width", "0px" );
      Dom.setStyle( this.indicator, "height", "0px" );
      Dom.setStyle( this.indicator, "opacity", "0.6" );
      Dom.setStyle( this.indicator, "z-index", "100000" );
      Dom.setStyle( this.iframe, "position", "absolute" );
      Dom.setStyle( this.iframe, "border", "0px" );  
      Dom.setStyle( this.iframe, "top", "0px" );
      Dom.setStyle( this.iframe, "left", "0px" );
      Dom.setStyle( this.iframe, "width", "0px" );
      Dom.setStyle( this.iframe, "height", "0px" );
      if ( ie )
      {
        Dom.setStyle( this.iframe, "visibility", "hidden" );
      }
      document.body.appendChild( this.indicator );
      document.body.appendChild( this.iframe );
      
      this.indicator.className="indicatorY";
      
      if ( Dom.hasClass( this.el, "n_invisible" ) )
      {
        return true;
      }
      
      var region = YAHOO.util.Region.getRegion( this.el );
      var newHeight = region.bottom-region.top;
      var newWidth = region.right-region.left;
      var newXY = Dom.getXY( this.el )    
      Dom.setXY( this.indicator, newXY );
      Dom.setStyle( this.indicator, "width", newWidth+"px" );
      Dom.setStyle( this.indicator, "height", newHeight+"px" );
      Dom.setXY( this.iframe, newXY );
      Dom.setStyle( this.iframe, "width", newWidth+"px" );
      Dom.setStyle( this.iframe, "height", newHeight+"px" );
      
      return true;
    };
    this.hide = function()
    {
      if ( !this.indicator )
      {
        return false;
      }
      
      this.indicator.parentNode.removeChild( this.indicator );
      this.iframe.parentNode.removeChild( this.iframe );
      this.indicator = null;
      this.iframe = null;
      return true;
    }
  },
  /**
   * shows indicator
   * 
   * @param {Object} id id of hte block the indicator display above
   */
  showIndicator: function( id )
  {
    if ( !this.indicatorY )
    {
      this.setIndicator();
    }
    this.indicatorY.className="";
    this.indicatorY.className="indicatorY";
    
    var el = Dom.get( id ); 
    var body = document.getElementsByTagName( "body" )[0];
    var region = YAHOO.util.Region.getRegion( el );
    var newHeight = region.bottom-region.top;
    var newWidth = region.right-region.left;
    var newXY = Dom.getXY( el )    

    Dom.setXY( this.indicatorY, newXY );
    Dom.setStyle( this.indicatorY, "width", newWidth+"px" );
    Dom.setStyle( this.indicatorY, "height", newHeight+"px" );
    Dom.setXY( this.indicatorYiframe, newXY );
    Dom.setStyle( this.indicatorYiframe, "width", newWidth+"px" );
    Dom.setStyle( this.indicatorYiframe, "height", newHeight+"px" );
    
  }
}

var header =
{
  handler_class: null,
  initClass: function( id )
  {
    if ( this.handler_class )
    {
      return true;
    }
    else
    {
      this.handler_class = new login_class();
      this.handler_class.construct();
    }
    return true;s
  },
  toggleLoginBox: function()
  {
    this.initClass();
    this.handler_class.toggleLoginBox();
    return true;
  },
  hideLoginBox: function()
  {
    this.handler_class.hideLoginBox();
    return true;
  },
  showPwdReminderForm: function()
  {
    this.handler_class.showPwdReminderForm();
    return true;
  },
  onLoginKeyDown: function( e, input_el )
  {
    if ( !ie )
    {
      return true;
    }
    
    e = Event.getEvent( e );
    var key_code = Event.getCharCode( event );
    if ( key_code == 13 )
    {
      Event.stopEvent( e );
      input_el.form.onsubmit();
      return false;
    }
  },
  submitLogin: function( form_el )
  {
    this.handler_class.submitLogin( form_el );
    return true;
  },
  submitReminder: function( form_el )
  {
    this.handler_class.submitReminder( form_el );
    return true;
  }
}

/**
 * singleton for ajax lightbox
 * @namespace 
 */
var ajax_lightbox =
{
  /**
   * ajax dialog
   */
  ajax_dialog: null,
  ajax_wrap: null,
  dialog_config: null,
    /**
   * hides ajax dialog
   */
  hideAjaxDialog: function()
  {
    if ( this.ajax_dialog )
    {
      this.ajax_dialog.destroy();
      this.ajax_dialog  = null;
    }
  },
  /**
   * opens ajax dialog
   * @return {Boolean} true if succeed, false else 
   */
  onReady: function()
  {
    
  },
  showAjaxDialog: function( url, config )
  {
    this.dialog_config = config;
    if ( !this.ajax_wrap )
    {
      this.ajax_wrap = Dom.get( "ajax_wrap" );
    }
    
    this.hideAjaxDialog();

    nw.openWaiting();
    nw.ajax( url, this.showCallback );
    return true;
  },
  showCallback:
  {
    success:function( o )
    {
      nw.hideWaiting();      
      try 
      {
        var response = JSON.parse( o.responseText );
        if ( response.type == 0 )
        {
          nw.alert( response.message );
          return false;
        }
      }
      catch ( e ) 
      {
        
      }
      ajax_lightbox.ajax_wrap.innerHTML = o.responseText;
      var dialog = ajax_lightbox.ajax_wrap.getElementsByTagName( "div" )[0];
      if ( !dialog )
      {
        return false;
      }
      
      if ( dialog.length == 0 )
      {
        return false;
      }
      
      dialog.id = "ajax_dialog";
      
      var width;
      if ( dialog.style.width )
      {
        width = dialog.style.width;
      }
      else
      {
        width = "auto";
      }
      
      var default_config =
      {
          width: width,
          fixedcenter: true, 
          close: false, 
          draggable: true, 
          zindex: 4,
          modal: true,
          visible: false,
          iframe: true
      }
      
      for ( i in ajax_lightbox.dialog_config )
      {
        default_config[ i ] = ajax_lightbox.dialog_config[i];
      }
  
      var config = default_config;
      
      Dom.removeClass( dialog, "n_invisible" );
      
      ajax_lightbox.ajax_dialog = new YAHOO.widget.Panel("ajax_dialog", config ); 

      ajax_lightbox.ajax_dialog.showEvent.subscribe( function()
      {
        var dialog_iframe = ajax_lightbox.ajax_dialog.iframe;
        Dom.addClass( dialog_iframe, "n_lightboxiframe" );
        if ( linux )
        {
          dialog_iframe.style.visibility = "visible";
        }
      } );

      ajax_lightbox.ajax_dialog.render();
      nw.show( ajax_lightbox.ajax_dialog.element );
      ajax_lightbox.ajax_dialog.show();
      
      //if n_banner lightbox take it to the top
      if ( typeof n_banner != "undefined" )
      {
        n_banner.bringToTop();
      }
      
      ajax_lightbox.onReady();
      return true;
    },
    failure: function()
    {
      nw.hideWaiting();
    }
  }
}

/**
 * singleton for alert lightbox
 * @namespace 
 */
var alert_lightbox =
{
  /**
  * alert dialog
  */
  alert_dialog: null,
  /**
  * hides alert dialog
  */
  hideAlertDialog: function()
  {
    this.alert_dialog.hide();
    if ( this.alert_dialog )
    {
      nw.hide( this.alert_dialog.element );
    }
  },
  /**
  * sets up alert_dialog
  */
  setAlertDialog: function()
  {
    if ( this.alert_dialog )
    {
      return false;
    }
    
    this.alert_dialog = new YAHOO.widget.Panel("alert_dialog",  
      { width:"278px",
        fixedcenter:true, 
        close:false, 
        draggable:false, 
        zindex:4,
        modal:true,
        visible:false,
        iframe: true
      } 
    );
    
    Dom.removeClass( Dom.get( "alert_dialog" ), "n_invisible" );
    
    alert_lightbox.alert_dialog.showEvent.subscribe( function()
    {
      var dialog_iframe = alert_lightbox.alert_dialog.iframe;
      Dom.addClass( dialog_iframe, "n_lightboxiframe" );
      if ( linux )
      {
        dialog_iframe.style.visibility = "visible";
      }
    } );
    
    this.alert_dialog.render();
    
    return true;
  },
  /**
  * opens alert dialog
  * @param {String} text alert text to show
  * 
  * @return {Boolean} true if succeed, false else 
  */
  showAlertDialog: function( text )
  {
    if ( Dom.get( "alert_dialog" ) )
    {
      if ( !this.alert_dialog )
      {
        this.setAlertDialog();
      }
      
      var alert_content = Dom.get( "alert_content" );
      alert_content.innerHTML = text; 
      
      this.alert_dialog.hide();
      nw.show( this.alert_dialog.element );
      this.alert_dialog.show();
      
      //if n_banner lightbox take it to the top
      if ( typeof n_banner != "undefined" )
      {
        n_banner.bringToTop();
      }
      
      return true;
    }
    
    return false;
  }
}

/**
 * singleton for confirm lightbox
 * @namespace 
 */
var confirm_lightbox =
{
  /**
  * confirm dialog
  */
  confirm_dialog: null,
  callbackYes: function()
  {
    
  },
  callbackYesDefault: function()
  {
    this.hideConfirmDialog();
  },
  callbackNo: function()
  {
    this.hideConfirmDialog();
  },
  handleConfirm: function()
  {
    this.callbackYes();
    confirm_lightbox.hideConfirmDialog();
  },
  /**
  * hides confirm dialog
  */
  hideConfirmDialog: function()
  {
    this.confirm_dialog.hide();
    if ( this.confirm_dialog )
    {
      nw.hide( this.confirm_dialog.element );
    }
  },
  /**
  * sets up confirm_dialog
  */
  setConfirmDialog: function()
  {
    if ( this.confirm_dialog )
    {
      return false;
    }
    
    this.confirm_dialog = new YAHOO.widget.Panel("confirm_dialog",  
      { width:"278px",
        fixedcenter:true, 
        close:false, 
        draggable:false, 
        zindex:4,
        modal:true,
        visible:false,
        iframe: true
      } 
    );
    
    confirm_lightbox.confirm_dialog.showEvent.subscribe( function()
    {
      var dialog_iframe = confirm_lightbox.confirm_dialog.iframe;
      Dom.addClass( dialog_iframe, "n_lightboxiframe" );
      if ( linux )
      {
        dialog_iframe.style.visibility = "visible";
      }
    } );
    
    Dom.removeClass( Dom.get( "confirm_dialog" ), "n_invisible" );
    this.confirm_dialog.render();
    
    this.button_yes = Dom.get("confirm_yes_btn");
    return true;
  },
  /**
  * opens confirm dialog
  * @param {String} text alert text to show
  * 
  * @return {Boolean} true if succeed, false else 
  */
  showConfirmDialog: function( text, handleYes )
  {
    if ( Dom.get( "confirm_dialog" ) )
    {
      if ( !this.confirm_dialog )
      {
        this.setConfirmDialog();
      }
      
      var confirm_content = Dom.get( "confirm_content" );
      confirm_content.innerHTML = text; 
      
      if ( handleYes )
      {
        this.callbackYes = handleYes;
      }
      else
      {
        this.callbackYes = this.callbackYesDefault;
      }
      
      this.confirm_dialog.hide();
      nw.show( this.confirm_dialog.element );
      this.confirm_dialog.show();
      
      //if n_banner lightbox take it to the top
      if ( typeof n_banner != "undefined" )
      {
        n_banner.bringToTop();
      }
      return true;
    }
    
    return false;
  }
}

/**
 * singleton for custom lightbox
 * @namespace 
 */
var custom_lightbox = 
{
  act_dialog: null,
  /**
   * array contains instantiated custom dialogs
   */
  custom_dialogs : [],
  iframe: null, 
  /**
   * constructor for setting custom dialog
   * @param {Object} id id of the markup code
   * @param {Object} config config properties for setting custom dialog
   */
  customDialog : function( id, config )
  {
    var width;
    if ( Dom.get( id ).style.width )
    {
      width = Dom.get( id ).style.width;
    }
    else
    {
      width = "auto";
    }
    
    var default_config =
    {
        width: width,
        fixedcenter: true, 
        close: false, 
        draggable: true, 
        zindex: 4,
        modal: true,
        visible: false,
        iframe: true
    }
    
    for ( i in config )
    {
      default_config[ i ] = config[i];
    }

    var config = default_config;
    var custom_dialog = new YAHOO.widget.Panel( id, config );
    
    custom_lightbox.custom_dialogs.push( custom_dialog );
    Dom.removeClass( Dom.get( id ), "n_invisible" );    

    custom_dialog.showEvent.subscribe( function()
    {
      var dialog_iframe = custom_dialog.iframe;
      Dom.addClass( dialog_iframe, "n_lightboxiframe" );
      if ( linux )
      {
        dialog_iframe.style.visibility = "visible";
      }
    } );

    custom_dialog.render();
    return custom_dialog;
  },
  /**
  * hides custom dialog
  */
  hideCustomDialog: function( id )
  {
    for ( i_custom = 0; i_custom < this.custom_dialogs.length; i_custom++ )
    {
      if ( this.custom_dialogs[i_custom].id == id )
      {
        this.custom_dialogs[i_custom].hide();
      }
    }
    
    if ( this.act_dialog )
    {
      nw.hide( this.act_dialog.element );
    }
  },
  /**
  * opens custom dialog
  * 
  * @param {Object} id id of the markup code
  * @param {Object} config config properties for setting custom dialog
  * @return {Boolean} true if succeed, false else 
  * 
  */
  showCustomDialog: function( id, config )
  {
    if ( Dom.get( id ) )
    {
      var act_dialog = null;
      
      for ( i_custom = 0; i_custom < this.custom_dialogs.length; i_custom++ )
      {
        if ( this.custom_dialogs[i_custom].id == id )
        {
          act_dialog = this.custom_dialogs[i_custom];
        }
      }
      
      if ( this.custom_dialogs.length == 0 || !act_dialog )
      {
        if ( Dom.get( id ).parentNode != document.body )
        {
          document.body.appendChild( Dom.get( id ) );
        }
        act_dialog = new this.customDialog( id, config );
      }
      
      this.act_dialog = act_dialog;
      act_dialog.hide();
      nw.show( this.act_dialog.element );
      act_dialog.show();
      
      //if n_banner lightbox take it to the top
      if ( typeof n_banner != "undefined" )
      {
        n_banner.bringToTop();
      }
      
      return true;
    }
    
    return false;
  }
}
/**
 * singleton for waiting lightbox
 * @namespace 
 */
var waiting_lightbox =
{
  /**
   * waiting dialog
   */
  waiting_dialog: null,
    /**
   * hides waiting dialog
   */
  hideWaitingDialog: function()
  {
    if ( !this.waiting_dialog )
    {
      return false;
    }
    this.waiting_dialog.hide();
    if ( this.waiting_dialog )
    {
      nw.hide( this.waiting_dialog.element );
    }
  },
  /**
   * sets up waiting_dialog
   */
  setWaitingDialog: function()
  {
    if ( this.waiting_dialog )
    {
      return false;
    }
    
    this.waiting_dialog = new YAHOO.widget.Panel("waiting_dialog",  
      { width:"240px", 
        fixedcenter:true, 
        close:false, 
        draggable:true, 
        zindex:4,
        modal:true,
        visible:false,
        iframe: true
      } 
    );
    
    waiting_lightbox.waiting_dialog.showEvent.subscribe( function()
    {
      var dialog_iframe = waiting_lightbox.waiting_dialog.iframe;
      Dom.addClass( dialog_iframe, "n_lightboxiframe" );
      if ( linux )
      {
        dialog_iframe.style.visibility = "visible";
      }
    } );
    
    Dom.removeClass( Dom.get( "waiting_dialog" ), "n_invisible" );
    this.waiting_dialog.render();
    
    return true;
  },
  /**
   * opens waiting dialog
   * @return {Boolean} true if succeed, false else 
   */
  showWaitingDialog: function()
  {
    if ( Dom.get( "waiting_dialog" ) )
    {
      if ( !this.waiting_dialog )
      {
        this.setWaitingDialog();
      }
      
      this.waiting_dialog.hide();
      nw.show( this.waiting_dialog.element );
      this.waiting_dialog.show();
      
      //if n_banner lightbox take it to the top
      if ( typeof n_banner != "undefined" )
      {
        n_banner.bringToTop();
      }
      
      return true;
    }
    
    return false;
  }
}

/**
 * rating stars
 * @namespace
 */
var rating_widget =
{
  ratings: [],
  last_is_half: false,
  /**
   * initial methods and properties for rating stars
   *
   */
  _init: function()
  {
    var rating_containers = Dom.getElementsByClassName( "n_ratingcontainer_big", "p" );
    if ( rating_containers.length == 0 )
    {
      return false;
    }

    for ( var i_rating = 0; i_rating < rating_containers.length; i_rating++ )
    {
      var stars = Dom.getElementsByClassName( "n_ratingstar", "a", rating_containers[i_rating] );
      if ( Dom.hasClass( stars[0], "n_passivestar" ) )
      {
        continue;
      }
      this.ratings.push( new rating( rating_containers[i_rating] ) );
    }
  
  }
}

function rating( container )
{
  this.container = container;
  this.mouse_in_container = false;
  this.stars = null;
  this.current_rating = 0;
  this.url = "";
  this.is_during_waiting = false;
  this._init();
}

rating.prototype = 
{
  before_image_url: null,
  after_image_url: null,
  half_image_url: null,
  during_image_url: null,
  _init: function()
  {
    this.before_image_url = static_url + "/images/frontend/n_ratingstarbefore_19.png";
    this.after_image_url = static_url + "/images/frontend/n_ratingstarafter_19.png";
    this.half_image_url = static_url + "/images/frontend/n_ratingstarhalf_19.png";
    this.during_image_url = static_url + "/images/frontend/n_ratingstarduring_19.png";
    
    this.mouse_in_container = false;
    this.stars = Dom.getElementsByClassName( "n_ratingstar", "a", this.container );
    this.current_rating = Dom.getElementsByClassName( "n_afterrating", "a", this.container ).length;
    var url_container = Dom.getPreviousSibling( this.container );
    this.url = url_container.href;

    this.last_star_is_half = false;
    for ( i_star = 0; i_star < this.stars.length; i_star++ )
    {
      if ( Dom.hasClass( this.stars[i_star], "n_halfrating" ) )
      {
        this.last_star_is_half = true;
      }
      Event.on( this.stars[i_star], "mouseover", this.mouseOver, null, this );
      Event.on( this.stars[i_star], "mouseout", this.mouseOut, null, this );
      Event.on( this.stars[i_star], "click", this.mouseClick, null, this );
    }

    if ( this.last_star_is_half )
    {
      this.current_rating++;
    } 
    
    this.sendVoteCallback.scope = this;
  },
  fillEmptyStars: function()
  {
    for ( i_star = 1; i_star <= this.stars.length; i_star++ )
    {
      var act_star = this.stars[i_star - 1];
      Dom.removeClass( act_star, "n_afterrating" );
      Dom.addClass( act_star, "n_beforerating" );
    }
  },
  fillStarsOnHover: function( num )
  {
    for ( i_star = 1; i_star <= this.stars.length; i_star++ )
    {
      var act_star = this.stars[i_star - 1];
      if ( i_star <= num )
      {
        Dom.addClass( act_star, "n_duringrating" );
        Dom.removeClass( act_star, "n_halfrating" );
        if ( ie6 )
        {
          act_star.style.backgroundImage = "none";
          act_star.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.during_image_url + "', sizingMethod='crop');";
        }
      }
      else if ( i_star <= this.current_rating )
      {
        if ( i_star == this.current_rating && this.last_star_is_half )
        {
          Dom.removeClass( act_star, "n_afterrating" );
          Dom.addClass( act_star, "n_halfrating" );
          Dom.removeClass( act_star, "n_duringrating" );
          if ( ie6 )
          {
            act_star.style.backgroundImage = "none";
            act_star.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.half_image_url + "', sizingMethod='crop');";
          }
        }
        else
        {
          Dom.addClass( act_star, "n_afterrating" );
          Dom.removeClass( act_star, "n_halfrating" );
          Dom.removeClass( act_star, "n_duringrating" );
          if ( ie6 )
          {
            act_star.style.backgroundImage = "none";
            act_star.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.after_image_url + "', sizingMethod='crop');";
          }
        }
      }
      else
      {
        if ( ie6 )
        {
          act_star.style.backgroundImage = "none";
          act_star.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.before_image_url + "', sizingMethod='crop');";
        }
        Dom.removeClass( act_star, "n_duringrating" );
      }
    }
  },
  fillFirstNStars: function( num, set_half )
  {
    for ( i_star = 1; i_star <= this.stars.length; i_star++ )
    {
      var act_star = this.stars[i_star - 1];
      Dom.removeClass( act_star, "n_duringrating" );
      if ( i_star < num )
      {
        Dom.addClass( act_star, "n_afterrating" );
        Dom.removeClass( act_star, "n_beforerating" );
        Dom.removeClass( act_star, "n_halfrating" );
        if ( ie6 )
        {
          act_star.style.backgroundImage = "none";
          act_star.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.after_image_url + "', sizingMethod='crop');";
        }
      }
      else if ( i_star == num )
      {
        if ( this.last_star_is_half )
        {
          if ( set_half )
          {
            Dom.addClass( act_star, "n_halfrating" );
            Dom.addClass( act_star, "n_afterrating" );
            Dom.removeClass( act_star, "n_beforerating" );
            if ( ie6 )
            {
              act_star.style.backgroundImage = "none";
              act_star.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.half_image_url + "', sizingMethod='crop');";
            }
          }
          else
          {
            Dom.removeClass( act_star, "n_halfrating" );
            Dom.addClass( act_star, "n_afterrating" );
            Dom.removeClass( act_star, "n_beforerating" );
            if ( ie6 )
            {
              act_star.style.backgroundImage = "none";
              act_star.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.after_image_url + "', sizingMethod='crop');";
            }
          }
        }
        else
        {
          Dom.removeClass( act_star, "n_halfrating" );
          Dom.addClass( act_star, "n_afterrating" );
          Dom.removeClass( act_star, "n_beforerating" );
          if ( ie6 )
          {
            act_star.style.backgroundImage = "none";
            act_star.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.after_image_url + "', sizingMethod='crop');";
          }
        }
      }
      else
      {
        Dom.removeClass( act_star, "n_halfrating" );
        Dom.removeClass( act_star, "n_afterrating" );
        Dom.addClass( act_star, "n_beforerating" );
        if ( ie6 )
        {
          act_star.style.backgroundImage = "none";
          act_star.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.before_image_url + "', sizingMethod='crop');";
        }
      }
    }
    return true;
  },
  getNumberInPlace: function( star )
  {
    for ( i_star = 1; i_star <= this.stars.length; i_star++ )
    {
      if ( star == this.stars[i_star - 1] )
      {
        return i_star; 
      }
    }
  },
  mouseClick: function( e )
  {
    if ( this.is_during_waiting )
    {
      return false;
    }
    var target = Event.getTarget( e );
    var vote_num = this.getNumberInPlace( target );
    nw.openWaiting();
    this.is_during_waiting = true;
    nw.ajax( target.href, this.sendVoteCallback, "post", "vote_num=" + vote_num );
  },
  mouseOver: function( e )
  {
    if ( this.is_during_waiting )
    {
      return false;
    }
    var target = Event.getTarget( e );
    var n = this.getNumberInPlace( target );
    //this.fillFirstNStars( n );
    this.fillStarsOnHover( n );
  },
  mouseOut: function( e )
  {
    if ( this.is_during_waiting )
    {
      return false;
    }
    var target = Event.getTarget( e );
    var related_target = Event.getRelatedTarget( e );
    var out_from_box = true;
    if ( Dom.hasClass( related_target, "n_ratingstar" ) )
    {
      out_from_box = false;
    }
    
    if ( out_from_box )
    {
      this.fillFirstNStars( this.current_rating, true ); 
    }
    return false;
  },
  sendVoteCallback: 
  {
    success: function( o )
    {
      nw.hideWaiting();
      
      this.new_content = o.responseText;                
      var obj = this;
      var reInit = function()
      {
        obj.is_during_waiting = false;
        obj.container.innerHTML = obj.new_content;
        png.hackEntire();
        obj._init();
      }

      this.setStarsWaiting();       
      setTimeout( reInit, 3000 );
    },
    failure: function()
    {
      this.is_during_waiting = false;
      nw.hideWaiting();
    }
  },
  setStarsWaiting: function()
  {
    for ( i_star = 0; i_star < this.stars.length; i_star++ )
    {
      Dom.removeClass( this.stars[i_star], "n_halfrating" );
      Dom.addClass( this.stars[i_star], "n_duringrating" );
      if ( ie6 )
      {
        this.stars[i_star].style.backgroundImage = "none";
        this.stars[i_star].style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.during_image_url + "', sizingMethod='crop');";
      }
    }
  }
}

var search_box =
{
  changeTab: function( num, is_club )
  {
    var active_class; 
    if ( is_club )
    {
      active_class = "n_activetab";
    }
    else
    {
      active_class = "n_compactsearchtab_active";
    }
    
    if ( num == 1 )
    {
      Dom.addClass( Dom.get("n_searchtableft"), active_class );
      Dom.removeClass( Dom.get("n_searchtabright"), active_class );
      Dom.removeClass( Dom.get("n_leftcompactsearchboxwrap"), "n_invisible" );
      Dom.addClass( Dom.get("n_rightcompactsearchboxwrap"), "n_invisible" );
    }
    else if ( num == 2 )
    {
      Dom.addClass( Dom.get("n_searchtabright"), active_class );
      Dom.removeClass( Dom.get("n_searchtableft"), active_class );
      Dom.removeClass( Dom.get("n_rightcompactsearchboxwrap"), "n_invisible" );
      Dom.addClass( Dom.get("n_leftcompactsearchboxwrap"), "n_invisible" );
    } 
  },
  submit: function( form_el )
  {
    var input_el = Dom.getElementsByClassName( "n_compactsearchinput", "input", form_el )[0];
    var inputs = form_el.getElementsByTagName( "input" );
    var search_input;
    for( i_input = 0; i_input < inputs.length; i_input++ )
    {
      var act_input = inputs[i_input];
      if ( act_input.type == "text" )
      {
        search_input = act_input;
        break;
      }
    }
    
    if ( YAHOO.lang.trim( search_input.value ) == "" )
    {
      search_input.focus();
      return false;
    }
    
    return true;
    
  }
}

var n_join = 
{
  join: function( url )
  {
    nw.openWaiting();
    nw.ajax( url, this.joinCallback );
  },
  joinCallback:
  {
    success: function( o )
    {
      nw.hideWaiting();
      indicator.hideIndicator();
      try
      {
        eval( "var error_response = " + o.getResponseHeader['Errormsg'] );
      }
      catch(e)
      {
        
      }
      
      if ( error_response )
      {
        nw.alert( error_response );
        return false; 
      }
      
      try
      {
        eval( "var success_response = " + o.getResponseHeader['Successmsg'] );
      }
      catch(e)
      {
        
      }
      
      if ( success_response )
      {
        if ( n_permission.wait_with_reload )
        {
          n_permission_lb.succeed( success_response );
          return true;
        }
        
        nw.alert( success_response );
        alert_lightbox.hideAlertDialog = function()
        {
          indicator.showIndicator( "alert_dialog" );
          var hash_position = location.href.indexOf( "#" );
          if ( hash_position == -1 )
          {
            location.reload();
          }
          else
          {
            url = location.href.substring( 0, hash_position );
            location.href = url;
          }
          return true;
        }
        return false; 
      }
      
      try 
      {
        var success_json_response = JSON.parse( o.responseText );
        if ( success_json_response.type == 1 )
        {
          if ( n_permission.wait_with_reload )
          {
            n_permission_lb.succeed( success_json_response.message );
            return true;
          }
          
          nw.alert( success_json_response.message );
          alert_lightbox.hideAlertDialog = function()
          {
            indicator.showIndicator( "alert_dialog" );
            
            var hash_position = location.href.indexOf( "#" );
            if ( hash_position == -1 )
            {
              location.reload();
            }
            else
            {
              url = location.href.substring( 0, hash_position );
              location.href = url;
            }
          
            return true;
          }
          return false; 
        }
      }
      catch ( e ) 
      {
        
      }
      
      ajax_lightbox.onReady = function()
      {
        ajax_lightbox.ajax_dialog.center();
        var mask_height = parseInt( Dom.getStyle( Dom.get( "ajax_dialog_mask" ), "height" ) );
        var document_height = Dom.getDocumentHeight();
        if ( document_height > mask_height )
        {
          Dom.setStyle( Dom.get( "ajax_dialog_mask" ), "height", ( document_height + 30 ) + "px" )
        }
        ajax_lightbox.onReady = function(){}
      }
      ajax_lightbox.dialog_config = { fixedcenter: false, constraintoviewport: true }
      ajax_lightbox.ajax_wrap = Dom.get( "ajax_wrap" );
      ajax_lightbox.showCallback.success( o );
    },
    failure: function()
    {
      nw.hideWaiting();
      indicator.hideIndicator();
    }
  }
}

n_join.lightbox =
{
  hide: function()
  {
    nw.hideLightAjax();
  },
  resetErrorMsgs: function()
  {
    var errormsgs = Dom.getElementsByClassName( "n_formerrormessage", "p", Dom.get( "jsForm_clubjoin_question" ) );
    
    for( i_errormsg = 0; i_errormsg < errormsgs.length; i_errormsg++ )
    {
      var act_errormsg = errormsgs[i_errormsg];
      Dom.addClass( act_errormsg, "n_invisible" );
    }
    
    return true;
  },
  submit: function( form_el )
  {
    this.resetErrorMsgs();
  
    if ( !this.validate() )
    {
      return false;
    }
    
    indicator.showIndicator( "ajax_dialog" );
    nw.ajaxForm( form_el, n_join.joinCallback );
  },
  validate: function()
  {
    var errors = [];
    var questions = Dom.getElementsByClassName( "n_joinquestionwrap", "div", Dom.get( "jsForm_clubjoin_question" ) );
    for( i_question = 0; i_question < questions.length; i_question++ )
    {
      var act_question = questions[i_question];
      var error_id = act_question.id + "_errormsg";
      
      var inputs = act_question.getElementsByTagName( "input" );
      
      if ( inputs.length == 0 )
      {
        var area = act_question.getElementsByTagName( "textarea" )[0];
        if ( YAHOO.lang.trim( area.value ).length < 2 ||
             YAHOO.lang.trim( area.value ).length > 1000 )
        {
          errors.push( error_id );
        }
        break;
      }
      
      switch( inputs[0].type )
      {
        case "checkbox":
        case "radio":
          var is_checked = false;
          for( i_cb = 0; i_cb < inputs.length; i_cb++ )
          {
            var act_cb = inputs[i_cb];
            if ( act_cb.checked )
            {
              is_checked = true;
              break;
            }
          }
          
          if ( !is_checked )
          {
            errors.push( error_id );
          }
          break;
        case "text":
          if ( YAHOO.lang.trim( inputs[0].value ).length < 2 ||
               YAHOO.lang.trim( inputs[0].value ).length > 1000 )
          {
            errors.push( error_id );
          }
          break;
        default:
          break;
      }
    }
    
    if ( errors.length == 0 )
    {
      return true;
    }
    else
    {
      for( i_error = 0; i_error < errors.length; i_error++ )
      {
        var act_error = errors[i_error];
        Dom.removeClass( Dom.get( act_error ), "n_invisible" );        
      }
      return false;
    }
  }
}

var n_flash = 
{
  makeAllTransparent: function()
  {
    var embeds = document.getElementsByTagName( "embed" );
    for( i_embed = 0; i_embed < embeds.length; i_embed++ )
    {
      var act_embed = embeds[i_embed];
      new this.setEmbed( act_embed, act_embed.parentNode );
    }

    var objects = document.getElementsByTagName( "object" );
    for( i_object = 0; i_object < objects.length; i_object++ )
    {
      var act_object = objects[i_object];
      new this.setObject( act_object );
    }
    return true;
  },
  setEmbed: function( embed, embed_parent )
  {
    var embed_str = embed_parent.innerHTML;
    embed_str = embed_str.replace( "<embed", "<embed wmode=''" );
    embed_str = embed_str.replace( "<EMBED", "<embed wmode=''" );
    embed_parent.innerHTML = "";
    embed_parent.innerHTML = embed_str;
    return true;
  },
  setObject: function( object )
  {
    var params = object.getElementsByTagName( "param" );
    
    for( i_param = 0; i_param < params.length; i_param++ )
    {
      var act_param = params[i_param];
      if ( act_param.name == "wmode" )
      {
        if ( act_param.value == "" )
        {
          return true;
        }
        else
        {
          act_param.value = "";
          return true;
        }
      }
    }
    var wmode_param = document.createElement( "param" );
    wmode_param.name = "wmode"; 
    wmode_param.value = "";
    object.appendChild( wmode_param );
    var parent_node = object.parentNode;
    var object_str = parent_node.innerHTML;
    parent_node.removeChild( object );
    parent_node.innerHTML = object_str;
    return true;
  }
}

var n_toggler =
{
  unit_class: function()
  {
  },
  
  setUnitClassMethods: function()
  {
    this.unit_class.prototype = 
    {
      id: null,
      container: null,
      label: null,
      real_height: 0,
      animating: false,
      opening_animation: null,
      closing_animation: null,
      openedlabel_class: "",
      closedlabel_class: "",
      
      _construct: function( id, config )
      {
        this.id = id;
        config = config || {};
        
        var container_id = config.container_id || "toggler_container_" ;
        this.container = Dom.get( container_id + this.id );
        var label_id = config.label_id || "toggler_label_" ;
        this.label = Dom.get( label_id + this.id );
        this.openedlabel_class = config.openedlabel_class || "n_openedlabel";
        this.closedlabel_class = config.closedlabel_class || "";
        
        this.container.style.overflow = "hidden";
        this.real_height = nw.getRealHeight( this.container );
        return true;
      },
      
      //common
      /**
       * @description opens/closes anwer container
       */
      toggle: function()
      {
        var is_visible = nw.isVisible( this.container );
        
        if ( this.animating )
        {
          return false;
        }
        
        if ( is_visible )
        {
          this.close();
        }
        else
        {
          this.open();
        }
        
        return true;
      },
    
      
      //open
      ajax_open: null,
      /**
       * @description opens answer container
       */
      open: function()
      {
        var contentbox = Dom.getAncestorByClassName( this.label, "n_contentbox" );
        this.ajax_open = this.ajax_open || new n_ajax_class( this.label.href, contentbox, this.openCallback );
        this.ajax_open.send( this );
        
        return true; 
      },
      
      openCallback: function( o )
      {
        //todo replace
        /*
        //insert cards
        var cardwrap = $( ".n_gallerycardwrap", this.container, true );
        cardwrap.innerHTML = o.responseText;
        
        //insert cleardiv
        var cleardiv = document.createElement( "div" );
        cleardiv.className = "n_clear";
        cardwrap.appendChild( cleardiv );
        
        this.setOpeningContainerAnimation();
        this.container.style.height = "1px";
        nw.show( this.container );
        Dom.removeClass( this.label, this.closedlabel_class );
        Dom.addClass( this.label, this.openedlabel_class );
        png.reSetFilter( this.label );
        this.animating = true;
        this.opening_animation.animate();
        */
      },
      
      /**
       * @description sets opening animation object and the callback
       */
      setOpeningContainerAnimation: function()
      {
        this.real_height = nw.getRealHeight( this.container );
        if ( !this.opening_animation )
        {
          this.opening_animation = new YAHOO.util.Anim( this.container, 
                                                        {
                                                          height: { to: this.real_height } 
                                                        },
                                                        0.8, 
                                                        YAHOO.util.Easing.backOut );
                                                        
          this.opening_animation.onComplete.subscribe( this.openContainerCallback, this, true );
        }
      },
      
      /**
       * @description callback for opening animation
       */
      openContainerCallback: function()
      {
        Dom.addClass( this.label, this.openedlabel_class );
        this.container.style.height = "";
        this.animating = false;
        return true;
      },
      
      
      //close
      /**
       * @descriptin closes answer container
       */
      close: function()
      {
        this.setClosingContainerAnimation();
        this.animating = true;
        this.closing_animation.animate();
      },
      
      /**
       * @description sets closing animation object and the callback
       */
      setClosingContainerAnimation: function()
      {
        if ( !this.closing_animation )
        {
          this.closing_animation = new YAHOO.util.Anim( this.container, 
                                                        {
                                                          height: { to: 1 } 
                                                        },
                                                        0.8, 
                                                        YAHOO.util.Easing.backIn );
                                                        
          this.closing_animation.onComplete.subscribe( this.closeContainerCallback, this, true );
        }
      },
      
      /**
       * @description callback for closing animation
       */
      closeContainerCallback: function()
      {
        Dom.removeClass( this.label, this.openedlabel_class );
        Dom.addClass( this.label, this.closedlabel_class );
        png.reSetFilter( this.label );
        nw.hide( this.container );
        this.container.style.height = "";
        this.animating = false;
        return true;
      }
    }
  },
  
  t_class: function()
  {
  },
  
  setTClassMethods: function()
  {
    this.t_class.prototype =
    {
      units: [],
      getUnitById: function( id )
      {
        for ( i_unit = 0; i_unit < this.units.length; i_unit++ )
        {
          var act_unit = this.units[ i_unit ];
          if ( act_unit.id == id )
          {
            return act_unit;
          }
        }
      },
      
      add: function( id, unit_class, config )
      {
        unit_class = unit_class || n_toggler.unit_class;
        if ( !this.getUnitById( id ) )
        {
          var unit = new unit_class;
          unit._construct( id, config );
          this.units.push( unit );
          return true;
        }
      }
    }
  }
}

n_toggler.setUnitClassMethods();
n_toggler.setTClassMethods();


var n_toggler_unit_class = function()
{
  
}

n_toggler_unit_class.prototype = 
{
  id: null,
  container: null,
  label: null,
  real_height: 0,
  animating: false,
  opening_animation: null,
  closing_animation: null,
  openedlabel_class: "",
  closedlabel_class: "",
  
  _construct: function( id, config )
  {
    this.id = id;
    config = config || {};
    
    var container_id = config.container_id || "toggler_container_" ;
    this.container = Dom.get( container_id + this.id );
    var label_id = config.label_id || "toggler_label_" ;
    this.label = Dom.get( label_id + this.id );
    this.openedlabel_class = config.openedlabel_class || "n_openedlabel";
    this.closedlabel_class = config.closedlabel_class || "";
    
    this.container.style.overflow = "hidden";
    this.real_height = nw.getRealHeight( this.container );
    return true;
  },
  
  //common
  /**
   * @description opens/closes anwer container
   */
  toggle: function()
  {
    var is_visible = nw.isVisible( this.container );
    
    if ( this.animating )
    {
      return false;
    }
    
    if ( is_visible )
    {
      this.close();
    }
    else
    {
      this.open();
    }
    
    return true;
  },

  
  //open
  ajax_open: null,
  /**
   * @description opens answer container
   */
  open: function()
  {
    var contentbox = Dom.getAncestorByClassName( this.label, "n_contentbox" );
    this.ajax_open = this.ajax_open || new n_ajax_class( this.label.href, contentbox, this.openCallback );
    this.ajax_open.send( this );
    
    return true; 
  },
  
  openCallback: function( o )
  {
    //todo replace
    /*
    //insert cards
    var cardwrap = $( ".n_gallerycardwrap", this.container, true );
    cardwrap.innerHTML = o.responseText;
    
    //insert cleardiv
    var cleardiv = document.createElement( "div" );
    cleardiv.className = "n_clear";
    cardwrap.appendChild( cleardiv );
    
    this.setOpeningContainerAnimation();
    this.container.style.height = "1px";
    nw.show( this.container );
    Dom.removeClass( this.label, this.closedlabel_class );
    Dom.addClass( this.label, this.openedlabel_class );
    png.reSetFilter( this.label );
    this.animating = true;
    this.opening_animation.animate();
    */
  },
  
  /**
   * @description sets opening animation object and the callback
   */
  setOpeningContainerAnimation: function()
  {
    this.real_height = nw.getRealHeight( this.container );
    if ( !this.opening_animation )
    {
      this.opening_animation = new YAHOO.util.Anim( this.container, 
                                                    {
                                                      height: { to: this.real_height } 
                                                    },
                                                    0.8, 
                                                    YAHOO.util.Easing.backOut );
                                                    
      this.opening_animation.onComplete.subscribe( this.openContainerCallback, this, true );
    }
  },
  
  /**
   * @description callback for opening animation
   */
  openContainerCallback: function()
  {
    Dom.addClass( this.label, this.openedlabel_class );
    this.container.style.height = "";
    this.animating = false;
    return true;
  },
  
  
  //close
  /**
   * @descriptin closes answer container
   */
  close: function()
  {
    this.setClosingContainerAnimation();
    this.animating = true;
    this.closing_animation.animate();
  },
  
  /**
   * @description sets closing animation object and the callback
   */
  setClosingContainerAnimation: function()
  {
    if ( !this.closing_animation )
    {
      this.closing_animation = new YAHOO.util.Anim( this.container, 
                                                    {
                                                      height: { to: 1 } 
                                                    },
                                                    0.8, 
                                                    YAHOO.util.Easing.backIn );
                                                    
      this.closing_animation.onComplete.subscribe( this.closeContainerCallback, this, true );
    }
  },
  
  /**
   * @description callback for closing animation
   */
  closeContainerCallback: function()
  {
    Dom.removeClass( this.label, this.openedlabel_class );
    Dom.addClass( this.label, this.closedlabel_class );
    png.reSetFilter( this.label );
    nw.hide( this.container );
    this.container.style.height = "";
    this.animating = false;
    return true;
  }
}

var n_toggler_class = function()
{

}

n_toggler_class.prototype = 
{
  units: [],
  getUnitById: function( id )
  {
    for ( i_unit = 0; i_unit < this.units.length; i_unit++ )
    {
      var act_unit = this.units[ i_unit ];
      if ( act_unit.id == id )
      {
        return act_unit;
      }
    }
    
    return false;
  },
  
  add: function( id, unit_class, config )
  {
    unit_class = unit_class || n_toggler.unit_class;
    if ( !this.getUnitById( id ) )
    {
      var unit = new unit_class;
      unit._construct( id, config );
      this.units.push( unit );
      return unit;
    }
    else
    {
      return this.getUnitById( id );
    }
  }
}


var openx=
{
  padding_init: function(zone_id)
  {
    var td_el = Dom.get("openx_td_" + zone_id);
    var div_el = Dom.get("openx_div_" + zone_id);
    
    var beacon_el = Dom.getElementsBy( function( el )
        {
          if ( !el.id )
          {
            return false;
          }
          
          if ( el.id.indexOf( "beacon" ) != -1 )
          {
            return true;
          }
        }, "div", div_el);
    
    if ( beacon_el.length == 0 )
    {
      return false;
    }
    
    Dom.setStyle( td_el, "padding-bottom", "10px" );
    
    return true;
  }
}


var classes = {};



//club
classes.n_club_class = function()
{

}

classes.n_club_class.prototype =
{
  construct: function()
  {

  },
  
  
  
  //delete
  ajax_del: null,
  
  del_redirect_url: "",
  
  del: function( url, clubname, redirect_url )
  {
    this.del_redirect_url = redirect_url;
    this.ajax_del = this.ajax_del || new n_ajax_class( url, document.body, this.delCallback );
    var act_obj = this;
    
    nw.confirm( 
      __( "Biztosan törölni szeretnéd a %name% közösséged?", { '%name%': clubname } ),
      function()
      {
        act_obj.ajax_del.send( act_obj );
        
        return true;
      }
    );
      
    return true;
  },
  
  delCallback: function( o )
  {
    if ( !this.ajax_del.json_response )
    {
      return false;
    }
    
    nw.openLight();
    location.href = this.del_redirect_url;
    return true;
  }
}

var n_club = 
{
  handler_class: null,
  
  initClass: function()
  {
    if ( !this.handler_class )
    {
      this.handler_class = new classes.n_club_class();
      this.handler_class.construct();
    }
    
    return true;
  },
  
  del: function( url, clubname, redirect_url )
  {
    this.initClass();
    this.handler_class.del( url, clubname, redirect_url );
    
    return true;
  }
}



Event.onDOMReady(function()
{
  rating_widget._init();
  n_flash.makeAllTransparent();
});
