home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 September / PCWorld_2008-09_cd.bin / komunikace / kmeleon / K-Meleon1.1.3en-US.exe / chrome / newsfox.jar / content / newsfox / parser.js < prev    next >
Text File  |  2007-10-24  |  19KB  |  544 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.  * The Original Code is Newsfox.
  15.  *
  16.  * The Initial Developer of the Original Code is
  17.  * Ron Pruitt <wa84it@gmail.com>.
  18.  * Portions created by the Initial Developer are Copyright (C) 2007
  19.  * the Initial Developer. All Rights Reserved.
  20.  *
  21.  * Contributor(s):
  22.  *   Andy Frank <andy@andyfrank.com>
  23.  *
  24.  * Alternatively, the contents of this file may be used under the terms of
  25.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  26.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  27.  * in which case the provisions of the GPL or the LGPL are applicable instead
  28.  * of those above. If you wish to allow use of your version of this file only
  29.  * under the terms of either the GPL or the LGPL, and not to allow others to
  30.  * use your version of this file under the terms of the MPL, indicate your
  31.  * decision by deleting the provisions above and replace them with the notice
  32.  * and other provisions required by the GPL or the LGPL. If you do not delete
  33.  * the provisions above, a recipient may use your version of this file under
  34.  * the terms of any one of the MPL, the GPL or the LGPL.
  35.  *
  36.  * ***** END LICENSE BLOCK ***** */
  37.  
  38. const HRS12 = 1000*60*60*12;
  39. const YRS10 = 1000*60*60*24*365.25*10;  // close enough
  40. const DATEBASE = -HRS12;
  41. const TOP_NO_DATE = new Date(DATEBASE + HRS12);
  42. const NO_DATE = new Date(DATEBASE);
  43. const TOP_INVALID_DATE = new Date(DATEBASE - HRS12);
  44. const INVALID_DATE = new Date(DATEBASE - 2*HRS12);
  45. const TOP_FUTURE_DATE = new Date(DATEBASE - 3*HRS12);
  46.  
  47. const CHANNEL_NAME = [ "channel", "channel", "feed" ];
  48. const ENTRY_NAME = [ "item", "item", "entry" ];
  49. const ID_NAME = [ "guid", "guid", "id" ];
  50. const CONTENT_NAME = [ "description", "description", "content" ];
  51. const DATE_NAME = [ "date", "pubDate", "updated" ];
  52. const CATEGORY_NAME = [ "subject", "category", "category" ];
  53. const DATE_NAME2 = [ "", "date", "issued" ];  // RSS: <rc:date>, Atom 0.3
  54. const HREF_NAME = [ "url", "url", "href" ];
  55.  
  56. const TAG_NAME = [ "a", "img", "area" ];
  57. const ATTR_NAME = [ "href", "src", "href" ];
  58.  
  59. function Parser2(xml,baseUrl)
  60. {
  61.     this.title = null;
  62.     this.link = null;
  63.     this.items = new Array();
  64.  
  65.     this.parse = function(xml,type,baseUrl)
  66.     {
  67.         var channel = xml.getElementsByTagName(CHANNEL_NAME[type]);
  68. // BASE
  69.         var baseuri = adjustBase(null,baseUrl);
  70.         baseuri = adjustBase(baseuri,"/");
  71.         if (type == 2) baseuri = getBaseURI(channel[0],baseuri);
  72. // TITLE
  73.         var title = channel[0].getElementsByTagName("title");
  74.         if (title.length > 0) this.title = getText(title[0]);
  75. // HOMEPAGE
  76.         var uri = getLink(channel[0],baseuri,type);
  77.         if (uri) this.link = uri.resolve("");
  78.  
  79. // ITEMS:
  80.         var now = new Date();
  81.         var itemContainer = (type == 0) ? xml : channel[0];
  82.         var items = itemContainer.getElementsByTagName(ENTRY_NAME[type]);
  83.         for (var i=0; i<items.length; i++)
  84.         {
  85.             item = new Article();
  86. // ITEM:BASE
  87.             var itembase = null;
  88.             if (type == 2) itembase = getBaseURI(items[i],baseuri);
  89. // ITEM:TITLE
  90.             title = items[i].getElementsByTagName("title");
  91.             if (title.length > 0) item.title = getXhtml(title[0]);
  92. // ITEM:LINK
  93.             var uri = getLink(items[i],itembase,type);
  94.             // need spec instead of resolve to pick up # anchors in link
  95.             if (uri) item.link = uri.spec;
  96.             if (item.link == this.link || !item.link) item.link = NO_LINK;
  97. // ITEM:ID
  98.             var id = items[i].getElementsByTagName(ID_NAME[type]);
  99.             if (id.length > 0)
  100.                 item.id = getText(id[0]);
  101.             else
  102.                 if (item.link != NO_LINK) item.id = item.link;
  103.             if (item.id && item.id.substring(0,5) == "http:" && item.link == NO_LINK)
  104.                 item.link = (uri) ? uri.resolve(item.id) : item.id;
  105. // ITEM:BODY
  106.             var body = items[i].getElementsByTagName(CONTENT_NAME[type]);
  107.             if (body.length > 0)
  108.                 item.body = getXhtml(fixLinks(body[0],itembase));
  109.             if (!item.body && type == 2)  // atom
  110.             {
  111.                 var body = items[i].getElementsByTagName("summary");
  112.                 if (body.length > 0)
  113.                     item.body = getText(fixLinks(body[0],itembase));
  114.             }
  115.             if (type < 2)  // rss
  116.             {
  117.                 var body = items[i].getElementsByTagName("encoded");
  118.                 if (body.length > 0) item.body = getText(fixLinks(body[0],null));
  119.             }
  120. // ITEM:DATE
  121.             item.date = NO_DATE;
  122.             var idate = items[i].getElementsByTagName(DATE_NAME[type]);
  123.             if (idate.length > 0)
  124.                 if (type != 1)
  125.                     item.date = setTZDate(getText(idate[0]));
  126.                 else
  127.                     item.date = setRFCDate(getText(idate[0]));
  128.             else if (idate.length == 0 && type >= 1)
  129.             {
  130.                 var idate = items[i].getElementsByTagName(DATE_NAME2[type]);
  131.                 if (idate.length > 0) item.date = setTZDate(getText(idate[0]));
  132.             }
  133. // date adjustment
  134.             if (!gOptions.dateNoneStrict && item.date < TOP_NO_DATE 
  135.                 && item.date > TOP_INVALID_DATE) item.date = now;
  136.             if (!gOptions.dateInvalidStrict && item.date < TOP_INVALID_DATE 
  137.                 && item.date > TOP_FUTURE_DATE) item.date = now;
  138.             if (item.date - now > 10 * 60 * 1000)   // 10 minutes
  139.                 if (gOptions.dateFutureStrict)
  140.                     while (item.date >= TOP_FUTURE_DATE)
  141.                         item.date = new Date(item.date - YRS10);
  142. // ITEM:CATEGORIES
  143.             var cats = items[i].getElementsByTagName(CATEGORY_NAME[type]);
  144.             if (cats.length == 0 && type == 1)
  145.                 cats = items[i].getElementsByTagName("subject");
  146.             var cat = "";
  147.             var newcat;
  148.             for (var j=0; j<cats.length; j++)
  149.             {
  150.                 if (type < 2)
  151.                     newcat = getText(cats[j]);
  152.                 else
  153.                     newcat = cats[j].getAttribute("term");
  154.                 cat = mergeCats(cat,newcat);
  155.             }
  156.             item.category = cat;
  157. // ITEM:ENCLOSURES
  158.             if (type < 2)
  159.             {
  160.                 var enc = items[i].getElementsByTagName("enclosure");
  161.                 for (var j=0; j<enc.length; j++)
  162.                     item.enclosures.push(newEncl(enc[j],HREF_NAME[type]));
  163.             }
  164.             else
  165.             {
  166.                 var enc = items[i].getElementsByTagName("link");
  167.                 for (var j=0; j<enc.length; j++)
  168.                     if (enc[j].hasAttribute("rel") && enc[j].getAttribute("rel").toLowerCase() == "enclosure")
  169.                         item.enclosures.push(newEncl(enc[j],HREF_NAME[type]));
  170.             }
  171.  
  172.             this.items.push(item);
  173.         }
  174.     }
  175.  
  176. // MAIN
  177.     var root = xml.documentElement.localName.toLowerCase();
  178.     var type;
  179.     var errortype = ERROR_OK;
  180.     switch (root)
  181.     {
  182.         case "feed":
  183.             type = 2;
  184.             break;
  185.         case "rss":
  186.             type = 1;
  187.             break;
  188.         case "rdf":
  189.             type = 0;
  190.             break;
  191.         case "parsererror":
  192.             errortype = ERROR_INVALID_FEED_URL;
  193.             break;
  194.         default:
  195.             errortype = ERROR_UNKNOWN_FEED_FORMAT + root;
  196.     }
  197.     if (errortype != ERROR_OK) throw errortype;
  198.     this.parse(xml,type,baseUrl);
  199. }
  200.  
  201. function getBaseURI(xml,base)
  202. {
  203.     var baseuri = base;
  204.     if (xml.hasAttribute("xml:base"))
  205.         baseuri = adjustBase(baseuri,xml.getAttribute("xml:base"));
  206.     var links = xml.getElementsByTagName("link");
  207.     for (var i=0; i<links.length; i++)
  208.         if (links[i].parentNode == xml && links[i].hasAttribute("rel") && links[i].getAttribute("rel").toLowerCase() == "self")
  209.             {
  210.                 baseuri = adjustBase(baseuri,links[i].getAttribute("href"));
  211.                 break;
  212.             }
  213.     return baseuri;
  214. }
  215.  
  216. function adjustBase(baseuri,url)
  217. {
  218.     var ioSvc = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces.nsIIOService);
  219.     return ioSvc.newURI(url,null,baseuri);
  220. }
  221.  
  222. function getLink(xml,baseuri,type)
  223. {
  224.     var newuri = null;
  225.     var url;
  226.     var links = xml.getElementsByTagName("link");
  227.     if (links.length == 0) return null;
  228.     if (type != 2)
  229.         if (links[0].parentNode == xml) url = getText(links[0]);
  230.         else return null;
  231.     else
  232.     {
  233.         for (var i=0; i<links.length; i++)
  234.             if (links[i].parentNode == xml && (!links[i].hasAttribute("rel") || links[i].getAttribute("rel").toLowerCase() == "alternate"))
  235.             {
  236.                 url = links[i].getAttribute("href");
  237.                 break;
  238.             }
  239.     }
  240.     newuri = adjustBase(baseuri,url);
  241.     return newuri;
  242. }
  243.  
  244. function setRFCDate(rfcDate)
  245. {
  246.     var ndate = new Date(Date.parse(rfcDate));
  247.     if (ndate == "Invalid Date") ndate = rescueRFCDate(rfcDate);
  248.     return ndate;
  249. }
  250.  
  251. function setTZDate(isoDate)
  252. {
  253.     try
  254.     {
  255.         var dateTime = isoDate.split("T");
  256.         var ymd = dateTime[0].split("-");
  257.         var timeSplitter = dateTime[1].match("[Z+-]");
  258.         var timeOffset = dateTime[1].split(timeSplitter);
  259.         var hms = timeOffset[0].split(":");
  260.         for (var i=hms.length; i<3; i++) hms[i] = 0;  // hms.length<3 illegal
  261.         var utc = Date.UTC(ymd[0],ymd[1]-1,ymd[2],hms[0],hms[1],hms[2]);
  262.         var mult = 0;
  263.         if (timeSplitter == "+") mult = -1;
  264.         else if (timeSplitter == "-") mult = 1;
  265.         if (mult != 0)
  266.         {
  267.             var hm = timeOffset[1].split(":");
  268.             // multiply since hm not integers
  269.             utc = utc + mult*1000*(hm[0]*3600+hm[1]*60);
  270.         }
  271.         var ndate = new Date(utc);
  272.         if (ndate == "Invalid Date") ndate = INVALID_DATE;
  273.         return ndate;
  274.     }
  275.     catch(e) { return INVALID_DATE; }
  276. }
  277.  
  278. function fixLinks(node, baseuri)
  279. {
  280.     var kids = node.getElementsByTagName("a");
  281.     for (var j=0; j<kids.length; j++)
  282.         if (kids[j].hasAttribute("href"))
  283.             kids[j].setAttribute("target", "_blank");
  284.     if (!baseuri) return node;
  285.     for (var i=0; i<TAG_NAME.length; i++)
  286.     {
  287.         var kids = node.getElementsByTagName(TAG_NAME[i]);
  288.         for (var j=0; j<kids.length; j++)
  289.             if (kids[j].hasAttribute(ATTR_NAME[i]))
  290.                 kids[j].setAttribute(ATTR_NAME[i],baseuri.resolve(kids[j].getAttribute(ATTR_NAME[i])));
  291.     }
  292.     return node;
  293. }
  294.  
  295. function getXhtml(node)
  296. {
  297.     var type = node.getAttribute("type");
  298.     if (type == "xhtml")
  299.     {
  300.         var serializer = new XMLSerializer();
  301.         var xml = "";
  302.     // have to watch out for space before the atom <div>, can only be one <div>
  303.         for (var i=0; i<node.childNodes.length; i++)
  304.             if (node.childNodes[i].localName == "div")
  305.                 xml = serializer.serializeToString(node.childNodes[i]);
  306.     // div can't be part of content, need to retain namespaces
  307.         xml = changeDivToSpan(xml);
  308.         return "<xhtml>" + xml.trim() + "</xhtml>";
  309.     }
  310.     else
  311.         return getText(node);
  312. }
  313.  
  314. function changeDivToSpan(xml)
  315. {
  316.     var ind1 = xml.indexOf("<div");
  317.     var ind2 = xml.indexOf(":div");
  318.     var ind3 = xml.lastIndexOf("div>");
  319.     var goodStart = false;
  320.     var goodEnd = false;
  321.     if (xml.length-ind3 == 4) goodEnd = true;
  322.     if (ind1 == 0 || (ind1 == -1 || ind2 < ind1)) goodStart = true;
  323.     if (goodStart && goodEnd)
  324.     {
  325.         if (ind1 == 0) xml = xml.replace("<div","<span");
  326.         else xml = xml.replace(":div",":span");
  327.         xml = xml.replace(/div>$/,"span>");
  328.     }
  329.     return xml;
  330. }
  331.  
  332. function getText(node)
  333. {
  334.     var result = "";
  335.     var walker = node.ownerDocument.createTreeWalker(node, NodeFilter.SHOW_CDATA_SECTION | NodeFilter.SHOW_TEXT, null, false);
  336.     while(walker.nextNode()) result += walker.currentNode.nodeValue;
  337.     return result.trim();
  338. }
  339.  
  340. function mergeCats(cat,newcat)
  341. {
  342.     var ScatS = "\/" + cat + "\/";
  343.     var newcatArray = newcat.split("\/");
  344.     for (var i=0; i<newcatArray.length; i++)
  345.     {
  346.         var SnewcatS = "\/" + newcatArray[i] + "\/";
  347.         if (ScatS.indexOf(SnewcatS) == -1) ScatS += SnewcatS;
  348.     }
  349.     var Back = ScatS;
  350.     while (Back.indexOf("\/\/") > -1) Back = Back.replace(/\/\//g, "\/");
  351.     Back = Back.replace(/^\//, "");
  352.     Back = Back.replace(/\/$/, "");
  353.     return Back;
  354. }
  355.  
  356. function newEncl(enc,hrefname)
  357. {
  358.     var encl = new Enclosure();
  359.     encl.url = enc.getAttribute(hrefname);
  360.     encl.type = enc.getAttribute("type");
  361.     encl.length = enc.getAttribute("length");
  362.     return encl;
  363. }
  364.  
  365. function displayDate(date, style)
  366. {
  367.     const NF_SB = document.getElementById("newsfox-string-bundle");
  368.     if (date > TOP_NO_DATE)
  369.     {
  370.         if (style == 2)
  371.             return date.toLocaleString();
  372.         else if (style == 0)
  373.         {
  374.             var hour = date.getHours();
  375.             if (hour < 10) hour = "0" + hour;
  376.             var min = date.getMinutes();
  377.             if (min < 10) min = "0" + min;
  378.             var time = hour + ":" + min;
  379.             var dat = date.getFullYear() + "-" + (date.getMonth()+1) + "-" + date.getDate() + " ";
  380.             var now = new Date();
  381.             var nowdat = now.getFullYear() + "-" + (now.getMonth()+1) + "-" + now.getDate() + " ";
  382.             if (dat == nowdat) dat = "";
  383.             return (dat + time);
  384.         }
  385.         else  // style == 1
  386.         {
  387.             var sdf =  Components.classes["@mozilla.org/intl/scriptabledateformat;1"]
  388.                 .createInstance(Components.interfaces.nsIScriptableDateFormat);
  389.             return sdf.FormatDateTime("", sdf.dateFormatShort,
  390.                 sdf.timeFormatNoSeconds, date.getFullYear(), date.getMonth()+1,
  391.                 date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
  392.         }
  393.     }
  394.     else if (date <= TOP_FUTURE_DATE) return NF_SB.getString('FUTURE_DATE');
  395.     else if (date <= TOP_INVALID_DATE) return NF_SB.getString('INVALID_DATE');
  396.     else return NF_SB.getString('NO_DATE');
  397. }
  398.  
  399. /**
  400.  * Get a human readable summary of error. (from Andy Frank)
  401.  */
  402. function getErrorSummary(code)
  403. {
  404.     const NF_SB = document.getElementById("newsfox-string-bundle");
  405.     var strOK = NF_SB.getString('feed_ok');
  406.     var strINVALID = NF_SB.getString('feed_invalid');
  407.     var strUNKNOWN = NF_SB.getString('feed_format_unknown');
  408.     var strOTHER = NF_SB.getString('feed_other_error');
  409.   switch (code.substring(0,1))
  410.   {
  411.     case ERROR_OK: 
  412.       return strOK;
  413.     case ERROR_INVALID_FEED_URL:
  414.       return strINVALID;
  415.     case ERROR_UNKNOWN_FEED_FORMAT:
  416.       return strUNKNOWN + ": " + code.substring(1);
  417.     default: return strOTHER;
  418.   }
  419.  
  420. /**
  421.  * Get possible remedies for this error. (from Andy Frank)
  422.  */
  423. function getErrorRemedies(code)
  424. {
  425.   // TODO - break out into HTML referenced by ID
  426.     const NF_SB = document.getElementById("newsfox-string-bundle");
  427.     var remedyINVALID = NF_SB.getString('remedy_invalid');
  428.     var remedyUNKNOWN = NF_SB.getString('remedy_format_unknown');
  429.   switch (code.substring(0,1))
  430.   {
  431.     case ERROR_OK: return "";
  432.     case ERROR_INVALID_FEED_URL:
  433.       return remedyINVALID;
  434.     case ERROR_UNKNOWN_FEED_FORMAT:
  435.       return remedyUNKNOWN;        
  436.     default: return code;
  437.   }
  438. }
  439.  
  440. function rescueRFCDate(rfcDate)
  441. {
  442. try
  443. {
  444.     var dateArray = rfcDate.split(" ");
  445.     var yr = dateArray[3];
  446.     if (yr.length == 2) yr = yr < 70 ? "20" + yr: "19" + yr;
  447.     dateArray[3] = yr;
  448. // From Bernhard Schelling bug#17681
  449.     if (dateArray.length == 6 && isNaN(dateArray[5]))
  450.     {
  451.         var timeZone = String(dateArray[5]).toUpperCase();
  452.         if      (timeZone == 'ACDT') { dateArray[5] = '+1030'; }
  453.         else if (timeZone == 'ACST') { dateArray[5] = '+0930'; }
  454.         else if (timeZone == 'ADT')  { dateArray[5] = '-0300'; }
  455.         else if (timeZone == 'AEDT') { dateArray[5] = '+1100'; }
  456.         else if (timeZone == 'AEST') { dateArray[5] = '+1000'; }
  457.         else if (timeZone == 'AHST') { dateArray[5] = '-1000'; }
  458.         else if (timeZone == 'AKDT') { dateArray[5] = '-0800'; }
  459.         else if (timeZone == 'AKST') { dateArray[5] = '-0900'; }
  460.         else if (timeZone == 'AST')  { dateArray[5] = '-0400'; }
  461.         else if (timeZone == 'AT')   { dateArray[5] = '-0200'; }
  462.         else if (timeZone == 'AWDT') { dateArray[5] = '+0900'; }
  463.         else if (timeZone == 'AWST') { dateArray[5] = '+0800'; }
  464.         else if (timeZone == 'BST')  { dateArray[5] = '+0100'; }
  465.         else if (timeZone == 'BT')   { dateArray[5] = '+0300'; }
  466.         else if (timeZone == 'CAT')  { dateArray[5] = '-1000'; }
  467.         else if (timeZone == 'CCT')  { dateArray[5] = '+0800'; }
  468.         else if (timeZone == 'CEDT') { dateArray[5] = '+0200'; }
  469.         else if (timeZone == 'CEST') { dateArray[5] = '+0200'; }
  470.         else if (timeZone == 'CET')  { dateArray[5] = '+0100'; }
  471.         else if (timeZone == 'CXT')  { dateArray[5] = '+0700'; }
  472.         else if (timeZone == 'EADT') { dateArray[5] = '+1100'; }
  473.         else if (timeZone == 'EAST') { dateArray[5] = '+1000'; }
  474.         else if (timeZone == 'EEDT') { dateArray[5] = '+0300'; }
  475.         else if (timeZone == 'EEST') { dateArray[5] = '+0300'; }
  476.         else if (timeZone == 'EET')  { dateArray[5] = '+0200'; }
  477.         else if (timeZone == 'FST')  { dateArray[5] = '+0200'; }
  478.         else if (timeZone == 'FWT')  { dateArray[5] = '+0100'; }
  479.         else if (timeZone == 'GST')  { dateArray[5] = '+1000'; }
  480.         else if (timeZone == 'HAA')  { dateArray[5] = '-0300'; }
  481.         else if (timeZone == 'HAC')  { dateArray[5] = '-0500'; }
  482.         else if (timeZone == 'HADT') { dateArray[5] = '-0900'; }
  483.         else if (timeZone == 'HAE')  { dateArray[5] = '-0400'; }
  484.         else if (timeZone == 'HAP')  { dateArray[5] = '-0700'; }
  485.         else if (timeZone == 'HAR')  { dateArray[5] = '-0600'; }
  486.         else if (timeZone == 'HAST') { dateArray[5] = '-1000'; }
  487.         else if (timeZone == 'HAT')  { dateArray[5] = '-0230'; }
  488.         else if (timeZone == 'HAY')  { dateArray[5] = '-0800'; }
  489.         else if (timeZone == 'HDT')  { dateArray[5] = '-0900'; }
  490.         else if (timeZone == 'HNA')  { dateArray[5] = '-0400'; }
  491.         else if (timeZone == 'HNC')  { dateArray[5] = '-0600'; }
  492.         else if (timeZone == 'HNE')  { dateArray[5] = '-0500'; }
  493.         else if (timeZone == 'HNP')  { dateArray[5] = '-0800'; }
  494.         else if (timeZone == 'HNR')  { dateArray[5] = '-0700'; }
  495.         else if (timeZone == 'HNT')  { dateArray[5] = '-0330'; }
  496.         else if (timeZone == 'HNY')  { dateArray[5] = '-0900'; }
  497.         else if (timeZone == 'HST')  { dateArray[5] = '-1000'; }
  498.         else if (timeZone == 'IDLE') { dateArray[5] = '+1200'; }
  499.         else if (timeZone == 'IDLW') { dateArray[5] = '-1200'; }
  500.         else if (timeZone == 'IST')  { dateArray[5] = '+0100'; }
  501.         else if (timeZone == 'JST')  { dateArray[5] = '+0900'; }
  502.         else if (timeZone == 'MEST') { dateArray[5] = '+0200'; }
  503.         else if (timeZone == 'MESZ') { dateArray[5] = '+0200'; }
  504.         else if (timeZone == 'MET')  { dateArray[5] = '+0100'; }
  505.         else if (timeZone == 'MEWT') { dateArray[5] = '+0100'; }
  506.         else if (timeZone == 'MEZ')  { dateArray[5] = '+0100'; }
  507.         else if (timeZone == 'NDT')  { dateArray[5] = '-0230'; }
  508.         else if (timeZone == 'NFT')  { dateArray[5] = '+1130'; }
  509.         else if (timeZone == 'NST')  { dateArray[5] = '-0330'; }
  510.         else if (timeZone == 'NT')   { dateArray[5] = '-1100'; }
  511.         else if (timeZone == 'NZDT') { dateArray[5] = '+1300'; }
  512.         else if (timeZone == 'NZST') { dateArray[5] = '+1200'; }
  513.         else if (timeZone == 'NZT')  { dateArray[5] = '+1200'; }
  514.         else if (timeZone == 'SST')  { dateArray[5] = '+0200'; }
  515.         else if (timeZone == 'SWT')  { dateArray[5] = '+0100'; }
  516.         else if (timeZone == 'UTC')  { dateArray[5] = '-0000'; }
  517.         else if (timeZone == 'WADT') { dateArray[5] = '+0800'; }
  518.         else if (timeZone == 'WAT')  { dateArray[5] = '-0100'; }
  519.         else if (timeZone == 'WEDT') { dateArray[5] = '+0100'; }
  520.         else if (timeZone == 'WEST') { dateArray[5] = '+0100'; }
  521.         else if (timeZone == 'WET')  { dateArray[5] = '-0000'; }
  522.         else if (timeZone == 'WST')  { dateArray[5] = '+0800'; }
  523.         else if (timeZone == 'YDT')  { dateArray[5] = '-0800'; }
  524.         else if (timeZone == 'YST')  { dateArray[5] = '-0900'; }
  525.         else if (timeZone == 'ZP4')  { dateArray[5] = '+0400'; }
  526.         else if (timeZone == 'ZP5')  { dateArray[5] = '+0500'; }
  527.         else if (timeZone == 'ZP6')  { dateArray[5] = '+0600'; }
  528.         //Support for single letter military time zones
  529.         else if (dateArray[5].length==1 && dateArray[5].match(/[A-I,K-Z]/))
  530.         {
  531.             var i = dateArray[5].charCodeAt(0);
  532.             i = (i==90?0:i<74?i-64:i<78?i-65:77-i);
  533.             dateArray[5] = (i<-9?'-':i<0?'-0':i<10?'+0':'+')+String(i<0?0-i:i)+'00';
  534.         }
  535.      }
  536.     var newString = dateArray.join(" ");
  537.     var ndate = new Date(Date.parse(newString));
  538.     if (ndate == "Invalid Date") return INVALID_DATE;
  539.     else return ndate;
  540. }
  541. catch(e) { return INVALID_DATE; }
  542. }
  543.