
/*
 * Generic XML parser
 * Parses the url into elementHolder objects
 */
var xmlParser = {

  parseXml: function( url, node, input, callback ) {

    var i = 0;       // result counter

    var result = []; // the result array
    /*
     * Open the xml file
     */
    jQuery.get( url, function( data ){

      /*
       * Loop through the results, if we have a filter, apply it.
       */
      jQuery( data ).find( node ).each( function(){
       
        var elementData = jQuery(this);
        
        /*
         * Copy the element holder
         */
        var elementHolder = xmlParser.clone( input.holder );

        /*
         * Fill the copied holder with the xml data
         */
        elementData.children().each(function() {
          elementHolder[ this.nodeName.toLowerCase() ] = jQuery(this).text();
        });

        /*
         * if the filter applies, add the holder to the result
         */
        if( input.filter.test( elementHolder ) ) {
          result[i] = elementHolder;
          i++;
        }       

        elementHolder = null;
       
      });

      /*
       * A callback method is required, since there is a delay from the xml request.
       */
      try {
        if (typeof callback == "undefined") {
          throw 'There is no callback method specified.';
        }
      } catch( e ) { alert( e ); return; }

      /*
       * Execute Callback method
       */
      callback( result );

    });    

  },

  /*
   * Clone method
   * Prevents reference problem
   */
  clone: function( obj ){
      if(obj == null || typeof(obj) != 'object')
          return obj;
      var temp = new obj.constructor();
      for(var key in obj)
          temp[key] = xmlParser.clone(obj[key]);
      return temp;
  },


  /*
   * Test if the input object is valid
   *
   * Valid would be:
   *
   * var input = {
   *  holder : {
   *    id: '',
   *    name: ''
   *  },
   *  filter: {
   *    id: '',
   *    test: function( elementHolder ) {
   *      if( elementHolder.id != this.id ) {
   *        return false;
   *      }
   *      return true;
   *    }
   *  }
   */
  testInput: function( input ) {

    try {
      if (typeof input.holder == "undefined") {
        throw 'There is no holder object specified.';
      }
    } catch( e ) { alert( e ); return; }

    try {
      if (typeof input.filter == "undefined") {
        throw 'There is no filter object specified.';
      }
    } catch( e ) { alert( e ); return; }

    try {
      if (typeof input.filter.test == "undefined") {
        throw 'There is no filter test method specified.';
      }
    } catch( e ) { alert( e ); return; }

  }



}


