var Class = {
  create: function() {
    return function() { 
      this.initialize.apply(this, arguments);
    }
  }
}
Object.extend = function(destination, source) {
  for (property in source) {
    destination[property] = source[property];
  }
  return destination;
}
Object.prototype.extend = function(object) {
  return Object.extend.apply(this, [this, object]);
}
Function.prototype.bind = function(object) {
  var __method = this;
  return function() {
    __method.apply(object, arguments);
  }
}
function $() {
  var elements = new Array();
  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);
    if (arguments.length == 1) 
      return element;
    elements.push(element);
  }
  return elements;
}
LiveDivRequest = Class.create();
LiveDivRequest.prototype = {
   initialize: function( requestOffset, options ) {
      this.requestOffset = requestOffset;
      this.options = options;
   }
};
LiveDiv = Class.create();
LiveDiv.prototype = {
   initialize: function( divId, url, options, meth, caching) {
      if ( options == null )
         options = {};
      this.divId     = divId; 
      this.div       = $(divId);
      this.additionalParms       = options.requestParameters || [];
      this.offset = this.additionalParms['offset']? this.additionalParms['offset'] : 0;
      this.processingRequest = null;
      this.unprocessedRequest = null;
      this.req = new Net_JsHttpRequest_Js()
      this.initAjax(url, meth, caching);
      if ( options.prefetchBuffer) {
         var offset = 0;
         if (options.offset ) {
            offset = options.offset;            
         }
         this.requestContentRefresh(offset);
      }
   },
   setRequestParams: function(arr) {
      this.additionalParms = [];
      this.additionalParms = arr;
   },
   addRequestParams: function(source) {
      for (property in source) {
        this.additionalParms[property] = source[property];
      }
   },
   initAjax: function(url, meth, caching) {
      this.req.caching = (caching  === undefined? false : caching);
      this.req.onreadystatechange = this.ajaxUpdate;
      this.req.arg = this;
      this.req.open((meth  === undefined? 'GET' : meth), url, true);
   },
   handleTimedOut: function() {
      this.processingRequest = null;
      this.processQueuedRequest();
   },
   fetchBuffer: function(offset) {
      this.offset = offset;
      if (this.processingRequest) {
         this.unprocessedRequest = new LiveDivRequest(offset);
         return;
      }
      var bufferStartPos = this.offset;
      this.processingRequest = new LiveDivRequest(offset);
      this.processingRequest.bufferOffset = bufferStartPos;   
      var callParms = []; 
      callParms.id=this.divId;
      if (typeof this.additionalParms == "string")
      {
          callParms.push(this.additionalParms);
      }
      else 
      {
          callParms = callParms.extend(this.additionalParms);
      }    
      callParms.id=this.divId;
      callParms.offset=bufferStartPos;
      this.req.send(callParms);
      this.timeoutHandler = setTimeout( this.handleTimedOut.bind(this), 20000 ); //todo: make as option
   },
   executeAction: function(action, params)
   {
      var bufferStartPos = this.offset;
      var callParms = [];
      for (property in this.additionalParms) {
        callParms[property] = this.additionalParms[property];
      }
      
      callParms.id = this.divId;
      callParms.action = action;
      if (typeof params == "string")
      {
          callParms.push(params);
      }
      else 
      {
          callParms = callParms.extend(params);
      }    
      this.processingRequest = new LiveDivRequest(bufferStartPos, callParms);
      this.processingRequest.bufferOffset = bufferStartPos;   
      this.req.send(callParms);
        
      this.timeoutHandler = setTimeout( this.handleTimedOut.bind(this), 20000 ); //todo: make as option
   },
   executeFunc: function()
   {
       args = executeFunc.arguments;
       callParms = [];
       for (c = 1; c < args.length-1; c++)
           callParms[c] = args[c];
       callParms['xe'] = args[arg.length-1];
       executeAction(args[0], callParms);
   },
   requestContentRefresh: function(contentOffset) 
   {
      this.fetchBuffer(contentOffset);
   },
   ajaxUpdate: function(arg) {
      if (arg)
      {
          try {
             clearTimeout( arg.timeoutHandler );
             var xe;
             if (!((xe = arg.req.responseJS.xe) === undefined))
             {
                eval(xe+'(arg.req.responseJS.html, (arg.req.responseJS.ex === undefined? false : arg.req.responseJS.ex))');
             }
             else
                arg.div.innerHTML=arg.req.responseJS.html;
          }
          catch(err) {}
          finally {
            arg.processingRequest = null; 
          }
          arg.processQueuedRequest();
      }
   },
   processQueuedRequest: function() {
      if (this.unprocessedRequest != null) {
         this.requestContentRefresh(this.unprocessedRequest.requestOffset);
         this.unprocessedRequest = null
      }  
   }
};
function adjustRppLive(liveDiv, rpp)
{
   obj = {};
   obj['rpp'] = rpp;
   liveDiv.addRequestParams(obj);
   liveDiv.fetchBuffer(0);
}
function sortTableLive(liveDiv, column, order)
{
   column = liveDiv.divId+'_'+column;
   obj = {};
   obj[column] = order ;
   liveDiv.setRequestParams(obj);
   liveDiv.fetchBuffer(0);
}
function nextPageLive(divId, prevButtonId, nextButtonId)
{
}
function prevPageLive(divId, prevButtonId, nextButtonId)
{
}

/* Auxuliary function */
function getCookie(name) {
    var prefix = name + "=";
    var cookieStartIndex = document.cookie.indexOf(prefix);
    if(cookieStartIndex == -1) return null;
    var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length);
    if (cookieEndIndex == -1) cookieEndIndex = document.cookie.length;
    
    return unescape(document.cookie.substring(cookieStartIndex + prefix.length, cookieEndIndex));
}


function toggle(elem, typ)
{
    var el = document.getElementById(elem);
    if (el.style.display == 'none')
        el.style.display = 'inline'
    else
        el.style.display = 'none';

}