var DateUtil   = new DateUtils;
/**
  *  RSS Parser (require DateUtils)
  */
function getRSSFeed(url, DataType, GlobalVariables, GlobalVariablesCount){
 new Ajax.Request(url, {
      method         : "get",
      asynchronous   : true,
      parameters     : 't=' + escape (Math.random()),
      requestHeaders : ['If-Modified-Since', ModifiedSince],
      onLoading      : function (){    },
      onSuccess      : function (xmlObj, VName, VCount){  parseFeed(xmlObj, url, DataType, GlobalVariables, GlobalVariablesCount);  },
      excFunc        : function (){    },
      onComplete     : function (){    }
     });
}

/**
  *  
  */
function parseFeed(XMLObj, url, DataType, GlobalVariables, GlobalVariablesCount){

 var ns_dc = "http://purl.org/dc/elements/1.1/";

 var ItemTagName;
 var RSSVersion = -1;
 var Obj = XMLObj.responseXML;

 if ((Obj.getElementsByTagName('dc:date').length > 0) || (Obj.getElementsByTagName('date').length > 0)){
  RSSVersion = 1;       ItemTagName = 'item';
 }
 if (Obj.getElementsByTagName('pubDate').length > 0){
  RSSVersion = 2;       ItemTagName = 'item';
 }
 if (Obj.getElementsByTagName('entry').length > 0){
  RSSVersion = 'Atom';  ItemTagName = 'entry';
 }

 switch (ItemTagName){
  case 'item' :
   parseRSS(Obj, url, DataType, ItemTagName, GlobalVariables, GlobalVariablesCount);
   break;
  case 'entry' :
   parseAtom(Obj, url, DataType, ItemTagName, GlobalVariables, GlobalVariablesCount);
   break;
  default :
   break;
 }

}

/**
  *  parseRSS
  */
function parseRSS(Obj, url, DataType, ItemTagName, GlobalVariables, GlobalVariablesCount){

 var RSSLink;
 var RSSTitle;

 for (var j = 0; j < Obj.getElementsByTagName('link').length; j ++){
  if (Obj.getElementsByTagName('link')[j].parentNode.nodeName == 'channel'){
   RSSLink  = Obj.getElementsByTagName('link')[j].firstChild.nodeValue;
   RSSTitle = Obj.getElementsByTagName('title')[j].firstChild.nodeValue;
  }
 }

 if (Obj.getElementsByTagName(ItemTagName) != null){
  for(var i = 0; i < Obj.getElementsByTagName(ItemTagName).length; i ++){
   if (Obj.getElementsByTagName(ItemTagName)[i].firstChild != null){
    var ItemObj = Obj.getElementsByTagName(ItemTagName)[i];
    if (ItemObj.getElementsByTagName('pubDate')[0] == null){
     DateObj = DateUtil.parseDateFormat(ItemObj.getElementsByTagName('dc:date')[0].firstChild.nodeValue);
    }else{
     DateObj = DateUtil.parseDateFormat(ItemObj.getElementsByTagName('pubDate')[0].firstChild.nodeValue);
    }
    setArray(GlobalVariables, GlobalVariablesCount, DataType, DateObj);
    setVariables(GlobalVariables, GlobalVariablesCount, DataType, DateObj,
                 ItemObj.getElementsByTagName('link')[0].firstChild.nodeValue,
                 ItemObj.getElementsByTagName('title')[0].firstChild.nodeValue,
                 RSSTitle, RSSLink);
   }
  }
 }
}

/**
  *  parseAtom
  */
function parseAtom(Obj, url, ItemTagName, GlobalVariables, GlobalVariablesCount){

 var RSSLink;
 var RSSTitle;
 RSSTitle = Obj.getElementsByTagName('title')[0].firstChild.nodeValue;
 for (var j = 0; j < Obj.getElementsByTagName('link').length; j ++){
  if ((Obj.getElementsByTagName('link')[j].getAttribute('rel') == 'alternate') && (Obj.getElementsByTagName('link')[j].parentNode.nodeName == 'feed')){
   RSSLink  = Obj.getElementsByTagName('link')[j].getAttribute('href');
  }
 }

 if (Obj.getElementsByTagName(ItemTagName) != null){
  for(var i = 0; i < Obj.getElementsByTagName(ItemTagName).length; i ++){
   if (Obj.getElementsByTagName(ItemTagName)[i].firstChild != null){
    var ItemObj = Obj.getElementsByTagName(ItemTagName)[i];
    var DateObj = DateUtil.parseDateFormat(ItemObj.getElementsByTagName('published')[0].firstChild.nodeValue);
    setArray(GlobalVariables, GlobalVariablesCount, DataType, DateObj);
    var Link;
    for (var j = 0; j < ItemObj.getElementsByTagName('link').length; j ++){
     if (ItemObj.getElementsByTagName('link')[j].getAttribute('rel') == 'alternate'){
      Link = ItemObj.getElementsByTagName('link')[j].getAttribute('href');
     }
    }
    setVariables(GlobalVariables, GlobalVariablesCount, DataType, DateObj,
                 Link,
                 ItemObj.getElementsByTagName('title')[0].firstChild.nodeValue,
                 RSSTitle, RSSLink);
   }
  }
 }
}

/**
  *  setArray
  */
function setArray(GlobalVariables, GlobalVariablesCount, DataType, DateObj){

 if (typeof (GlobalVariables.Serials) == 'undefined')
     GlobalVariables.Serials = new Array();

 if (DataType == 'serial'){

 }else{
  if (typeof (GlobalVariables.Serials) == 'undefined')
     GlobalVariables.Serials = new Array();
 
  if (typeof (GlobalVariables[DateObj.Year]) == 'undefined')
     GlobalVariables[DateObj.Year] = new Array();

  if (typeof (GlobalVariables[DateObj.Year][DateObj.Month]) == 'undefined')
     GlobalVariables[DateObj.Year][DateObj.Month] = new Array();

  if (typeof (GlobalVariablesCount[DateObj.Year]) == 'undefined')
     GlobalVariablesCount[DateObj.Year] = new Array();

  if (typeof (GlobalVariablesCount[DateObj.Year][DateObj.Month]) == 'undefined')
   GlobalVariablesCount[DateObj.Year][DateObj.Month] = new Array();

  if (typeof (GlobalVariables[DateObj.Year][DateObj.Month][DateObj.Day]) == 'undefined'){
   GlobalVariables[DateObj.Year][DateObj.Month][DateObj.Day] = new Array();
   GlobalVariablesCount[DateObj.Year][DateObj.Month][DateObj.Day] = 0;
  }else{
   GlobalVariablesCount[DateObj.Year][DateObj.Month][DateObj.Day] ++;
  }
 }
}

/**
  *  setVariables
  */
function setVariables(GlobalVariables, GlobalVariablesCount, DataType, DateObj, Link, Title, RSSTitle, RSSLink){
 var UniqueID = 0;
 var i = 0;
 do {
  UniqueID = DateUtil.getSerializedDate(new Date(DateObj.Year, DateObj.Month - 1, DateObj.Day, DateObj.Hour, DateObj.Minute, DateObj.Second)) * 100 + i;
  i ++;
 } while (GlobalVariables.Serials.indexOf(UniqueID) != -1);
 GlobalVariables.Serials.push(UniqueID);

 var CurrentDate = new Date(DateObj.Year, DateObj.Month - 1, DateObj.Day, DateObj.Hour, DateObj.Minute, DateObj.Second);
 if (typeof (GlobalVariablesCount.Range) == 'undefined'){
  GlobalVariablesCount.Range = new Array;
  GlobalVariablesCount.Range['min'] = GlobalVariablesCount.Range['max'] = CurrentDate;
 }

 var Value = {
   rssTitle : RSSTitle,
   rssLink  : RSSLink,

   year     : DateObj.Year,
   month    : DateObj.Month,
   day      : DateObj.Day,
   Hour     : DateObj.Hour,
   Minute   : DateObj.Minute,
   Second   : DateObj.Second,
   link     : Link,
   title    : Title,
   UniqueID : UniqueID
  };

 if (DataType == 'serial'){
  GlobalVariables[UniqueID] = Value;
 }else{
  GlobalVariables[DateObj.Year][DateObj.Month][DateObj.Day][GlobalVariablesCount[DateObj.Year][DateObj.Month][DateObj.Day]] = Value;
 }

 GlobalVariablesCount.Range['min'] = (GlobalVariablesCount.Range['min'] >= CurrentDate) ? CurrentDate : GlobalVariablesCount.Range['min'];
 GlobalVariablesCount.Range['max'] = (GlobalVariablesCount.Range['max'] <= CurrentDate) ? CurrentDate : GlobalVariablesCount.Range['max'];
}
