var URL_SERVERDATE   = "http://astrology.com/wdg/server_date.txt";
var URL_XMLDOMAIN    = "astrology.com";
var URL_XMLFEED      = "http://www.astrology.com/wdg/iching.xml";
var URL_XMLFEED_TEST = "http://www.daylateanddollarshort.com/misc/iching/iching.xml";

var lastFeedDate;
var xmlRequest;
var xmlProcessed = false;
var isCollapsed = false;



var signArray, promoArray;

var currScopeObj, saveScopeObj;
var nullSignObj, nullTypeObj, nullScopeObj;


var PROMO_THRESHOLD = 100000;


var ID_INITIAL = -2, ID_NULL = -10;
var ID_PREVSCOPE = 99, ID_THISSCOPE = 100, ID_NEXTSCOPE = 101;


var URL_CALL_PREFIX = "tel:"; // or "callto://"

function processXML( aXML )
{
	var theGramArray  = aXML.getElementsByTagName("gram");
	var aIdx, bIdx;
	
	appParams.triArray = new Array();
	appParams.hexArray = new Array();
	
	var gramItem, gramType;
	var symbItem, charItem, readItems;
	var readObj = new Object();
	
	for ( aIdx = 0; aIdx < theGramArray.length; aIdx++ )
	{
		gramItem  = theGramArray[aIdx];
		
		gramType  = gramItem .getAttribute("type");
		symbItem  = gramItem .getElementsByTagName("symbol"   )[0]; // should only be one
		charItem  = gramItem .getElementsByTagName("character")[0]; // should only be one
		readItems = gramItem .getElementsByTagName("readings" )[0]; // should only be one
		readItems = readItems.getElementsByTagName("reading"  ); // individual "reading" elements
		
		for ( bIdx = 0; bIdx < readItems.length; bIdx++ )
		{
			if ( readItems[bIdx].childNodes ) 
			{
				readObj[readItems[bIdx].getAttribute("id")] = readItems[bIdx].childNodes[0].nodeValue;
				
						
				if ( readItems[bIdx].getAttribute("author") != undefined ) 
					readObj[readItems[bIdx].getAttribute("id")] += ":::" + readItems[bIdx].getAttribute("author");
				else if ( readItems[bIdx].getAttribute("translator") != undefined ) 
					readObj[readItems[bIdx].getAttribute("id")] += ":::" + readItems[bIdx].getAttribute("translator");
			}
		}
			
		appParams[gramType+"Array"].push( 
			new gramObject(
				gramItem.getAttribute("id") , //aId,
				
				symbItem.getAttribute("decimal" ), // aDecimal,
				symbItem.getAttribute("binary"  ), // aBinString,
				symbItem.getAttribute("unicode" ), // aGram,
				
				charItem.getAttribute("unicode" ), // aPictoName,
				charItem.getAttribute("name"    ), // aDiacName, 
				charItem.getAttribute("textname"), // aTextName,
				
				readObj ) // readObj.title, readObj.image, readObj.judge, readObj.summary )
			);
	}
	appParams.triArray.sort( compareObjectDecimals );
	appParams.hexArray.sort( compareObjectDecimals );
}
function compareObjectDecimals ( aObj, bObj ) { return 1*aObj.decimal - 1*bObj.decimal; }

function readObject()
{
	this.title   = "";
	this.image   = "";
	this.judge   = "";
	this.summary = "";
	
	return this;	
}

function sendXMLRequest( aContext )
{
	//startSpinAnim( "signs" );
	
	var theURL = URL_XMLFEED;
	
	if (( document.domain != "" ) && ( document.domain != "localhost" ) && ( document.domain.indexOf(URL_XMLDOMAIN) == -1 ))
		theURL = URL_XMLFEED_TEST;
	
	xmlRequest = null;
	xmlRequest = new XMLHttpRequest();
	xmlRequest.onreadystatechange = receiveXMLRequest;
	xmlRequest.context = aContext;
	
	xmlRequest.open( "GET", theURL, true );
	xmlRequest.send( null );
}

function receiveXMLRequest()
{
	if ( xmlRequest.readyState == 4 ) // request "loaded"
	{
		if (( xmlRequest.status == 200 ) && ( xmlRequest.responseXML )) // status "OK"
			xmlReceiptSuccess();
		else
			xmlReceiptFailure();
	}
}

function xmlReceiptSuccess()
{
	//stopSpinAnim( "signs" );
	//stopSignProgressAnim();
	
	//appState = "normal";
	
	var xmlXML    = xmlRequest.responseXML;
	var xmlText   = xmlRequest.responseText;

	lastFeedDate  = feedDate( xmlXML );
	
	processXML( xmlXML );
	appParams.xmlPreloaded = true;
}
function xmlReceiptFailure() { alert("failure!"); }

function feedDate( aXML )
{
	var theResult = -1;
	
	aXML = aXML.getElementsByTagName("astrofeed");
	if ( aXML && ( aXML.length > 0 ))
		theResult = aXML[0].getAttribute("pubDate");
	
	return theResult;
}




//
// MISC UTILITIES
//

function compareObjectIds       ( aObj, bObj ) { return 1*aObj.id        - 1*bObj.id;        }
function compareObjectSortOrders( aObj, bObj ) { return 1*aObj.sortOrder - 1*bObj.sortOrder; }



//
// XML UTILITIES
//

function xmlObjectToString( aXML ) { return (new XMLSerializer()).serializeToString(aXML); }
function stringToXMLObject( aStr )
{
	var theParser = new DOMParser();
	
	return theParser.parseFromString( aStr, "text/xml" );
}