/*SETUP STUFF*/
var doc_objs = new DocObjectController();

function init_page(){
	if(document.getElementById('EMAIL_INBOX_APP'))
		doc_objs.email_app_objs[0] = new EmailApp(document.getElementById('EMAIL_INBOX_APP'), 0);
	if(document.getElementById('EMAIL_CONFIG_APP'))
		doc_objs.email_app_objs[1] = new EmailConfigApp(document.getElementById('EMAIL_CONFIG_APP'), 1);

	//FIND MAGIC ELEMENTS
	var page_divs = document.getElementsByTagName('div');
	var magic_elements = new Array();
	for(i = 0; i < page_divs.length; ++i){
		if(page_divs[i].getAttribute('magic_type')){
			magic_elements[magic_elements.length] = page_divs[i];
		}	
	}		
		
	//Bug Report
	for(i = 0; i < magic_elements.length; ++i){
		if(magic_elements[i].getAttribute('magic_type') == 'bug_reporter'){
			doc_objs.bug_reporter_objs[doc_objs.bug_reporter_objs.length] = new BugReporter(magic_elements[i], doc_objs.bug_reporter_objs.length);
		}
	}
}

//CLASS to hold config info for AJAX
	function WoprConfig(){
		var domain;
		var mailbox;
	}

//CLASS docObjectController//
	function DocObjectController(){
		
		var hint_bar_objs;
		this.hint_bar_objs = new Array();
		
		var bug_reporter_objs;
		this.bug_reporter_objs = new Array();
		
		var email_app_obj;
		this.email_app_objs = new Array();
		
	}
//END CLASS docObjectController//

//CLASS MagicElement
	function MagicElement(element, index){
//		Properties
		var _root_element;
		var _root_html_element;
		var _element_index;

//		Method Declaration
		var init;

//		Methods
//		Constructor
		this.init = function(element, index){

			if(element){
				this._root_element = element;
				this._element_index = index;									
			}
		};
//		end constructor
				
//		Initialize object
		this.init(element, index);
		
	}

//END CLASS MagickElement

//CLASS BugReporter//
	function BugReporter (element, index){
		this.base = MagicElement;
		var hint_text;
		var help_window_name;
		
		var top_div;
		var form_div;
		
		if(element){
			var top_div = element.appendChild(document.createElement('div'));
			this.top_div = top_div;
			top_div.align = 'right';

			var debug_link = top_div.appendChild(document.createElement('a'));
			debug_link.appendChild(document.createTextNode('[Show/Hide Debug Info]'));
			debug_link.href='#';
			__sig__.connectByName(debug_link, 'onclick', this, 'debug_show_hide');
			
			top_div.appendChild(document.createTextNode(' '));
			
			var request_link = top_div.appendChild(document.createElement('a'));
			request_link.appendChild(document.createTextNode('[Request a Feature]'));
			request_link.href='#';
			__sig__.connectByName(request_link, 'onclick', this, 'feature_request_button_click');
			
			top_div.appendChild(document.createTextNode(' '));
			
			var report_link = top_div.appendChild(document.createElement('a'));
			report_link.appendChild(document.createTextNode('[Report Bug]'));
			report_link.href = '#';
			__sig__.connectByName(report_link, 'onclick', this, 'report_button_click');

		}
		
		this.report_button_click = function(){
//			this.top_div.style.display = 'none';
//			this.form_div.style.display = '';

			var app = doc_objs.email_app_objs[0];
			if(app.composing){
				alert('You must send or discard your current message before you can submit a bug.');
				return false;
			}
			app._composer.composeNew();
			app._composer.to_field.value = 'dgrijalva@pointclickngo.com';
			app._composer.subj_field.value = 'WOPR Email: Bug Report';
			app._composer.body_field.focus();
			
			return false;
		}
		
		this.feature_request_button_click = function(){
			var app = doc_objs.email_app_objs[0];
			if(app.composing){
				alert('You must send or discard your current message before you can submit a feature request.');
				return false;
			}
			app._composer.composeNew();
			app._composer.to_field.value = 'dgrijalva@pointclickngo.com';
			app._composer.subj_field.value = 'WOPR Email: Feature Request';
			app._composer.body_field.focus();
			
			return false;
			
		}
		
		this.debug_show_hide = function(){
			if($('DEBUG_CONTAINER')){
				if($('DEBUG_CONTAINER').style.display == 'none'){
					$('DEBUG_CONTAINER').style.display = '';
				}
				else if($('DEBUG_CONTAINER').style.display == ''){
					$('DEBUG_CONTAINER').style.display = 'none';
				}
			}
		}
			
		this.base(element, index);	
	}
	BugReporter.prototype = new MagicElement;
//END CLASSS BugReporter//

	function AjaxRequest (url, target_obj, target_func){
		var url;
		var target_obj;
		var target_func;
		var method;
		var data;
		var form;
		var passback;
		
		this.url = url;
		this.target_obj = target_obj;
		this.target_func = target_func;
		this.method = "GET";
		this.data = null;
		this.form = null;
		this.passback = null;
	}
	
	function AjaxQueue(){
		//Properties
		var _httpreq;
		var _queue;
		var _current_request;

		//Method Declaration
		var _init;
		var _makeRequest;
		var _processRequest;
		var _nextRequest;
		var parseFormData;
		var addRequest;
		
		var debug_mode;
		this.debug_mode = false;

		__sig__.connectByName(document.body, 'onunload', this, 'pageUnload');
		
		//Methods
		//Constructor
		this._init = function(){
			this._queue = new Array();
		};
		//end constructor
		
		this._nextRequest = function(){
			if(!this._current_request && this._queue.length){
				var next_req = this._queue.shift();
				this._makeRequest(next_req);
			}
		}
		
		this._makeRequest = function(request){			
			
			this._current_request = request;
			
			if(!request.data) request.data = null;
			if(!request.method) request.method = "GET";

			if(request.form){
				var form_data = this.parseFormData(request.form);
				if(request.data){
					request.data = request.data + '&' + form_data;
				}
				else{
					request.data = form_data;
				}
			}
					
			if(request.method == "GET"){
				if(request.data)
					request.url = request.url + "?" + request.data;
				request.data = null;
			}
			
//			if(!this._httpreq){
				if(window.XMLHttpRequest){
					this._httpreq = new XMLHttpRequest();
				}
				else{
					this._httpreq = new ActiveXObject("Msxml2.XMLHTTP");				
					if(!this._httpreq)
						this._httpreq = new ActiveXObject("Microsoft.XMLHTTP");
				}

			
				if(!this._httpreq){
					return false;
				}
	
				var obj = this;
				this._httpreq.onreadystatechange = function(){
					obj._processRequest();
				};			

//			}

//			document.getElementById('DEBUG_BOX').innerHTML = request.url;
			this._httpreq.open(request.method, request.url, true);
			
			if(request.method == "POST")
				this._httpreq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;');
			
			//this._httpreq.setRequestHeader('Connection', 'Keep-Alive');

			this._httpreq.send(request.data);
			
			if($('working_status_box')){
				$('working_status_box').style.display = '';
			}
			
			if(this.debug_mode && $('DEBUG_BOX')){
				var debug = document.getElementById('DEBUG_BOX');
				debug.innerHTML = debug.innerHTML + 'Ajax Requesting: ' + request.url + '<br>';
				if(request.data)
					debug.innerHTML = debug.innerHTML + ' with POST DATA: ' + request.data + '<br>';
			}
			
			
		}
		
		this.parseFormData = function(form_elem){
			var data = "";
			for(i = 0; i < form_elem.elements.length; i++){
				var elem = form_elem.elements[i];
				if(elem.name && elem.value){
					data = data + escape(elem.name) + "=" + escape(elem.value);
					if(i < (form_elem.elements.length - 1)){
						data = data + "&";
					}
				}				
			}
			return data;
		}
		
		this._processRequest = function(){
			try{
				if (this._httpreq.readyState == 4){
					// only if "OK"
					if (this._httpreq.status == 200){
						var req = this._current_request;
				        	if(this._current_request.target_obj || this._current_request.target_func){
				        		if(this._current_request.target_obj && this._current_request.target_func){
				        			if(this._current_request.passback)
				        				this._current_request.target_func.apply(this._current_request.target_obj, [this._httpreq, this._current_request.passback]);
				        			else
				        				this._current_request.target_func.apply(this._current_request.target_obj, [this._httpreq]);
				        		}
				        		else if(this._current_request.target_obj){					        		
				        			if(this._current_request.passback){
					        			this._current_request.target_obj.handleXMLResponse(this._httpreq, this._current_request.passback);
				        			}
					        		else {
					        			this._current_request.target_obj.handleXMLResponse(this._httpreq);
					        		}
				        		}
				        		else if(this._current_request.target_func){
				        			if(this._current_request.passback)
				        				this._current_request.target_func(this._httpreq, this._current_request.passback);
				        			else
				        				this._current_request.target_func(this._httpreq);
				        		}
				        		if(this.debug_mode && $('DEBUG_BOX')){
					        		var debug = document.getElementById('DEBUG_BOX');
								debug.innerHTML = debug.innerHTML + 'Ajax Request Complete: ' + this._current_request.url + '<br>';
							}
				        	}
				        	else{
				        		//NULL TARGET, do nothing
							if(this.debug_mode && $('DEBUG_BOX')){
					        		var debug = document.getElementById('DEBUG_BOX');
								debug.innerHTML = debug.innerHTML + 'Ajax Request Complete: ' + this._current_request.url + ' with NULL target<br>';
							}
				        	}				        	
	        				
				        } 
					else{
						alert("There was a problem retrieving the XML data:\n" + this._httpreq + ':' + this._httpreq.statusText);
				        }

				        if($('working_status_box')){
						$('working_status_box').style.display = 'none';
					}
				        
				        this._current_request = null;
				        this._nextRequest();
				}
			}
			catch(e){
				alert('CRASH: ' + e);
				alert(this._httpreq.responseText);
			}
		};
		
		this.addRequest = function(req_obj){
			this._queue.push(req_obj);
			this._nextRequest();
		}
		
		this.pageUnload = function(){
			if(this._httpreq && (this._httpreq.readyState != 4 && this._httpreq.readyState != 0)){
				this._httpreq.abort();
			}
		}
		
		//Initialize object
		this._init();
		
	}
	
	function AjaxController() {
		
		var queues;
		var max_queues;
		var debug_mode;
		
		this.queues = new Array();
		this.debug_mode = false;
				
		this.setMaxQueues = function(max_qs){
			this.max_queues = max_qs;
			
			while(this.max_queues > this.queues.length){
				var a = new AjaxQueue();
				a.debug_mode = true;
				this.queues.push(a);
			}
		}
		
		this.addRequest = function(req_obj){
			
			var shortest_q = 0;
			var found_unbusy = false;
			
			if(this.queues.length > this.max_queues){
				var q_count = this.max_queues;
			}
			else{
				var q_count = this.queues.length;
			}
			
			for(var i = 0; i < this.queues.length; ++i){
				if(!this.queues[i]._current_request){
					found_unbusy = true;
					shortest_q = i;
					break;
				}
			}
			
			if(!found_unbusy){
				for(var i = 0; i < this.queues.length; ++i){
					if((this.queues[i]._queue.length) < this.queues[shortest_q]._queue.length){
						shortest_q = i;
					}
				}
			}
			
			if($('DEBUG_BOX')){
				$('DEBUG_BOX').innerHTML = $('DEBUG_BOX').innerHTML + 'Adding to queue ' + (shortest_q + 1) + ' of ' + this.queues.length + '<br>';
			}
			this.queues[shortest_q].addRequest(req_obj);
		}
		
		this.setMaxQueues(1);
	}

	var ajax = new AjaxController();
	
	function hasClass(element, class_name){
		if(element && element.className && element.className.length){
			var parts = element.className.split(' ');
			var found = false;
			for(var i = 0; i < parts.length; ++i){
				if(parts[i] == class_name){
					found = true;
					break;
				}
			}
			return found;
		}
		else{
			return false;	
		}
	}
	
	function addClass(element, class_name){
		var debug = document.getElementById('DEBUG_BOX');
		if(element && element.className && element.className.length){
			var parts = element.className.split(' ');
			if(!hasClass(element, class_name)){
				parts[parts.length] = class_name;
			}
			element.className = parts.join(' ');
		}
		else if(element){
			element.className = class_name;
		}
		
		//debug.innerHTML = element.className;
	}

	function removeClass(element, class_name){
		if(element && element.className && element.className.length){
			var parts = element.className.split(' ');
			var new_parts = new Array();
			for(var i = 0; i < parts.length; ++i){
				if(parts[i] != class_name)
					new_parts[new_parts.length] = parts[i];
			}
			
			element.className = new_parts.join(' ');
		}
//		else{
//			var parts = element.getAttributes('class').split(' ');
//			var new_parts = new Array();
//			for(var i = ; i < parts.length; ++i){
//				if(parts[i] != class_name)
//					new_parts[new_parts.length] = parts[i];
//			}
//			
//			element.setAttributes('class') = parts.join(' ');
//		}
	}
	
	function addListener(element, event, callback){
		if(element.addEventListener){
			element.addEventListener(event, callback, false);
			return true;
		}
		else if(element.attachEvent){
			element.attachEvent('on' + event, callback);
			return true;
		}
		else{
			var debug = document.getElementById('DEBUG_BOX');
			debug.innerHTML = debug.innerHTML + 'Could not assign listener <br>';
			return false;
		}
	}
	
	function $(key){
		return document.getElementById(key);
	}
	
	//THIS BLOCK IS USED FOR SHOWING PNG's IN MSIE5+
	if(window.attachEvent){
		try{
			function correctPNG() // correctly handle PNG transparency in Win IE 5.5 or higher.
			   {
			   for(var i=0; i<document.images.length; i++)
			      {
				  var img = document.images[i]
				  var imgName = img.src.toUpperCase()
				  if (imgName.substring(imgName.length-3, imgName.length) == "PNG")
				     {
					 var imgID = (img.id) ? "id='" + img.id + "' " : ""
					 var imgClass = (img.className) ? "class='" + img.className + "' " : ""
					 var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
					 var imgStyle = "display:inline-block;" + img.style.cssText 
					 if (img.align == "left") imgStyle = "float:left;" + imgStyle
					 if (img.align == "right") imgStyle = "float:right;" + imgStyle
					 if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle		
					 var strNewHTML = "<span " + imgID + imgClass + imgTitle
					 + " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
				     + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
					 + "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>" 
					 img.outerHTML = strNewHTML
					 i = i-1
				     }
			      }
			   }
			window.attachEvent("onload", correctPNG);
		} catch (e) {
			alert(e);
		}
	}
	
	
function getRootNode(xml_tree){
	if(xml_tree && xml_tree.childNodes){
		if(xml_tree.childNodes.length == 2){
			return xml_tree.childNodes[1];
		}
		else{
			return xml_tree.childNodes[0];
			
		}
	}
}