//*******************************Global Variables************************************
var ONE_DAY = 1000 * 60 * 60 * 24;


//*******************************Global Functions*************************************

function prettyTable(ts)
{
    var tables=$(ts).getElementsByTagName("table");
    for(var t=0; t<tables.length; t++){
		if(tables[t].rows[0].cells.length>7){
			tables[t].setAttribute("style", "font-size:10px;");	
		}else{
			tables[t].setAttribute("style", "font-size:12px;");
		}
		
		tables[t].setAttribute("align", "center");	        
    	tables[t].setAttribute("cellspacing", "0");
    	tables[t].setAttribute("cellpadding", "0");
		for(var i=1; i<tables[t].rows.length; i++){
		    if(i % 2 == 0){
				tables[t].rows[i].className = "even";
		    }else{
				tables[t].rows[i].className = "odd";
		    }
		}
    }
}

//****************************************Browser Detect Functions**************************************

var BrowserDetect = {
	
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";		
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

function DetectBrowser()
{
    return true;
    if(BrowserDetect.browser != "Firefox"){
	$("mainContent").innerHTML="<p style='text-align:center; color:navy;'><h2 style='color:gray; '><br/><br/>Sorry, we found that your browser is not compatible with this site.<br/><br/><br/></h2><h4 style='color:gray; '>Please use Firefox instead. You can download it from <a href='http://www.getfirefox.com'>here</a>.<br/><br/></h4><br/><br/><br/></p>";
	return false;
    }else{
	$("helpText").textContent="Help";
	return true;
    }
}


//******************************************Dates functions*********************************************
// !!!! DEPREDATED !!!! USE SmartboxTime instead

function getJaxDate(d){
    //get current time in million seconds since 1/1/1970
    var localTime=d.getTime(); 
    //get the local zone offset(calc from minutes to million seconds)
    var localOffset=d.getTimezoneOffset() * 60 * 1000;   
    //calc the utc time in million seconds
    var utc=localTime+localOffset;   
    //get jax time zone offset, day time saving
    var jaxOffset= checkDTS() * (60*60*1000);    
    //set jax time in million seconds
    var jax=utc+jaxOffset;   
    //get the new Date object
    var jaxDate=new Date(jax);   
    return jaxDate;
}

function checkDTS() {
    //compare curr time diff and std(january) time diff with utc
    //if curr!=std, then day time saving
   var offset=Smartbox.timezone || 0;
   var now = new Date();
   var utcnow = now.toUTCString();
   var std = new Date(now.getFullYear(), 0, 1, 0, 0, 0, 0);
   var utcstd = std.toUTCString();
   var dnow = new Date(utcnow.substring(0, utcnow.lastIndexOf(" ")-1));
   var dstd = new Date(utcstd.substring(0, utcstd.lastIndexOf(" ")-1));
   var hoursDiffCurrTime = Math.round((now - dnow) / (1000 * 60 * 60));
   var hoursDiffStdTime = Math.round((std - dstd) / (1000 * 60 * 60));
   if (hoursDiffCurrTime != hoursDiffStdTime) {
       //day time saving
       return -4;
   } else {
       //no day time saving
       return -5;
   }
}

function getDate(day, full)
{
    var d=new Date((parseInt(day)+1) * ONE_DAY);
    d=getJaxDate(d);
    var date=full ? 
			(d.getMonth()+1) + "/" + d.getDate() + "/" + d.getFullYear() : 
			(d.getMonth()+1) + "/" + d.getDate();
    return date;
}

function setDate(days){
    var d=new Date();
    d=getJaxDate(d);
    d.setDate(d.getDate() + parseInt(days));
    return d.getMonth()+1 + "/" + d.getDate() + "/" + d.getFullYear();
}


function getDay(d){
    return Math.floor((d.getTime() - d.getTimezoneOffset()*60*1000) / ONE_DAY);
}


function getMonthLength(d)
{
    var m=d.getMonth();
    var y=d.getFullYear();
    if(m==0 || m==2 || m==4 || m==6 || m==7 || m==9 || m==11){
	return 31;
    }else if(m==3 || m==5 || m==8 || m==10){
	return 30;
    }else if(y % 400==0){
	return 29;
    }else if(y % 100==0){
	return 28;
    }else if(y % 4==0){
	return 29;
    }else{
	return 28;
    }
}
//***************************************************************************************************************

function verifyMdn(query)
{
  //verify mdn
  query=query.replace(/\D/g, ""); // remove any non-digits  
  var mdnRegExp=/^[0-9]{10}$|^[0-9]{7}$/;
  if(mdnRegExp.test(query)){
  	if(query.length==7 && Smartbox.sbname.match(/jax/)){
		query="904" + query;
	}
	return query;
  }else{
	alert("Invalid mdn: " + query + ".");
	return false;
  }
}

/**
 * @Tao
 * Utility class for easier xml processing with IE/FF
 */
var SmartXML=(function(){
	//private
	/**
	 * Tao
	 * 
	 * Helper function to get the desired node
	 * 
	 * @param {node} xml	-xml node to check
	 * @param {string} tag	-[optional] tag name to use, if not specified, use xml node
	 * @param {number} pos	-[optional] posistion of nth tag to use, if not specified, use the first one
	 */
	var getNode=function(xml, tag, pos){
		var node=xml;
		try{
			if(tag){
				node=xml.getElementsByTagName(tag)[pos||0];				
			}									
		}catch(e){
			SmartboxException.dispatch(e);
		}
		return node;
	}
	
	//public
	return {
		/**
		 * 
		 * @param {node} xml	- xml node to check
		 * @param {Object} attr - attribute to get
		 * @param {string} tag	-[optional]tag name to use
		 * @param {number} pos	-[optional] nth tag
		 */
		getAttribute:function(xml, attr, tag, pos){
			var node=getNode(xml, tag, pos);
			return attr?node.getAttribute(attr):"";
		},
		
		/**
		 * @Tao
		 * 
		 * return text content from a xml node
		 * IE use .text and FF use .textContent
		 * 
		 * @param {node} xml	-xml node to check
		 * @param {string} tag	-[optional] tag name to use, if not specified, use xml node
		 * @param {number} pos	-[optional] posistion of nth tag to use, if not specified, use the first one
		 */
		getText:function(xml, tag, pos){
			var node=getNode(xml, tag, pos);
			var text=BrowserDetect.browser == "Explorer" ? node.text : node.textContent;			
			return text;
		},
		
		/**
		 * @Tao
		 * 
		 * return converted number from selected tag
		 * could return NaN if no number found
		 * 
		 * @param {node} xml	-xml node to check
		 * @param {string} tag	-[optional] tag name to use
		 * @param {number} pos	-[optional] nth tag
		 */
		getNumber:function(xml, tag, pos){
			return Number(this.getText(xml, tag, pos));
		},
		
		/**
		 * @Tao
		 * 
		 * return fixed length number, default is 2
		 * could return NaN if no number found
		 * 
		 * @param {node} xml	-xml node to check
		 * @param {string} tag	-[optional]tag name to use
		 * @param {number} pos	-[optional] nth tag
		 * @param {number} len	-[optional] fixed length, default:2
		 */
		getCurrency:function(xml, tag, pos, len){
			return this.getNumber(xml, tag, pos).toFixed(len||2);
		}
	}
})();

//in case of typo
var SmartXml=SmartXML;

var ReportGenerater=(function(){
	
	//private var	
	var form;
	var sbname="";	
	var url="html/ReportGenerater.html";
	var once=true;
	var stop=false;
	var results="";
	
	
	//private function
	var nextRequest=function(day, type){
		if(!stop && !once){
			var span=document.createElement("div");
			span.style.color="blue";
			span.innerHTML="Requesting: " + sbname + ": " + type + " (" + SmartboxTime.printDate(day, true, true) + ")...";
			results.insertBefore(span, results.firstChild);
			requestReports(Number(day)-1, type, span);	
		}else{
			form.start.disabled="";
		}		
	};	
	
	var requestReports=function(day, type, span){
		
		var method="billing.BillingEvent.get" + type + "Report";
		
		var url = Smartbox.controlUrl + method;
		
		var eargs = $H({
        	func: "ReportGenerater.requestReports",
        	method: "cgi-bin/generateReports.pl"
    	});
		new Ajax.Request("cgi-bin/generateReports.pl", {
			method:'get',
			parameters:{
				__proxy_url:Smartbox.controlUrl + method,
				__proxy_username:Smartbox.proxyUsername,
				__smartbox_name:sbname,
				__type:type,
				day:day
			},
			onSuccess:function(transport){
				if(SmartboxException.parse(transport, eargs)){
					var text=transport.responseText;
					if(text=="No result."){
						span.style.color="orange";
						span.innerHTML=sbname + ": " + type + " - Finished: " + text;
						form.start.disabled="";
					}else{
						span.style.color="green";
						span.innerHTML= sbname + ": " + type + " (" + SmartboxTime.printDate(day, true, true) + ") - Successful. <br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at " + text;
						nextRequest(day, type);	
					}										
				}
			},
			onFailure:function(transport){
				span.style.color="red";
				span.innerHTML=sbname + ": " + type + " (" + SmartboxTime.printDate(day, true, true) + ") - Failed!";
				throw new SmartboxException("AjaxFailure", transport.status + ": " + transport.statusText, eargs);
			},
			onException:function(req, e){
				form.start.disabled="";
				span.style.color="red";
				span.innerHTML=sbname + ": " + type + " (" + SmartboxTime.printDate(day, true, true) + ") - Failed!";
				SmartboxException.dispatch(e, eargs);
			}
		});
	};
	
	return {
	
		//public var
		
	
		//public method
		init:function(){
			new Ajax.Updater(Home.main, url, {
	            method: 'get',
	            asynchronous: true,
				onComplete:function(){					
					Home.SlideIn();
					$("choosedate").value=SmartboxTime.setDate(-1);
					var select=$("ReportGeneraterSBSelect");
					Home.selectSmartboxNames(select);
				}
			});
		},
		start:function(start){
			stop=false;
			form=start.form;
			start.disabled=form.daily.checked || form.hourly.checked;
			if(start.disabled){
				results=$("ReportGeneraterResults");
				results.innerHTML="";			
							
				once=form.quantity[0].checked;			
				sbname=form.sbname.value;
				if (sbname == "") {
					sbname = Smartbox.sbname;
				}
				day=SmartboxTime.getDay(new SmartboxTime(Date.parse(form.choosedate.value)));
				
								
				if(form.daily.checked){
					var span=document.createElement("div");
					span.style.color="blue";				
					results.appendChild(span);
					span.innerHTML="Requesting: " + sbname + ": Daily (" + SmartboxTime.printDate(day, true, true) + ")...";
					requestReports(day, 'Daily', span);	
				}		
				if(form.hourly.checked){
					var span=document.createElement("div");
					span.style.color="blue";				
					results.appendChild(span);
					span.innerHTML="Requesting: " + sbname + ": Hourly (" + SmartboxTime.printDate(day, true, true) + ")...";
					requestReports(day, 'Hourly', span);	
				}	
			}						
		},
		stop:function(){
			stop=true;
		},
		chooseSmartbox:function(select){
			sbname=select.value;
		}
	};
})();
