YAHOO.namespace('mzag.ajax');

function $(id)
{
  return YAHOO.util.Dom.get(id);
}

//==============================================================================
// class AjaxRequest
//==============================================================================
YAHOO.mzag.ajax.AjaxRequest=function(panelId_, panelClass_, panelMethod_, params_, value_)
{
  this.form=null;
  this.fileUpload=false;
  this.callback=null;
  this.panelId='';
  this.panelClass='';
  this.panelMethod='';
  this.request=null;
  this.timeout=10000;
  this.successCallback=null;
  this.failureCallback=null;
  this.errorCallback=null;
  this.params=new Array();
  this.value=value_;
  this.parameter=new Array();
  this.additionalParameters=new Array();
  this.url='';
  this.timeout=60000;

  if(panelId_)
    this.panelId=panelId_;

  if(panelClass_)
    this.panelClass=panelClass_;

  if(panelMethod_)
    this.panelMethod=panelMethod_;

  if(params_)
    this.params=params_;

  return this;
}

YAHOO.mzag.ajax.AjaxRequest.prototype.setForm=function(form_, fileUpload_)
{
  if(fileUpload_)
    this.fileUpload=fileUpload_;

  this.form=form_;
  return this;
}

YAHOO.mzag.ajax.AjaxRequest.prototype.setSuccessCallback=function(callback_)
{
  this.successCallback=callback_;
  return this;
}

YAHOO.mzag.ajax.AjaxRequest.prototype.setFailureCallback=function(callback_)
{
  this.failureCallback=callback_;
  return this;
}

YAHOO.mzag.ajax.AjaxRequest.prototype.setErrorCallback=function(callback_)
{
  this.errorCallback=callback_;
  return this;
}

YAHOO.mzag.ajax.AjaxRequest.prototype.success=function(response_)
{
  YAHOO.mzag.ajax.removeRequest(this, true);
  responseObject=this.parseResponse(response_.responseText);
  // show error message if response includes a error message
  if(responseObject && responseObject.errorMessage)
  {
    if(this.panelId)
      $(this.panelId).disabled='';
    this.showErrorMessage(responseObject.errorMessage);

    if(this.errorCallback)
      this.errorCallback();
    return;
  }
  else if(!responseObject)
  {
    if(this.panelId)
      $(this.panelId).disabled='';
    this.showErrorMessage(response_.responseText);

    if(this.errorCallback)
      this.errorCallback();
    return;
  }
  // load css sources
  if(responseObject.cssResources)
    for(var i=0; i<responseObject.cssResources.length; i++)
      YAHOO.mzag.ajax.loadCss(responseObject.cssResources[i]);
  // load js sources
  if(responseObject.jsResources)
  {
    YAHOO.mzag.ajax.loadingScripts+=responseObject.jsResources.length;
    for(var i=0; i<responseObject.jsResources.length; i++)
      YAHOO.mzag.ajax.loadScript(responseObject.jsResources[i]);
  }
  // replace panels
  if(responseObject.replacement)
  {
      var curRequest=this;
      var interval=window.setTimeout(timeoutFunction=function (){
        if(YAHOO.mzag.ajax.loadingScripts >= 1)
        {
          window.setTimeout(timeoutFunction, 10);
          return;
        }
        YAHOO.mzag.ajax.NodeReplacement.fire(false, responseObject);
        
        // eval prepended jsCode
        if(responseObject.preJsCode)
          for(var i in responseObject.preJsCode)
             eval(responseObject.preJsCode[i]);        
        for(var i in responseObject.replacement)
        {
          // strip script tags
          scripts=YAHOO.mzag.util.extractScripts(responseObject.replacement[i]);
          scriptCleanHtml=YAHOO.mzag.util.stripScripts(responseObject.replacement[i]);
          elements=YAHOO.mzag.ajax.htmlToDom(scriptCleanHtml);
          for(t=0;t<elements.length;t++)
          {
            targetElement=document.getElementById(elements[t].id);
            if(!targetElement && elements[t].id.indexOf('Form')>=0)
              targetElement=document.getElementById(i);
            if(!targetElement)
              alert('Can\'t find element with id: '+elements[t].id);
            replaceElement=elements[t];
            if(typeof console!='undefined')
              console.log('Replace element with id: '+elements[t].id);
            targetElement.parentNode.replaceChild(replaceElement,targetElement);
          }
          for(e=0;e<scripts.length;e++)
            eval(scripts[e]);
        }
        YAHOO.mzag.ajax.NodeReplacement.fire(true);
        
        // eval appended jsCode
        if(responseObject.jsCode)
          for(var i in responseObject.jsCode)
             eval(responseObject.jsCode[i]);
       
        // check for lost tinyMCE editors
        if(typeof tinyMceInstances!='undefined' && tinyMceInstances!==null && typeof tinyMCE!='undefined')  
        for(var i=0;i<tinyMceInstances.length;i++)
        {
          if(!tinyMCE.get(tinyMceInstances[i]))
          {
            delete tinyMceInstances[i];
            continue;
          }
          
          if(!tinyMCE.get(tinyMceInstances[i]).getElement())
            tinyMCE.remove(tinyMCE.get(tinyMceInstances[i]));
        }       
       
        if(curRequest.successCallback && !responseObject.staticReturn)
          curRequest.successCallback();     
      }, 10);
  }
  if(responseObject.staticReturn && curRequest.successCallback)
  {
    curRequest.successCallback(responseObject.staticReturn);  
  }
}

YAHOO.mzag.ajax.AjaxRequest.prototype.failure=function(response_)
{
  YAHOO.mzag.ajax.removeRequest(this, true);
  $(this.panelId).disabled='';
  responseObject=this.parseResponse(response_.responseText);
  if(responseObject)
    errorMessage=responseObject.errorMessage;
  else
    errorMessage=response_.responseText;

  if(typeof errorMessage!='undefined')
    this.showErrorMessage(errorMessage);
}

YAHOO.mzag.ajax.AjaxRequest.prototype.parseResponse=function(json_)
{
  try
  {
    eval(json_);
    return jsonAjaxResponse;
  }
  catch(e)
  {
    return null;
  }
}

YAHOO.mzag.ajax.AjaxRequest.prototype.showErrorMessage=function(message_)
{
  alert(mzagErrorMessage+"!\n\n"+message_);
}

YAHOO.mzag.ajax.AjaxRequest.prototype.setParameter=function(parameter_, value_)
{
  this.additionalParameters[parameter_]=value_;
  return this;
}

YAHOO.mzag.ajax.AjaxRequest.prototype.submit=function()
{
  if(this.form)
  {
    if(typeof tinyMCE!='undefined')
      tinyMCE.triggerSave();
    YAHOO.util.Connect.setForm(this.form, this.fileUpload);
    $(this.panelId).disabled='disabled';
  }

  this.parameter='mzag_ajax_request=1&mzag_ajax_panel_id='+this.panelId+'&mzag_ajax_class='+this.panelClass+'&mzag_ajax_method='+this.panelMethod;
  if(this.panelId && this.form && typeof document.getElementById(this.panelId).value != 'undefined')
  {
    if(typeof $(this.panelId).type == 'undefined' || ($(this.panelId).type!='checkbox' && $(this.panelId).type!='radio') || $(this.panelId).checked)
      this.parameter+='&'+this.panelId+'='+document.getElementById(this.panelId).value;
  }  
  for(var i=0; i<this.params.length;i++)
  {
    if(this.value)
      this.parameter+='&mzag_ajax_params[]='+this.params[i].replace(/MZAGJSVALUE/g, this.value);
    else
      this.parameter+='&mzag_ajax_params[]='+this.params[i];
  }
  for(var param in this.additionalParameters)
  {
    this.parameter+='&'+param+'='+this.additionalParameters[param];
  }
  

  this.url=window.location.href;
  if(this.url.indexOf('#')>-1)
    this.url=this.url.substr(0, this.url.indexOf('#'));

  YAHOO.mzag.ajax.addRequest(this);

  if(this.form)
    return false;
  return this;
}

YAHOO.mzag.ajax.AjaxRequest.prototype.runRequest=function()
{
  this.request=YAHOO.util.Connect.asyncRequest('POST', this.url, this, this.parameter);
}

YAHOO.mzag.ajax.AjaxRequest.prototype.isRunning=function()
{
  if(!this.request)
    return false;
  return YAHOO.util.Connect.isCallInProgress(this.request);
}

YAHOO.mzag.ajax.AjaxRequestSubmit=function(panelId_, panelClass_, panelMethod_, params_, value_, successCallback_)
{
  var request=new YAHOO.mzag.ajax.AjaxRequest(panelId_, panelClass_, panelMethod_, params_, value_);
  if(successCallback_)
    request.setSuccessCallback(successCallback_);
  request.submit();
}

//==============================================================================
// Ajax utility functions
//==============================================================================

// global variables
YAHOO.mzag.ajax.loadingScripts=0;
YAHOO.mzag.ajax.loadedScriptsBuffer=new Array();
YAHOO.mzag.ajax.activeRequests=new Array();
YAHOO.mzag.ajax.loadedFiles=new Array();
YAHOO.mzag.ajax.NodeReplacement=new YAHOO.util.CustomEvent('NodeReplacement');
YAHOO.mzag.ajax.AjaxEvent=new YAHOO.util.CustomEvent('AjaxEvent');

// stores the paths of already loaded CSS and JavaScript files
YAHOO.mzag.ajax.initLoadedFiles=function()
{
  if(YAHOO.mzag.ajax.loadedFiles.length>0)
    return;
  var children=document.getElementsByTagName('head')[0].getElementsByTagName('script');
  for(var i=0; i<children.length; i++)
  {
    path=children[i].src;
    if(path.indexOf('://')<0)
      path=window.location.protocol+'//'+window.location.host+path;
    YAHOO.mzag.ajax.loadedFiles.push(path);
  }
  children=document.getElementsByTagName('head')[0].getElementsByTagName('link');
  for(var i=0; i<children.length; i++)
  {
    if('stylesheet'==children[i].rel)
    {
      path=children[i].href;
      if(path.indexOf('://')<0)
        path=window.location.protocol+'//'+window.location.host+path;      
      YAHOO.mzag.ajax.loadedFiles.push(children[i].href);
    }
  }
}

// subscribe the loading indicator
YAHOO.mzag.ajax.AjaxEvent.subscribe(
  function(eventName_, count_)
  {
    if(count_>0)
    {
      document.body.style.cursor='wait';
      if(document.getElementById('loadingIndicator'))
        YAHOO.util.Dom.setStyle('loadingIndicator', 'display', '');
    }
    else
    {
      document.body.style.cursor='default';
      if(document.getElementById('loadingIndicator'))
        YAHOO.util.Dom.setStyle('loadingIndicator', 'display', 'none');
    }
  }
);

// wrapper for Internet Explorer because IE can't create objects direct per new opener.someclase()
YAHOO.mzag.ajax.wrapAjaxRequest=function(panelId_, panelClass_, panelMethod_, params_, value_)
{
  return new YAHOO.mzag.ajax.AjaxRequest(panelId_, panelClass_, panelMethod_, params_, value_);
}

// add a request to the queue
YAHOO.mzag.ajax.addRequest=function(request_)
{
  YAHOO.mzag.ajax.activeRequests.push(request_);

  running=false;
  for(var i=0; i<YAHOO.mzag.ajax.activeRequests.length; i++)
    if(YAHOO.mzag.ajax.activeRequests[i].isRunning())
      running=true;

  if(!running && YAHOO.mzag.ajax.activeRequests.length>0)
	  YAHOO.mzag.ajax.activeRequests[0].runRequest();

  YAHOO.mzag.ajax.AjaxEvent.fire(YAHOO.mzag.ajax.activeRequests.length);
}

// removes a request from the queue
YAHOO.mzag.ajax.removeRequest=function(request_, startNextRequest_)
{
  if((pos=YAHOO.mzag.util.arraySearch(request_, YAHOO.mzag.ajax.activeRequests))>=0)
    YAHOO.mzag.ajax.activeRequests=YAHOO.mzag.util.arrayDelete(pos, YAHOO.mzag.ajax.activeRequests);

  if(startNextRequest_ && YAHOO.mzag.ajax.activeRequests.length>0)
    YAHOO.mzag.ajax.activeRequests[0].runRequest();

  YAHOO.mzag.ajax.AjaxEvent.fire(YAHOO.mzag.ajax.activeRequests.length);
}

// extracts nodes from the HTML text of a ajx replacement element
YAHOO.mzag.ajax.htmlToDom=function(html_)
{
  element=document.createElement('div');
  element.innerHTML=html_;
  if(element.childNodes.length>0)
  {
    nodes=new Array();
    for(var i=0; i<element.childNodes.length; i++)
    {
      if(element.childNodes[i].nodeType!=3 && element.childNodes[i].nodeType!=8)
      {
        if(!element.childNodes[i].id)
          alert('All root elements in an ajax call replacement muss have an id');
        nodes.push(element.childNodes[i]);
      }
    }
  }
  return nodes;
};

// loads a CSS file dynamically
YAHOO.mzag.ajax.loadCss=function(path_)
{
  YAHOO.mzag.ajax.initLoadedFiles();
  // determine path
  path=window.location.protocol+'//'+window.location.host+path_;
  // search path
  found=false;
  for(i=0; i<YAHOO.mzag.ajax.loadedFiles.length; i++)
  {
    if(YAHOO.mzag.ajax.loadedFiles[i].length < path.length)
      continue;
    if(path==YAHOO.mzag.ajax.loadedFiles[i].substring(0, path.length))
    {
      found=true;
      break;
    }
  }
  // retrieve css
  if(!found)
  {
    YAHOO.mzag.ajax.loadedFiles.push(path);
    var head=document.getElementsByTagName('head')[0];
    var css=document.createElement('link');
    css.rel='stylesheet';
    css.type='text/css';
    css.href=path;
    head.appendChild(css);
  }
}

// loads a JavaScript file dynamically
YAHOO.mzag.ajax.loadScript=function(path_)
{
  YAHOO.mzag.ajax.initLoadedFiles();
  // determine path
  path=window.location.protocol+'//'+window.location.host+path_;
  // search path
  found=false;
  for(i=0; i<YAHOO.mzag.ajax.loadedFiles.length; i++)
  {
    if(YAHOO.mzag.ajax.loadedFiles[i].length < path.length)
      continue;
    if(path==YAHOO.mzag.ajax.loadedFiles[i].substring(0, path.length))
    {
      found=true;
      break;
    }
  }

  // retrieve script
  if(!found)
  {
    YAHOO.mzag.ajax.loadedFiles.push(path);

    if(document.all && (path.indexOf('tiny_mce.js')!=-1 || path.indexOf('tiny_mce_src.js')!=-1))
    {
      window.tinyMCE_GZ={loaded:true};
      window.tinyMCEPreInit={
        suffix: '',
        base: path.substring(0, path.lastIndexOf('/'))
      };
    }
    YAHOO.util.Get.script(path,
    {
      onFailture:function(req) {YAHOO.mzag.ajax.loadingScripts--;},
      onSuccess:function(req) {YAHOO.mzag.ajax.loadingScripts--;},
      onTimeout:function(req) {YAHOO.mzag.ajax.loadingScripts--;},
      timeout: 5000, // 5 second timeout
      data:path
    }
    );
  }
  else
    YAHOO.mzag.ajax.loadingScripts--;
}

// add loaded Scripts to document
YAHOO.mzag.ajax.addScripts=function()
{
  var script,head=document.getElementsByTagName('head')[0];
  // add scripts to document in correct order
  for(var i=0;i<YAHOO.mzag.ajax.loadedFiles.length;i++)
  {
    if(YAHOO.mzag.ajax.loadedScriptsBuffer[YAHOO.mzag.ajax.loadedFiles[i]])
    {
    
      if(YAHOO.mzag.ajax.loadedFiles[i].indexOf('tiny_mce.js')!=-1)
      {
        window.tinyMCE_GZ={loaded:true};
        window.tinyMCEPreInit={
          suffix: '',
          base: YAHOO.mzag.ajax.loadedFiles[i].substring(0, YAHOO.mzag.ajax.loadedFiles[i].lastIndexOf('/'))
        };
      } 
      script=document.createElement('script');
      script.type='text/javascript';
      script.innerHTML=YAHOO.mzag.ajax.loadedScriptsBuffer[YAHOO.mzag.ajax.loadedFiles[i]];
      head.appendChild(script);
    }
  }
}

//==============================================================================
// Misc mzag utility functions
//==============================================================================
YAHOO.namespace('mzag.util');

// simulates click function for all elements 
YAHOO.mzag.util.click=function(element)
{
  if(element.click) 
    return element.click();
  
  if(element.onclick && element.onclick()===false)
    return;
  
  var listeners=YAHOO.util.Event.getListeners(element,'click');
  for(var id=0;listeners && i<listeners.length;i++)
  {
    listeners[i].call();
  }
  
  if(element.tagName.toUpperCase()=='INPUT' && (element.type.toUpperCase()=='SUBMIT' || element.type.toUpperCase()=='IMAGE'))
  {
    if(element.form.onsubmit) element.form.onsubmit();
    element.form.submit();
  } 
  else if(element.tagName.toUpperCase()=='A' && element.href)
  {
    if(element.href.substr(0,11).toLowerCase()=='javascript:')
    {
      eval(element.href.substr(11));
      return;
    }
    if(element.target)
    {
      window.open(element.href,element.target);
    }
    else
    {
      window.location.href=element.href;
    }
  } 
}
YAHOO.mzag.util.monitorTreeCombobox=function(elementId)
{
  if(typeof($(elementId))=='undefined' || $(elementId).nodeName!='SELECT')
    return;
      
  setComboboxTitle=function()
  {
    $(elementId).title=$(elementId)[$(elementId).selectedIndex].title;
  }
  
  setComboboxTitle();
  YAHOO.util.Event.addListener($(elementId), 'keyup', setComboboxTitle);
  YAHOO.util.Event.addListener($(elementId), 'change', setComboboxTitle );  
}

// returns the index of needle in haystack, -1 if not found
YAHOO.mzag.util.arraySearch=function(needle_, haystack_)
{
  for(var i=0; i<haystack_.length; i++)
  {
    if(haystack_[i]==needle_)
      return i;
  }
  return -1;
}

// removes the index from haystack and returns the resulting array
YAHOO.mzag.util.arrayDelete=function(index_, haystack_)
{
  response=new Array();
  for(var i=0; i<haystack_.length; i++)
  {
    if(i!=index_)
      response[response.length]=haystack_[i];
  }
  return response;
}

// returns the <script> tags in the HTML code
YAHOO.mzag.util.extractScripts=function(htmlCode_)
{
  var matchAll=new RegExp('(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 'img');
  var matchOne=new RegExp('(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 'im');

  var code = (htmlCode_.match(matchAll) || []);
  var results = [];
  for (var item in code)
  {
    results.push((code[item].toString().match(matchOne) || ['', ''])[1].replace(/\<\!\-\-/, '').replace(/\-\-\>/, ''));
  }
  return results;
}

// removes all <script> tags from the HTML code
YAHOO.mzag.util.stripScripts=function(htmlCode_)
{
  return htmlCode_.replace(new RegExp('(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 'img'), '');
}

// returns a clone of the object
YAHOO.mzag.util.clone=function(obj_)
{
  var myObj=new Object();
  for(var i in obj_)
    myObj[i]=obj_[i];
  return myObj;
}

// returns the ID of the element in a format usable as a JavaScript variable name
YAHOO.mzag.util.getJSID=function(element_)
{
  element=$(element_);
  return element.id.split('-').join('_');
}

// returns the checked values of the grid element
YAHOO.mzag.util.getGridSelection=function(element_)
{
  element=$(element_);
  var result=new Array();
  formElement=document.getElementsByName(element.id+'Selection[]');
  for(i=0; i<formElement.length; i++)
  {
    if(formElement[i].checked==true)
      result.push(formElement[i].value);
  }
  return result;
}

// sets the checked state of all checkboxes of the grid element
YAHOO.mzag.util.updateGridSelection=function(name_, checked_)
{
  formElements=document.getElementsByName(name_);
  for(i=0; i<formElements.length; i++)
    formElements[i].checked=checked_;
  return false;
}

// sets the checked state of all checkboxes of the checkboxes container
YAHOO.mzag.util.updateCheckboxesSelection=function(id_, checked_, className_)
{
  if(!className_)
    className_='mzag_gui_checkbox';
  checkboxes=YAHOO.util.Dom.getElementsByClassName(className_, 'input', id_);
  for(i=0; i<checkboxes.length; i++)
    checkboxes[i].checked=checked_;
  return false;
}


// sets the checked state of all checkboxes of the checkboxes container
YAHOO.mzag.util.updateListboxSelection=function(id_, selected_)
{
  options=$(id_).childNodes;
  for(i=0; i<options.length; i++)
  {
    if('OPTION'==options[i].nodeName)
      options[i].selected=selected_;
   }
  return false;
}

YAHOO.mzag.util.autosizeTriggered=false;

YAHOO.mzag.util.afterAutosizeWindow=new YAHOO.util.CustomEvent('afterAutosizeWindow');

// resizes the window to the element's size with the specified paddings
YAHOO.mzag.util.autosizeWindow=function(element_, widthOffset_, heightOffset_, doNotShrink_, autoposition_)
{
  // set a unique window name
  if(!window.name)
    window.name='mzag_popup_'+new Date().getTime();
  var windowNames=Cookie.get('mzagMovedPopups');
  // don't position the window if the user repositioned it manually before
  if(windowNames && YAHOO.mzag.util.arraySearch(window.name, windowNames.split(';'))>=0)
    window.allowRepositioning=false;
  if(typeof window.allowRepositioning=='undefined')
    window.allowRepositioning=true;

  var element=$(element_);
  if(typeof tinyMCE!='undefined'  && !YAHOO.mzag.util.autosizeTriggered)
  {
    YAHOO.mzag.util.autosizeTriggered=true
    YAHOO.mzag.util.tinyMCEInit.subscribe(function(){
      YAHOO.mzag.util.autosizeWindow(element_, widthOffset_, heightOffset_, doNotShrink_);
    });
  }
  if(element)
  {
    if((element.offsetWidth==0 || element.offsetHeight==0))
      return;
    if(!window.opener)
      return;
    if(typeof widthOffset_=='undefined')
      widthOffset_=50;
    if(typeof heightOffset_=='undefined')
      heightOffset_=50;
    if(typeof autoposition_=='undefined')
      autoposition_=true;
    if(typeof doNotShrink_=='undefined')
      doNotShrink_=false;
      
    var newWidth=Math.min(element.offsetWidth+widthOffset_, screen.width-100);
    var newHeight=Math.min(element.offsetHeight+heightOffset_, screen.height-100);
    var windowSize=YAHOO.mzag.util.getWindowSize();
    
    if(doNotShrink_)
    {
      newWidth=Math.max(newWidth, windowSize.width);
      newHeight=Math.max(newHeight, windowSize.height);
    }

    if(newWidth!=windowSize.width || newHeight!=windowSize.height)
      window.resizeTo(newWidth, newHeight);
      
    if(autoposition_ && window.allowRepositioning)
    {
      windowSize=YAHOO.mzag.util.getWindowSize();
      window.moveTo(Math.max(Math.round((screen.width-windowSize.width)/2), 0),
                    Math.max(Math.round((screen.height-windowSize.height)/2), 0));
    }
    window.lastPosition=YAHOO.mzag.util.getWindowPosition();
  }
  YAHOO.mzag.util.afterAutosizeWindow.fire();
  
  // 
  YAHOO.mzag.util.WindowMonitor.enable(1000, false);
  YAHOO.mzag.util.WindowMonitor.windowMovedEvent.subscribe(function() 
  {
    window.allowRepositioning=false;
    if(windowNames)
      windowNames+=';';
    else
      windowNames='';
    windowNames+=window.name;
    Cookie.set('mzagMovedPopups', windowNames);
  });
}


YAHOO.mzag.util.WindowMonitor=
{
  windowMovedEvent:new YAHOO.util.CustomEvent('windowMovedEvent'),
  lastPosition:{offsetX:0, offsetY:0},
  monitorInterval:null,
  windowMoved:false,
  monitorContinuousPosition:function()
  {
    var currentPosition=YAHOO.mzag.util.getWindowPosition();
    if(currentPosition.offsetX!=this.lastPosition.offsetX || currentPosition.offsetX!=this.lastPosition.offsetX)
    {
      this.lastPosition=YAHOO.mzag.util.getWindowPosition();
      this.windowMovedEvent.fire();
    }
  },
  monitorPosition:function()
  {
    var currentPosition=YAHOO.mzag.util.getWindowPosition();
    if(currentPosition.offsetX!=this.lastPosition.offsetX || currentPosition.offsetX!=this.lastPosition.offsetX)
    {
      this.disable();
      this.windowMoved=true;
      this.windowMovedEvent.fire();
    }
  },
  enable:function(intervalMsec_ /* default: 1000 */, continuous_ /* default: true */)
  {
    if(this.monitorInterval!=null)
      return;
      
    if(typeof continuous_=='undefined')
      continuous_=true;
      
    this.lastPosition=YAHOO.mzag.util.getWindowPosition();
    var that=this;
    if(continuous_)
      this.monitorInterval=setInterval(function(){that.monitorContinuousPosition.call(that);}, intervalMsec_?intervalMsec_:1000);
    else
      this.monitorInterval=setInterval(function(){that.monitorPosition.call(that);}, intervalMsec_?intervalMsec_:1000);
  },
  disable:function(clearIntervalOnly_)
  {
    clearInterval(this.monitorInterval);
  }
}

// returns an object if a offsetX and a offsetY field
YAHOO.mzag.util.getWindowPosition=function()
{
  var offsetX, offsetY;
  if(typeof window.screenX=='undefined')
  {
    offsetX=window.screenLeft;
    offsetY=window.screenTop;
  }
  else
  {
    offsetX=window.screenX;
    offsetY=window.screenY;    
  }
  return {offsetX:offsetX, offsetY:offsetY};
}

YAHOO.mzag.util.getWindowSize=function()
{
  var width, height;
  if(typeof window.outerWidth=='undefined')
  {
    width=document.body.clientWidth; 
    height=document.body.clientHeight; 
  }
  else
  {
    width=window.outerWidth; 
    height=window.outerHeight;
  }
  return {width:width, height:height};
}

// returns the nested form tag around the specified element, if any
YAHOO.mzag.util.getParentForm=function(target_)
{
  parentNode=$(target_).parentNode;
  if('FORM'==parentNode.nodeName)
    return parentNode;
  while(parentNode=parentNode.parentNode)
  {
    if('FORM'==parentNode.nodeName)
      return parentNode;
  }
  return null;
}

// checks if child is a (nested) subnode of parent
YAHOO.mzag.util.isChildOf=function(child_, parent_)
{
  if($(child_)==null)
    return false;
  parentNode=$(child_).parentNode;
  var parent=$(parent_);
  if(null==parentNode)
    return false;
  while(parentNode=parentNode.parentNode)
  {
    if(parentNode==parent)
      return true;
  }
  return false;
}

// finds all nested child nodes of root with a "lang" attribute, shows those
// with the specified language and hides the others
YAHOO.mzag.util.showLanguage=function(root_, language_, preserveValue_)
{
  preservedLanguage=Cookie.get(root_+'_language');
  var language=preserveValue_&&preservedLanguage?preservedLanguage:language_;
  if(!preserveValue_)
    Cookie.set(root_+'_language', language);
  elements=YAHOO.util.Dom.getElementsBy(function(element){return element.lang;}, null, root_);
  for(i=0; i<elements.length; i++)
  {
    if(elements[i].lang==language)
      YAHOO.util.Dom.setStyle(elements[i], 'display', '');
    else
      YAHOO.util.Dom.setStyle(elements[i], 'display', 'none');
  }
}

// used by GUI_Panel_Navigation
YAHOO.mzag.util.setActiveNavigationNode=function(id_, parent_, excludeTree_)
{
  elements=YAHOO.util.Dom.getElementsByClassName('mzag_gui_navigation_nav', 'div', $(parent_));
  for(i=0; i<elements.length; i++)
  {
    if(elements[i].id==id_ && !YAHOO.util.Dom.getElementsByClassName('mzag_gui_tree', 'div', elements[i]).length)
      YAHOO.util.Dom.addClass(elements[i], 'mzag_gui_navigation_active');
    else
      YAHOO.util.Dom.removeClass(elements[i], 'mzag_gui_navigation_active');
  }
  if(true===excludeTree_)
    return;
  elements=YAHOO.util.Dom.getElementsByClassName('mzag_gui_selected_tree_node', 'a', $(parent_));
  for(i=0; i<elements.length; i++)
  {
    if(!YAHOO.util.Dom.isAncestor(id_, elements[i]))
      YAHOO.util.Dom.removeClass(elements[i], 'mzag_gui_selected_tree_node');
  }
}

// used in cms module for the template chooser panel
YAHOO.mzag.util.selectTemplate=function(panel_, parentPanel_, template_, templateName_, filterFields_)
{
  // set new panel value
  $(panel_).value=templateName_;
  // highlight selected template and un-highlight previous selected template
  oldTemplate=YAHOO.util.Dom.getElementsByClassName('mzag_cms_template_cmstplselected', null, $(panel_+'Div'))[0];
  YAHOO.util.Dom.addClass(oldTemplate, 'mzag_cms_template_cmstpl');
  YAHOO.util.Dom.removeClass(oldTemplate, 'mzag_cms_template_cmstplselected');
  YAHOO.util.Dom.removeClass($(template_), 'mzag_cms_template_cmstpl');
  YAHOO.util.Dom.addClass($(template_), 'mzag_cms_template_cmstplselected');
  // hide all fields which are not contained in filterFields
  if(filterFields_.length>0)
    YAHOO.mzag.util.hidePageFields(parentPanel_, filterFields_);
  // show all fields if filterFields is empty
  else
  {
    elements=YAHOO.util.Dom.getElementsByClassName('mzag_container_row', 'tr', $(parentPanel_));
    for(i=0; i<elements.length; i++)
    {
      if(filterFields_.indexOf(elements[i].id.substr(20+parentPanel_.length))<0)
        YAHOO.util.Dom.setStyle(elements[i], 'display', '');
    }
  }
  YAHOO.mzag.util.autosizeWindow(parentPanel_+'Content', 120, 200);
}

// used in cms module for the template chooser panel
YAHOO.mzag.util.hidePageFields=function(parentPanel_, filterFields_)
{
  protectedFields=new Array('id', 'created_at', 'updated_at', 'created_by', 'updated_by', 'template');
  elements=YAHOO.util.Dom.getElementsByClassName('mzag_container_row', 'tr', $(parentPanel_));
  for(i=0; i<elements.length; i++)
  {
    name=elements[i].id.substr(20+parentPanel_.length);
    if(filterFields_.indexOf(name)<0 && protectedFields.indexOf(name)<0)
      YAHOO.util.Dom.setStyle(elements[i], 'display', 'none');
    else
      YAHOO.util.Dom.setStyle(elements[i], 'display', '');
  }
}

// clicks the first button with the specified CSS class name 'mzag_submit_button'
YAHOO.mzag.util.pressButtonByClassName=function(parentNode_)
{
  var parNode=$(parentNode_);
  while(YAHOO.mzag.pressButton.active && parNode.tagName!='FORM' && typeof parNode.parentNode!=='undefined')
  {
    links=YAHOO.util.Dom.getElementsByClassName('mzag_submit_link', '', parNode);
    buttons=YAHOO.util.Dom.getElementsByClassName('mzag_submit_button', '', parNode);

    if(!buttons.length && !links.length)
    {
      parNode=parNode.parentNode;
    }
    else
    {
      if(buttons.length)
      {
        buttons[0].click();
        return false;
      }
      if(links.length)
      {
        links[0].onclick();
        return false;
      }
    }
  }
  return false;
}

YAHOO.mzag.util.addEventsToInputFields=function()
{
  var inputs=document.getElementsByTagName('input');
  for(i=0; i<inputs.length; i++)
  {
    if((inputs[i].getAttribute('type')=='text'  || inputs[i].getAttribute('type')=='password') && !YAHOO.util.Dom.hasClass(inputs[i], 'mzag_gui_textbox_avoidsubmithandling'))
    {
      if(!YAHOO.util.Event.getListeners(inputs[i], 'keydown'))
        YAHOO.util.Event.addListener(inputs[i], 'keydown', YAHOO.mzag.util.checkPressButtonByClassName);
    }
  }
}
YAHOO.mzag.util.checkPressButtonByClassName=function(event_)
{
  YAHOO.mzag.util.registerLeaveMessage(event_);
  if(event_.keyCode==13)
  {
    YAHOO.util.Event.preventDefault(event_);
    // we cannot search the button to press here, since Firefox triggers the
    // default event regardless to preventDefault() if the request handling
    // takes "too much" (which may be very little) time
    if(this.parentNode.id)
      window.setTimeout('YAHOO.mzag.util.pressButtonByClassName(\''+this.parentNode.id+'\');', 10);
    else
    {
      parNode=this.parentNode;
      while(typeof parNode.parentNode!=='undefined')
      {
        parNode=parNode.parentNode;
        if(parNode.id)
        {
          window.setTimeout('YAHOO.mzag.util.pressButtonByClassName(\''+parNode.id+'\');', 10);
          break;
        }
      }
    }
    return false;
  }
}
YAHOO.util.Event.addListener(window, 'load', YAHOO.mzag.util.addEventsToInputFields);
YAHOO.mzag.ajax.NodeReplacement.subscribe(YAHOO.mzag.util.addEventsToInputFields);
YAHOO.mzag.pressButton={active:true};

// register onleave listener, if control is active show confirm dialog
YAHOO.mzag.leaveMessageOnSubmit={check:false};
YAHOO.mzag.leaveMessage={check:false};
YAHOO.mzag.util.addEventsToElements=function()
{  
  var textareas=document.getElementsByTagName('textarea');
  for(var i=0; i<textareas.length; i++)
  {    
    if(!YAHOO.util.Event.getListeners(textareas[i], 'keyup'))
      YAHOO.util.Event.addListener(textareas[i], 'keyup', YAHOO.mzag.util.registerLeaveMessage);
  }
  var selects=document.getElementsByTagName('select');
  for(var i=0; i<selects.length; i++)
  {    
    if(!YAHOO.util.Event.getListeners(selects[i], 'change'))
      YAHOO.util.Event.addListener(selects[i], 'change', YAHOO.mzag.util.registerLeaveMessage);
  }
  var selects=document.getElementsByTagName('select');
  for(var i=0; i<selects.length; i++)
  {    
    if(!YAHOO.util.Event.getListeners(selects[i], 'change'))
      YAHOO.util.Event.addListener(selects[i], 'change', YAHOO.mzag.util.registerLeaveMessage);
  } 
  var checkboxes=document.getElementsByTagName('input');
  for(var i=0; i<checkboxes.length; i++)
  {    
    if(checkboxes[i].type=='checkbox' && !YAHOO.util.Event.getListeners(checkboxes[i], 'click'))
      YAHOO.util.Event.addListener(checkboxes[i], 'click', YAHOO.mzag.util.registerLeaveMessage);
  }  
  
  var elements=YAHOO.util.Dom.getElementsByClassName('mzag_leave_element');
  for(var i=0; i<elements.length; i++)
  {        
    if(!YAHOO.util.Event.getListeners(elements[i], 'click'))
      YAHOO.util.Event.addListener(elements[i], 'click', deactivateControl);
  }
}
YAHOO.mzag.util.registerLeaveMessage=function(event_)
{
  var keysToListen={
    keys:[// A-Z
          65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
          78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
          // a-z
          97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
          110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122,
          // 0-9
          48, 49, 50, 51, 52, 53, 54, 55, 56, 57
         ]
  };  
  if(false==YAHOO.mzag.leaveMessage.check && YAHOO.mzag.util.arraySearch(event_.keyCode, keysToListen) && !YAHOO.util.Dom.hasClass(event_.target, 'mzag_gui_searchbox'))
    YAHOO.mzag.util.activateLeaveMessage();
}
YAHOO.mzag.util.activateLeaveMessage=function()
{ 
  YAHOO.mzag.leaveMessage.check=true;
}
YAHOO.mzag.util.deactivateLeaveMessage=function()
{
  YAHOO.mzag.leaveMessage.check=false;
}

YAHOO.util.Event.addListener(window, 'load', YAHOO.mzag.util.addEventsToElements);

YAHOO.mzag.util.preserveImageRatio=function(e,obj) 
{
  if (!obj) obj=e;
  var element1=obj.elemWidth;
  var element2=obj.elemHeight;
  var element1Value=parseInt(obj.elemWidthValue);
  var element2Value=parseInt(obj.elemHeightValue);
  var ratio=element1Value/element2Value;
  if(element1 == this.id)
  {
    this.value=this.value.length?(isNaN(parseInt(this.value))?1:parseInt(this.value)):'';
    if(parseInt(this.value) > element1Value && !obj.noMaxResize)
      this.value=element1Value;
    
    $(element2).value=parseInt(this.value)?Math.ceil(parseInt(this.value)/ratio):0;
  }
  else if(element2 == this.id)
  {
    this.value=this.value.length?(isNaN(parseInt(this.value))?1:parseInt(this.value)):'';
    if(parseInt(this.value) > element2Value && !obj.noMaxResize)
      this.value=element2Value;
    
    $(element1).value=parseInt(this.value)?Math.ceil(parseInt(this.value)*ratio):0;
  }
}

YAHOO.mzag.util.tinyMCEInit=new YAHOO.util.CustomEvent("tinymceInit"); 

//==============================================================================
// Tree cookie functions
//==============================================================================
YAHOO.mzag.util.registerTreeEvents=function(tree_)
{
  tree_.subscribe('expand',function(node_) { YAHOO.mzag.util.onExpandTreeNode(tree_.id, node_); });
  tree_.subscribe('collapse',function(node_) { YAHOO.mzag.util.onCollapseTreeNode(tree_.id, node_); });
}

YAHOO.mzag.util.onExpandTreeNode=function(treeId_, node_)
{
  try
  {
    YAHOO.mzag.util.cookieAddNode(treeId_, node_);
  }
  catch(e){ return; }
}

YAHOO.mzag.util.onCollapseTreeNode=function(treeId_, node_)
{
  try
  {
    YAHOO.mzag.util.cookieRemoveNode(treeId_, node_);
  }
  catch(e){ return; }
}

YAHOO.mzag.util.cookieAddNode=function(id_, node_)
{
  var cookieData=Cookie.get(id_+'_expandedIds');
  if(cookieData)
    cookieData=cookieData.split('-');
  else
    cookieData=new Array();

  var newCookieData=new Array();
  for(var i=0; i<cookieData.length; i++)
  {
    if(node_.data.id!=cookieData[i] && cookieData[i].length>0)
      newCookieData.push(cookieData[i]);
  }
  newCookieData.push(node_.data.id);
  Cookie.set(id_+'_expandedIds', newCookieData.join('-'));
}

YAHOO.mzag.util.cookieRemoveNode=function(id_, node_)
{
  var cookieData=Cookie.get(id_+'_expandedIds');
  if(cookieData)
    cookieData=cookieData.split('-');
  else
    cookieData=new Array();

  newCookieData=new Array();
  for(var i=0;i<cookieData.length;i++)
  {
    if(node_.data.id!=cookieData[i] && cookieData[i].length>0)
      newCookieData.push(cookieData[i]);
  }
  Cookie.set(id_+'_expandedIds', newCookieData.join('-'));
}

YAHOO.mzag.util.cookieExpandNodes=function(tree_, selectedNode_)
{
  var id_=tree_.id;
  var cookieDataTmp=Cookie.get(id_+'_expandedIds');

  if(cookieDataTmp)
    cookieData=cookieDataTmp.split('-');
  else
    cookieData=new Array();

  for(var cookie in cookieData)
  {
    try
    {
      curExpand=tree_.getNodeByProperty('id', cookieData[cookie]);
      if(curExpand)
        curExpand.expand();
    }
    catch(e)
    {
      //tree element does not exist
    }
  }
}

//==============================================================================
// class Cookie (copied from scriptaculous, no restricting license)
//==============================================================================
var Cookie =
{
  set: function(name_, value_, daysToExpire_)
  {
    var expire='';
    if (daysToExpire_!=undefined)
    {
      var d=new Date();
      d.setTime(d.getTime()+(86400000*parseFloat(daysToExpire_)));
      expire='; expires='+d.toGMTString();
    }
    return (document.cookie=escape(name_)+'='+escape(value_||'')+expire);
  },
  get: function(name_)
  {
    var cookie=document.cookie.match(new RegExp('(^|;)\\s*'+escape(name_)+'=([^;\\s]*)'));
    return (cookie?unescape(cookie[2]):null);
  },
  erase: function(name_)
  {
    var cookie=Cookie.get(name_)||true;
    Cookie.set(name_, '', -1);
    return cookie;
  },
  accept: function()
  {
    if(typeof navigator.cookieEnabled=='boolean')
      return navigator.cookieEnabled;
    Cookie.set('_test', '1');
    return (Cookie.erase('_test')==='1');
  }
};
if(typeof YAHOO.mzag.util.documentLoaded == 'undefined') 
  YAHOO.mzag.util.documentLoaded=false;
  
YAHOO.mzag.util.onDomReady=new YAHOO.util.CustomEvent('onDomReady');

YAHOO.util.Event.onAvailable('mzag_render_end', function() 
{
  YAHOO.mzag.util.onDomReady.fire();
  YAHOO.mzag.util.documentLoaded=true;
});