﻿// ------------------------------------------------------------------------------------------------------------
// Public interfaces
// ------------------------------------------------------------------------------------------------------------
function loadArticlesJS ()
{
	var requestData = null;
	
	if (ArticleFetch.isLoading)
	{
		return false;
	};
	
	if (!arguments.length)
	{
		return false;
	}
	else if (typeof arguments[0] == "object" && arguments[0].constructor != String)
	{
		requestData = arguments[0];
	}
	else if (typeof arguments[0] == "string" || (typeof arguments[0] == "object" && arguments[0].constructor == String))
	{
		var callback = (arguments.length > 1 && typeof arguments[1] == "function") ? arguments[1] : (typeof processArticleData == "function" ? processArticleData : null);
	
		requestData = {
			callback: callback,
			q: arguments[0]
		};
	}
	else
	{
		return false;
	};
	
	ArticleFetch.loadArticlesJS(requestData);
};

function loadArticlesProxy (requestData, callback, proxyURL)
{
	if (typeof requestData == "string" || (typeof requestData == "object" && requestData.constructor == String))
	{
		requestData = {
			q: requestData
		};
	}
	else if (typeof requestData != "object")
	{
		return false;
	};
		
	ArticleFetch.loadArticlesProxy(requestData, callback, proxyURL);
};

// ------------------------------------------------------------------------------------------------------------
// ArticleFetch: request manager
// ------------------------------------------------------------------------------------------------------------
var ArticleFetch = {
	
	loader: null,
	
	requestData: null,
	
	// remoteScriptURL: "http://testpool.inform.com/inform2/feeds/js/search.aspx",
	remoteScriptURL: "http://localhost/inform2/feeds/js/search.aspx",
	
	isLoading: false
	
};

ArticleFetch.loadArticlesJS = function (requestData)
{
	if (!this.loader)
	{
		this.createLoader();
	};
	
	this.isLoading = true;
	this.requestData = requestData;
	
	// need to dynamically build query string
	this.loader.src = this.remoteScriptURL + "?q=" + escape(requestData.query);
};

ArticleFetch.loadArticlesProxy = function (requestData, callback, proxyURL)
{
	this.isLoading = true;

	Transport.load({
		url: proxyURL,
		data: requestData,
		method: "get",
		callback: callback,
		onload: function (data)
		{	
			ArticleFetch.processArticleDataXML(data);
		}
	});
};

ArticleFetch.createLoader = function ()
{
	var scriptEl = document.createElement("script");
	
	scriptEl.setAttribute("id", "loader");
	scriptEl.setAttribute("type", "text/javascript");
	
	this.loader = document.getElementsByTagName("head")[0].appendChild(scriptEl)
};

ArticleFetch.processArticleDataXML = function (data)
{
	var xmlDocument = XML.getDocument();
	var resultData = {};

	xmlDocument.loadXML(data.contentPackage.result);
	
	var itemTypes = ["articles", "blogs", "video", "audio"];
	
	for (var j = 0; j < itemTypes.length; j++)
	{
		if (xmlDocument.getElementsByTagName(itemTypes[j]).length)
		{
			var articleList = xmlDocument.getElementsByTagName(itemTypes[j])[0].getElementsByTagName("item");

			resultData[itemTypes[j]] = [];
		
			for (var i = 0; i < articleList.length; i++)
			{
                                var resultitem = {
				//	title: getNodeValue(articleList[i].getElementsByTagName("articletitle")[0]),
					date: getNodeValue(articleList[i].getElementsByTagName("date")[0]),
					type: getNodeValue(articleList[i].getElementsByTagName("type")[0]),
					url: getNodeValue(articleList[i].getElementsByTagName("url")[0]),
					blurb: getNodeValue(articleList[i].getElementsByTagName("blurb")[0]),
					publication: getNodeValue(articleList[i].getElementsByTagName("publication")[0]),
					score: getNodeValue(articleList[i].getElementsByTagName("score")[0])
				};
                                if (articleList[i].getElementsByTagName("headline").length > 0 )
				{
                                    resultitem.title = getNodeValue(articleList[i].getElementsByTagName("headline")[0]);
				}
                                else if (articleList[i].getElementsByTagName("title").length > 0 )
				{
                                    resultitem.title = getNodeValue(articleList[i].getElementsByTagName("title")[0]);
				}
				resultData[itemTypes[j]].push( resultitem );


			};
		};
	};
	
	this.processArticleData(resultData, data.contentPackage.callback);
};

ArticleFetch.processArticleDataJS = function (data)
{
	this.processArticleData(data, this.requestData.callback);
};

ArticleFetch.processArticleData = function (data, callback)
{
	if (typeof callback == "function")
	{
		callback(data);
	};

	this.requestData = null;
	this.isLoading = false;
};

// ------------------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------------------
function getNodeValue (node)
{
	return node && node.firstChild && node.firstChild.nodeValue ? node.firstChild.nodeValue : "";
};

// ------------------------------------------------------------------------------------------------------------
// Transport: slim version of Inform ajax request library
// ------------------------------------------------------------------------------------------------------------
var Transport = { 
	connectionId: 0
};

/* main public method */
Transport.load = function (contentPackage) 
{
	// contentPackage.method = "post";

	return new Connection(this, this.connectionId++, contentPackage);
};

Transport._loadXMLHTTP = function (connection) 
{
    var thisConnection = connection;
    var contentPackage = thisConnection.contentPackage;

	function stateMonitor () 
	{
		Transport._monitorConnectionState(thisConnection);
	};

	var dataPackage = null;

	thisConnection.active = true;
	
	if (contentPackage.method == "post") 
	{
		dataPackage = "";

		for (var i in contentPackage.data) 
		{
			dataPackage += (dataPackage.length ? "&" : "") + this.encode(i) + "=" + this.encode(contentPackage.data[i]);
		};
	}
	else
	{
		for (var i in contentPackage.data) 
		{
			contentPackage.url += (contentPackage.url.indexOf("?") == -1 ? "?" : "&") + this.encode(i) + "=" + this.encode(contentPackage.data[i]);
		};
	};

	thisConnection.c.open(contentPackage.method.toUpperCase(), contentPackage.url, true);
	thisConnection.c.onreadystatechange = stateMonitor;

	if (contentPackage.method == "post") 
	{
		thisConnection.c.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	};

	thisConnection.c.send(dataPackage);
};

Transport._monitorConnectionState = function (connection) 
{
	try 
	{		
		if (connection.c.readyState == 4) 
		{
			connection.contentPackage.result = connection.c.responseText;

			if (typeof connection.contentPackage.onload == "function") 
			{
				connection.contentPackage.onload.apply(connection.context, [connection]);
			};

			connection.active = false;
		};
	} 
	catch (e) 
	{
	};
};

Transport.encode = function (str) 
{
	return escape(str);
};

function Connection (transport, id, contentPackage) 
{
	this.active = false;
	this.parent = transport;
	this.connectionId = id;
	this.contentPackage = contentPackage;
	this.context = contentPackage.context || this.parent.context;
	this._init();
};

Connection.prototype._init = function () 
{
    var c = false;

	try 
	{
		c = new ActiveXObject("Msxml2.XMLHTTP");
	} 
	catch (e) 
	{
		try 
		{
			c = new ActiveXObject("Microsoft.XMLHTTP");
		} 
		catch (f) 
		{
			c = false;
		};
	};

	if (!c && typeof XMLHttpRequest != "undefined") 
	{
		c = new XMLHttpRequest();
	};

	if (c) 
	{
		this.c = c;
	} 
	else 
	{

	};

    this.parent._loadXMLHTTP(this);
};

Connection.prototype.status = function() 
{
	return (this.c.readyState == 4 && this.c.status == 200);
};

// ------------------------------------------------------------------------------------------------------------
// XML document helper
// ------------------------------------------------------------------------------------------------------------
var XML = {

};

XML.getDocument = function ()
{
	var xmlDoc = new _XMLDocument();
	
	if (arguments.length)
	{
		xmlDoc.loadXML(arguments[0]);
	};

	return xmlDoc;
};

function _XMLDocument ()
{
	this._xmlDoc = null;
	this._xmlInterface = -1;
	
	if (typeof ActiveXObject != "undefined") 
	{
		this._xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		this._xmlInterface = 1;
	}
	else 
	{
		try
		{			
			this._xmlDoc = document.implementation.createDocument("", "", null);
			this._xmlInterface = 2;
		}
		catch (e)
		{
			// return null;
		};
	};
	
	this.parseError = 0;
};

_XMLDocument.prototype.loadXML = function (xml)
{
	if (this._xmlInterface == 1)
	{
		this._xmlDoc.async = false;
		this._xmlDoc.loadXML(xml);
		
		this.parseError = this._xmlDoc.parseError;
	}
	else if (this._xmlInterface == 2)
	{
		this._xmlDoc = (new DOMParser()).parseFromString(xml, "text/xml");
		
		if ((this._xmlDoc.documentElement.tagName == "parserError") || (this._xmlDoc.documentElement.namespaceURI == "http://www.mozilla.org/newlayout/xml/parsererror.xml"))
		{
			this.parseError = -1;
		};
	};
};
	
_XMLDocument.prototype.getElementsByTagName = function (tagName)
{
	return this._xmlDoc.getElementsByTagName(tagName);
};

// -------------------------------------------------------------------------
// Utilities
// -------------------------------------------------------------------------
function getQueryVariable (variable) 
{
	var query = window.location.search.substring(1);
	var vars = query.split("&");
	
	for (var i=0;i<vars.length;i++) 
	{
		var pair = vars[i].split("=");

		if (pair[0] == variable) 
		{
			return pair[1];
		};
	}; 
};



