/*
  PFrameworkCS API

  Copyright (C) 2008 by Gregor Kališnik <gregor@unimatrix-one.org>
  Copyright (C) 2008 by Unimatrix-One (www.unimatrix-one.org)

  This javascript is part of the PFramework CMS system. Any unauthorised
  use outside of this system is strictly prohibited.
*/

/* Begin PSource */

var PSource = Class.create({
  initialize: function(url)
  {
    this.url = url;
    this.data = new Array();
    this.transport = false;
  },

  initTransport: function()
  {
    // branch for native XMLHttpRequest object
    var transport = false;

    if (window.XMLHttpRequest) {
      transport = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
      try {
        transport = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (E) {
        try {
          transport = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (E) {
          transport = false;
        }
      }
    }

    this.transport = transport;
  },

  query: function(searchParams)
  {
    this.data.clear();
    this.initTransport();
    if (!this.transport)
      return;

    var url = this.prepareQuery(searchParams);

    this.transport.open("GET", url, true);
    this.transport.onreadystatechange = (function(thisVar) { return function() { thisVar.prepareEvent();}; })(this);
    this.transport.send(null);
  },
  
  prepareQuery: function(searchParams)
  {
    var url = this.url;

    if (typeof(searchParams) == 'string') {
      url += '&keywords=' + encodeURIComponent(searchParams);
    } else {
      var keys = Object.keys(searchParams);
      keysCount = keys.length;
      for (var i = 0; i < keysCount; i++) {
        url += '&' + encodeURIComponent(keys[i]) + '=' + encodeURIComponent(searchParams[keys[i]]);
      }
    }
    
    return url;
  },

  prepareEvent: function()
  {
    var request = this.transport;

    if (request.readyState != 4)
      return;

    if (request.status != 200) {
      this.fire('PSource:requestFinished', { code: 'failed', message: pi18n('Unable to get XML!') });
      return;
    }

    this.parseResult();
  },

  parseResult: function()
  {
  },

  result: function ()
  {
    return this.data;
  },

  observe: function(event, handler)
  {
    document.observe(event, handler);
  },
  
  stopObserving: function(event, handler)
  {
    document.stopObserving(event, handler);
  },

  fire: function(eventName, event)
  {
    document.fire(eventName, event);
  }
});

/* End PSource */

/* Begin POmdbSource */

var POmdbSource = Class.create(PSource, {
  initialize: function($super)
  {
    $super('/connectors/xml.php?c=OMDB_SEARCH');
  },

  parseResult: function()
  {
    var request = this.transport;

    var data = request.responseXML.getElementsByTagName('movie')
    var dataLength = data.length;
    for (var i = 0; i < dataLength; i++) {
      var attributes = data[i].attributes;
      var temp = new Object();
      temp.omdbId = attributes.getNamedItem('id').nodeValue;
      temp.title = data[i].firstChild.nodeValue;
      temp.type = attributes.getNamedItem('tip').nodeValue;
      this.data.push(temp);
    }

    this.fire('PSource:requestFinished', { code: 'successful', data: this.data });
  }
});

/* End POmdbSource */

/* Begin PUserSource */

var PUserSource = Class.create(PSource, {
  initialize: function($super)
  {
    $super('/connectors/xml.php?c=USER_SEARCH');
  },

  parseResult: function()
  {
    var request = this.transport;

    var data = request.responseXML.getElementsByTagName('user');
    var dataLength = data.length;
    for (var i = 0; i < dataLength; i++) {
      var attributes = data[i].attributes;
      var temp = new Object();
      temp.uid = attributes.getNamedItem('id').nodeValue;
      temp.username = data[i].firstChild.nodeValue;
      this.data.push(temp);
    }

    this.fire('PSource:requestFinished', { code: 'successful', data: this.data });
  }
});

/* End PUserSource */

/* Begin PSuggestionsSource */

var PSuggestionsSource = Class.create(PSource, {
  initialize: function($super, type)
  {
    $super('/ppodnapisi/suggestions/keywords/$search/output/xml/type/' + type);
  },
  
  prepareQuery: function(searchParams)
  {
    if (typeof(searchParams) != 'string')
      return;
    
    var url = this.url;
    url = url.replace('$search', searchParams);
    return url;
  },
  
  parseResult: function()
  {
    var response = this.transport;
    
    var data = response.responseXML.getElementsByTagName('Item');
    var dataSize = data.length;
    for (var i = 0; i < dataSize; i++) {
      var title = data[i].getElementsByTagName('Text')[0].firstChild.nodeValue;
      var description = data[i].getElementsByTagName('Description')[0].firstChild.nodeValue;
      var imageUrl = data[i].getElementsByTagName('Image')[0].attributes.getNamedItem('source').nodeValue;
      var imageHeight = data[i].getElementsByTagName('Image')[0].attributes.getNamedItem('height').nodeValue;
      var imageWidth = data[i].getElementsByTagName('Image')[0].attributes.getNamedItem('width').nodeValue;
      var url = data[i].getElementsByTagName('Url')[0].firstChild.nodeValue;
      var omdb = data[i].getElementsByTagName('OmdbId')[0].firstChild.nodeValue;
      
      var temp = new Object();
      temp.title = title;
      temp.description = description;
      temp.image = new Object();
      temp.image.source = imageUrl;
      temp.image.height = imageHeight;
      temp.image.width = imageWidth;
      temp.url = url;
      temp.omdb = omdb;
      this.data.push(temp);
    }
    
    this.fire('PSource:requestFinished', { code: 'successful', data: this.data });
  }
});

/* End PSuggestionsSource */