var rsCommon = {
  debug: function(arr,level) {
    var dumped_text = "";
    if(!level) level = 0;
    //The padding given at the beginning of the line.
    var level_padding = "";
    for(var j=0;j<level+1;j++) level_padding += "    ";
    if(typeof(arr) == 'object') { //Array/Hashes/Objects 
      for(var item in arr) if(item != null) {
        var value = arr[item];
        if(typeof(value) == 'object') { //If it is an array,
          dumped_text += level_padding + "'" + item + "' ...\n";
          dumped_text += dump(value,level+1);
        } else {
          dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
        }
      }
    } else { //Stings/Chars/Numbers etc.
      dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
    }
    alert(dumped_text);
  },
  typeOf: function(value) {
    var s = typeof value;
    if(s === 'object') {
      if(value) {
        if(typeof value.length === 'number' &&
           !(value.propertyIsEnumerable('length')) &&
           typeof value.splice === 'function') {
          s = 'array';
        }
      } else {
        s = 'null';
      }
    }
    return s;
  }, 
  isEmpty: function(o) {
    if((o === null) || (typeof o === 'undefined')) {
      return true;
    }
    return false;
  },
  trim: function(s) {
    return s.replace(/^\s+|\s+$/g, "");
  },
  int: function(aValue, aDefault) {
    //var res = (aValue - 0);
    var res = Number(aValue);
    if(isNaN(res)) {
      if(arguments.length >= 2) {
        res = aDefault;
        if(isNaN(res)) {
          res = 0;
        }
      } else {
        res = 0;
      }
    }
    return res;
  },
  getClientWidth: function() {
    var res = 800;
    if(window.innerWidth) {
      res = window.innerWidth;
    } else if(document.documentElement && document.documentElement.clientWidth) {
      res = document.documentElement.clientWidth;
    } else if(document.body) {
      res = document.body.clientWidth;
    }
    return res;
  },
  getClientHeight: function() {
    var res = 600;
    if(window.innerHeight) {
      res = window.innerHeight;
    } else if(document.documentElement && document.documentElement.clientHeight) {
      res = document.documentElement.clientHeight;
    } else if(document.body) {
      res = document.body.clientHeight;
    }
    return res;
  },
  getBodyHeight: function() {
    var res = 600;
    if(window.innerHeight) {
      res = window.innerHeight;
    } else if(document.documentElement && document.documentElement.clientHeight) {
      res = document.documentElement.clientHeight;
      if(document.documentElement.scrollHeight && (document.documentElement.scrollHeight > document.documentElement.clientHeight)) {
        res = document.documentElement.scrollHeight;
      }
    } else if(document.body) {
      res = document.body.clientHeight;
      if(document.body.scrollHeight && (document.body.scrollHeight > document.body.clientHeight)) {
        res = document.documentElement.scrollHeight;
      }
    }
    return res;
  }
};

var rsElements = {
  get: function(element) {
    if((typeof element == "string") || (typeof element == "number")) {
      return document.getElementById(element);
    } else {
      return element;
    }
  },
  setStyles: function(element, styles) {
    element = rsElements.get(element);
    for(var i = 1, length = arguments.length; i < length; i++) {
      var arg = arguments[i];
      for(var property in arg) if(property != null) {
        element.style[property] = arg[property];
      }
    }
    return element;
  },
  purgeHandlers: function(element) {
    element = rsElements.get(element);
    var a = element.attributes, i, l, n;
    if(a) {
      l = a.length;
      for(i = 0; i < l; i += 1) {
        n = a[i].name;
        if(typeof element[n] === 'function') {
          element[n] = null;
        }
      }
    }
    a = element.childNodes;
    if(a) {
      l = a.length;
      for(i = 0; i < l; i += 1) {
        rsElements.purgeHandlers(element.childNodes[i]);
      }
    }
  },
  setContent: function(element, content) {
    var el = rsElements.get(element);
    var a = el.childNodes;
    if(a) {
      l = a.length;
      for(i = 0; i < l; i += 1) {
        rsElements.purgeHandlers(el.childNodes[i]);
      }
    }
    el.innerHTML = content;
    return el;
  },
  setTextContent: function(element, textContent) {
    var el = rsElements.get(element);
    var a = el.childNodes;
    if(a) {
      l = a.length;
      for(i = 0; i < l; i += 1) {
        rsElements.purgeHandlers(el.childNodes[i]);
      }
    }
    while(el.firstChild) {
      el.removeChild(el.childNodes[0]);
    }
    el.appendChild(document.createTextNode(textContent));
    return el;
  },
  append: function(aContainerDOMID, aNewDOMID, aArguments) {
    var args = aArguments || {};
    var res = document.createElement('div');
    var con = rsElements.get(aContainerDOMID);
    if(con) {
      con.appendChild(res);
    } else {
      document.body.appendChild(res);
    }
    if(arguments.length >= 2) {
      res.id = aNewDOMID;
    }
    if((typeof args.content == 'string') && (args.content != '')) {
      res.innerHTML = args.content;
    }
    if((typeof args.textContent == 'string') && (args.textContent != '')) {
      res.nodeValue = args.textContent;
    }
    return res;
  },
  remove: function(element) {
    var el = rsElements.get(element);
    rsElements.purgeHandlers(el);
    el.parentNode.removeChild(el);
    return el;
  }
};

var rsEvents = function() {
  var handlers = [];
  var lastHandlerID = 0;
  var enableEvents = true;
  var that = {
    indexOfHandler: function(aHandler) {
      var hidx = -1;
      for(var i = 0, length = handlers.length; i < length; i++) {
        var hob = handlers[i];
        if((hob.handler == aHandler) || (hob.DOMHandler == aHandler)) {
          hidx = i;
          break;
        }
      }
      return hidx;
    },
    indexOfHandlerID: function(aHandlerID) {
      var hidx = -1;
      for(var i = 0, length = handlers.length; i < length; i++) {
        var hob = handlers[i];
        if(hob.handlerID == aHandlerID) {
          hidx = i;
          break;
        }
      }
      return hidx;
    },
    add: function(aNode, aType, aHandler, aArguments) {
      var node = rsElements.get(aNode);
      var domh = aHandler;
      var args = aArguments || {};
      lastHandlerID++;
      var lHandlerID = lastHandlerID;
      if(args.scope) {
        if(args.once) {
          domh = function(e) {
            var ev = that.getEvent(e);
            if(enableEvents) {
              rsEvents.removeByHandlerID(lHandlerID);
              return aHandler.apply(args.scope, ev);
            } else {
              return false;
            }
          };
        } else {
          domh = function(e) {
            var ev = that.getEvent(e);
            if(enableEvents) {
              return aHandler.apply(args.scope, ev); 
            } else {
              return false;
            }
          };
        }
      } else if(args.once) {
        domh = function(e) {
          var ev = that.getEvent(e);
          if(EnableEvents) {
            rsEvents.removeByHandlerID(lHandlerID);
            return aHandler(ev);
          } else {
            return false;
          }
        };
      } else {
        domh = function(e) {
          var ev = that.getEvent(e);
          if(enableEvents) {
            return aHandler(ev);
          } else {
            return false;
          }
        };
      }
      handlers[handlers.length] = {
        handler: aHandler,
        DOMHandler: domh,
        node: node,
        type: aType,
        handlerID: lHandlerID
      };
      if(node.addEventListener) {
        node.addEventListener(aType, domh, false);
      } else if(node.attachEvent) {
        node.attachEvent('on' + aType, domh);
      } else {
        node['on' + aType] = domh;
      }
      return domh;
    },
    remove: function(aNode, aType, aHandler) {
      var node = rsElements.get(aNode);
      var domh = aHandler;
      var eidx = that.indexOfHandler(domh);
      if(eidx >= 0) {
        domh = handlers[eidx].DOMHandler;
        handlers.splice(eidx, 1);
      }
      if(node.removeEventListener) {
        node.removeEventListener(aType, domh, false);
      } else if(node.detachEvent) {
        node.detachEvent('on' + aType, domh);
      } else {
        node['on' + aType] = '';
      }
    },
    removeByHandlerID: function(aHandlerID) {
      var eidx = that.indexOfHandlerID(aHandlerID);
      if(eidx >= 0) {
        var hob = handlers[eidx];
        handlers.splice(eidx, 1);
        if(hob.node.removeEventListener) {
          hob.node.removeEventListener(hob.type, hob.DOMHandler, false);
        } else if(hob.node.detachEvent) {
          hob.node.detachEvent('on' + hob.type, hob.DOMHandler);
        }
      }
    },
    removeByHandler: function(aHandler) {
      var eidx = that.indexOfHandler(aHandler);
      if(eidx >= 0) {
        var hob = handlers[eidx];
        handlers.splice(eidx, 1);
        if(hob.node.removeEventListener) {
          hob.node.removeEventListener(hob.type, hob.DOMHandler, false);
        } else if(hob.node.detachEvent) {
          hob.node.detachEvent('on' + hob.type, hob.DOMHandler);
        }
      }
    },
    getEvent: function(e) {
      return e || window.event;
    },
    getMousePosition: function(e) {
      var pos = {x: 0, y: 0};
      if(e.pageX || e.pageY) {
        pos.x = e.pageX;
        pos.y = e.pageY;
      } else if(e.clientX || e.clientY) {
        pos.x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
        pos.y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
      }
      return pos;
    }
  }
  return that;
}();


var rsAjax = {
  ajaxBusy: false,
  createXMLHTTPObject: function() {
    var xmlhttp = false;
    if(window.ActiveXObject) {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP")
    } else if(window.XMLHttpRequest) {
      xmlhttp = new XMLHttpRequest()
    }
    return xmlhttp;
  },
  sendRequest: function(url,callback) {
    var req = this.createXMLHTTPObject();
    if (!req) return;
    var method = "GET";
    var postData = null;
    req.open(method,url,true);
    req.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
    if(method == "POST") {
      var postData = 'dummy';
      req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
    }
    req.onreadystatechange = function () {
      if(req.readyState != 4) return;
      rsAjax.ajaxBusy = false;
      if(req.status != 200 && req.status != 304) {
        alert('HTTP error ' + req.status);
        return;
      }
      callback(req);
    }
    if(req.readyState == 4) return;
    rsAjax.ajaxBusy = true;
    req.send(postData);
  },
  evalReply: function(callpage) {
    this.sendRequest(callpage, function(req){ eval(req.responseText); });
  },
  alertReply: function(callpage) {
    this.sendRequest(callpage, function(req){ alert(req.responseText); });
  }
}

function RSInit() {
  //rsEvents.add(document.body, 'mouseup', function(){rsAjax.alertReply('about.htm');});
}

var nextAjaxSearchRequest = '';

function updateAjaxSearchInfo() {
  var sAuthor = document.getElementById('s_author').value;
  var sTitle = document.getElementById('s_title').value;
  var sKeywords = document.getElementById('s_keywords').value;
  var sCurrency = document.getElementById('s_currency').value;
  var sPMin = document.getElementById('s_pmin').value;
  var sPMax = document.getElementById('s_pmax').value;
  var sReqURL = 'ajaxsearch.php?s_author=' + encodeURIComponent(sAuthor) + '&s_title=' + encodeURIComponent(sTitle) + 
                '&s_keywords=' + encodeURIComponent(sKeywords) + '&s_currency=' + encodeURIComponent(sCurrency) + 
                '&s_pmin=' + encodeURIComponent(sPMin) + '&s_pmax=' + encodeURIComponent(sPMax);
  if(rsAjax.ajaxBusy) {
    nextAjaxSearchRequest = sReqURL;
  } else {
    rsElements.setStyles('throbber', {
      visibility: 'visible'
    });
    rsAjax.sendRequest(sReqURL, showAjaxSearchInfo);
  }
}

function showAjaxSearchInfo(req) {
  var resp = eval('(' + req.responseText + ')');
  if(resp.displayCriteria !== '') {
    document.getElementById('ajaxsearchresults').innerHTML = '<br /><h2>search criteria &amp; results</h2><br />' + resp.displayCriteria + '<br />';
    rsElements.setStyles('ajaxsearchresults', {
      display: 'block'
    });
  } else {
    document.getElementById('ajaxsearchresults').innerHTML = '';
    rsElements.setStyles('ajaxsearchresults', {
      display: 'none'
    });
  }
  if(nextAjaxSearchRequest !== '') {
    var sReqURL = nextAjaxSearchRequest;
    nextAjaxSearchRequest = '';
    rsAjax.sendRequest(sReqURL, showAjaxSearchInfo);
  } else {
    rsElements.setStyles('throbber', {
      visibility: 'hidden'
    });
  }
}


var nextAjaxSearchRequestHome = '';

function updateAjaxSearchInfoHome() {
  var sKeywords = document.getElementById('s_keywords').value;
  var sReqURL = 'ajaxsearch.php?s_keywords=' + encodeURIComponent(sKeywords);
  if(rsAjax.ajaxBusy) {
    nextAjaxSearchRequestHome = sReqURL;
  } else {
    rsElements.setStyles('throbber', {
      visibility: 'visible'
    });
    rsAjax.sendRequest(sReqURL, showAjaxSearchInfoHome);
  }
}

function showAjaxSearchInfoHome(req) {
  var resp = eval('(' + req.responseText + ')');
  if(resp.displayCriteria !== '') {
    document.getElementById('home_searchresults').innerHTML = '<h2>search criteria &amp; results</h2>' + resp.displayCriteria;
    rsElements.setStyles('home_searchresults', {
      display: 'block'
    });
  } else {
    document.getElementById('home_searchresults').innerHTML = '';
    rsElements.setStyles('home_searchresults', {
      display: 'none'
    });
  }
  if(nextAjaxSearchRequestHome !== '') {
    var sReqURL = nextAjaxSearchRequestHome;
    nextAjaxSearchRequestHome = '';
    rsAjax.sendRequest(sReqURL, showAjaxSearchInfoHome);
  } else {
    rsElements.setStyles('throbber', {
      visibility: 'hidden'
    });
  }
}


