﻿// //// Page Class ///// //
function getEl(mId, mHtmlElType){
	var el = null;
	
	if (!(mHtmlElType) || (mHtmlElType == ""))
		mHtmlElType = "div";
		
	if (document.getElementById)
		el = document.getElementById(mId);
	
	if ((el == null))
		el = document.createElement(mHtmlElType);
	
	return el;
}
// //////////////////// Ajax Request ////////////////////// /

//default Variables Of Ajax Request
var Html_http_xml_HtrAj;
var tmp_valu_btn_HtrAj;
var tmp_div_name_HtrAj;
var tmp_btn_name_HtrAj;
var tmp_ajax_controler_id_HtrAj;
var debugMode = true;

//Create Http XML Object Cross Browser
function Get_Html_Object_xml_HtrAj(handler){
	var Html_Object_xml_HtrAj=null;
	if (navigator.userAgent.indexOf("MSIE")>=0){
		var strName="Msxml2.XMLHTTP";
		if (navigator.appVersion.indexOf("MSIE 5.5")>=0){
			strName="Microsoft.XMLHTTP";
		}
		try 
		{
			Html_Object_xml_HtrAj = new ActiveXObject(strName);
			Html_Object_xml_HtrAj.onreadystatechange=handler;
			return Html_Object_xml_HtrAj;
		}
		catch(e)
		{
			alert("جاوا اسکريپت مرورگر شما غير فعال مي باشد");
			return;
		}
	}
	if (navigator.userAgent.indexOf("Mozilla")>=0){
		Html_Object_xml_HtrAj=new XMLHttpRequest();
		Html_Object_xml_HtrAj.onload=handler;
		Html_Object_xml_HtrAj.onerror=handler;
		return Html_Object_xml_HtrAj;
	}
}

//Main Function Of Loading Html Over HTTP XML Object
function load_html_value_HtrAj(m_address , m_method , m_div_id , m_params , m_btn_id , m_ajax_cnt_id , m_return_type , m_callback_function){
	tmp_div_name_HtrAj = m_div_id;
	tmp_ajax_controler_id_HtrAj = m_ajax_cnt_id;
	if (m_btn_id ==""){
		//tmp_btn_name_HtrAj = "def_btn";
		tmp_btn_name_HtrAj = "";
	}else{
		tmp_btn_name_HtrAj = m_btn_id;
		tmp_valu_btn_HtrAj = getEl(tmp_btn_name_HtrAj).value;
		getEl(tmp_btn_name_HtrAj).disabled = true;
		getEl(tmp_btn_name_HtrAj).value = "Working... busy...";
	}
	//show_prosses();
	
	var url = m_address;
	Html_http_xml_HtrAj=Get_Html_Object_xml_HtrAj(function(){
	
		Process_Ajax_Response(m_return_type , m_callback_function);
	
	});
	if (m_method == "POST") {
		Html_http_xml_HtrAj.open(m_method , url , true);
		Html_http_xml_HtrAj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		Html_http_xml_HtrAj.setRequestHeader("Content-length", m_params.length);
		Html_http_xml_HtrAj.setRequestHeader("Connection", "close");
		Html_http_xml_HtrAj.send(m_params);
	}else{
		Html_http_xml_HtrAj.open(m_method , url + '&' + m_params , true);
		Html_http_xml_HtrAj.send(null);
	}
}

//Insert Into Div When Ajax Loading Complete
var ajax_error_text;
var ajax_error_code;
var ajax_call_back_value;
function Process_Ajax_Response(m_return_type , m_callback_function){
	if (Html_http_xml_HtrAj.readyState==4 || Html_http_xml_HtrAj.readyState=="complete"){
		if ((Html_http_xml_HtrAj.status == 200) || (debugMode)) {
			if ( (tmp_div_name_HtrAj != "") && ( (m_return_type == "html")||(m_return_type=="") ) ){
				getEl(tmp_div_name_HtrAj).innerHTML = Html_http_xml_HtrAj.responseText;
			}
			if (tmp_btn_name_HtrAj != ""){
				getEl(tmp_btn_name_HtrAj).disabled = false;
				getEl(tmp_btn_name_HtrAj).value = tmp_valu_btn_HtrAj;
			}
			//hide_prosses();
			if (m_return_type == "xml"){
				ajax_call_back_value = Html_http_xml_HtrAj.responseXML;
			}else{
				ajax_call_back_value = Html_http_xml_HtrAj.responseText;
			}
			if (m_callback_function){
				m_callback_function();
			}
			ajax_error_code = 200
			ajax_error_text = "HTTP OK"

			do_ajax_task_alter(tmp_ajax_controler_id_HtrAj);
		} else {
			var http_error_status = Html_http_xml_HtrAj.status;
			var http_error_group = Number( http_error_status.toString().substr(0,1) );
			switch (http_error_group) {
				case 1:
					ajax_error_code = http_error_status;
					ajax_error_text = "Informational Response Detected";
					break;
				case 2:
					switch (http_error_status){
						case 204:
							ajax_error_code = http_error_status;
							ajax_error_text = "Content Is Empty Or Currept";
							break;
						case 205:
							ajax_error_code = http_error_status;
							ajax_error_text = "Content Is Empty Or Currept";
							break;
						case 206:
							ajax_error_code = http_error_status;
							ajax_error_text = "Content Is Empty Or Currept";
							break;
						default:
						ajax_error_code = http_error_status;
						ajax_error_text = "Uknown HTTP Content";
					}
					break;
				case 3:
					ajax_error_code = http_error_status;
					ajax_error_text = "Server Request For Redirect";
					break;
				case 4:
					switch(http_error_status){
						case 400:
							ajax_error_code = http_error_status;
							ajax_error_text = "Bad Request";
							break;
						case 401:
							ajax_error_code = http_error_status;
							ajax_error_text = "Unauthorized Request";
							break;
						case 403:
							ajax_error_code = http_error_status;
							ajax_error_text = "Forbidden Request";
							break;
						case 404:
							ajax_error_code = http_error_status;
							ajax_error_text = "File Not Found";
							break;
						case 405:
							ajax_error_code = http_error_status;
							ajax_error_text = "Request Method Not Allowed";
							break;
						case 407:
							ajax_error_code = http_error_status;
							ajax_error_text = "Proxy Authentication Required";
							break;
						case 408:
							ajax_error_code = http_error_status;
							ajax_error_text = "Request Timeout";
							break;
						case 413:
							ajax_error_code = http_error_status;
							ajax_error_text = "Request Entity Too Large";
							break;
						case 414:
							ajax_error_code = http_error_status;
							ajax_error_text = "Request-URI Too Long";
							break;
						default:
						ajax_error_code = http_error_status;
						ajax_error_text = "Request Has Been Rejected By Server";
					}
					break;
				case 5:
					switch(http_error_status){
						case 500:
							ajax_error_code = http_error_status;
							ajax_error_text = "Internal Server Error";
							break;
						case 503:
							ajax_error_code = http_error_status;
							ajax_error_text = "Internal Server Error";
							break;
						default:
						ajax_error_code = http_error_status;
						ajax_error_text = "Uknown Server Error";
					}
					break;
				default:
					ajax_error_code = http_error_status;
					ajax_error_text = "Uknown HTTP Error";
			}
			do_ajax_task_alter(tmp_ajax_controler_id_HtrAj);
		}
	}
}

// //////////////////// Ajax Task ////////////////////// //
// Default Variable
var ajax_interval_id;

var arr_ajax_task = [];
var arr_ajax_task_fin = [];
var arr_ajax_task_time = [];
var arr_ajax_task_method = [];
var arr_ajax_task_address = [];
var arr_ajax_task_div = [];
var arr_ajax_task_params = [];
var arr_ajax_task_btn = [];
var arr_ajax_task_function = [];
var arr_ajax_task_returntype = [];

var ajax_status_lock = false;

var show_report_ajax = true;

// This Function Add An Ajax Queue --- This Is a Way To Starting an Ajax Request
function add_ajax_task(m_name , m_method , m_address , m_div , m_params , m_btn , m_return_type , m_callback_function){
	arr_ajax_task[arr_ajax_task.length] = m_name;
	arr_ajax_task_fin[arr_ajax_task.length - 1] = 0;
	arr_ajax_task_time[arr_ajax_task.length - 1] = Date();
	arr_ajax_task_method[arr_ajax_task.length - 1] = m_method;
	arr_ajax_task_address[arr_ajax_task.length - 1] = m_address;
	arr_ajax_task_div[arr_ajax_task.length - 1] = m_div;
	arr_ajax_task_params[arr_ajax_task.length - 1] = m_params;
	arr_ajax_task_btn[arr_ajax_task.length - 1] = m_btn;
	arr_ajax_task_function[arr_ajax_task.length - 1] = m_callback_function;
	arr_ajax_task_returntype[arr_ajax_task.length - 1] = m_return_type;
	
	if (show_report_ajax){
		show_ajax_task(arr_ajax_task.length , m_name);
	}
	set_invertal_ajax_task()
	return arr_ajax_task.length;
}

//This Function Do Ajax Request When Time Is Right
function do_ajax_task(m_id){
	ajax_status_lock = true;
	//var tmp_randomize;
	//tmp_randomize = Math.random() * 9213490;
	load_html_value_HtrAj(arr_ajax_task_address[m_id] , arr_ajax_task_method[m_id] , arr_ajax_task_div[m_id] , arr_ajax_task_params[m_id] , arr_ajax_task_btn[m_id] , m_id , arr_ajax_task_returntype[m_id] , arr_ajax_task_function[m_id]);
}

// When Ajax Request Complete This Function Make Ajax Task Ready For Next Task In Queue
function do_ajax_task_alter(m_id){
	arr_ajax_task_fin[m_id] = 1;
	if (show_report_ajax){
		if (ajax_error_code != 200){
			getEl("ajax_task_viewer_" + m_id).style.background = "#FF9933";
			getEl("ajax_task_viewer_" + m_id).innerHTML += "&nbsp;(Error: " + ajax_error_text + ")";
			alert("#" + ajax_error_code + " Error: " + ajax_error_text + "");
		}else{
			getEl("ajax_task_viewer_" + m_id).style.background = "#99FF33";
			getEl("ajax_task_viewer_" + m_id).innerHTML += "&nbsp;(Done!)";
		}
	}
	if (arr_ajax_task_function[m_id]){
		arr_ajax_task_function[m_id](ajax_call_back_value);
	}
	ajax_status_lock = false;
}

//Calculate Time For ajax Request
function show_time_wait(m_id){
	getEl("ajax_task_viewer_" + m_id + "_sub").style.background = "#ffc0c0";
	getEl("ajax_task_viewer_" + m_id + "_sub").innerHTML = "&nbsp;(" + (Date.parse(Date()) - Date.parse(arr_ajax_task_time[m_id]))/1000 + " Sec)";
}

// This Function Is An Invertal Function To Do Ajax Task
function do_ajax_invertal(){
	Show_Ajax_Status();
	if (ajax_status_lock != true){
		var i;
		i = 0;
		for (i = 0; i < arr_ajax_task.length; i++){
			if (arr_ajax_task_fin[i] != 1){
				do_ajax_task(i);
				if ((i+1)>= arr_ajax_task.length){
					return;
				}else{
					if (show_report_ajax){
						show_time_wait(i+1);
					}
				}
				return;
			}
		}
	}else{
		return;
	}
}

// If An Ajax Request OutSide This Function Return True Else This Function Return False
function Is_Ajax_Working(){
	var i;
	i = 0;
	for (i = 0; i < arr_ajax_task.length; i++){
		if (arr_ajax_task_fin[i] != 1){
			return true;
		}
	}
	return false;
}

// To Display Ajax Task Details In Side Bar
function show_ajax_task(m_id,m_name){
	getEl("ajax_task_viewer").innerHTML = "<div id='ajax_task_viewer_" + (m_id - 1) + "'>(" + m_id + ") Ajax Task '" + m_name + "' Added On " + Date() + "<div id='ajax_task_viewer_" + (m_id - 1) + "_sub' style='width: 45px; display: inline;'></div></div>" + getEl("ajax_task_viewer").innerHTML;
}

// If An Error Rais
function Ajax_On_Error() {
	alert("یک خطا پیش آمده است. در صورتی که بار چندم است که این پیام را مشاهده می کنید با پشتیبانی تماس بگیرید");
	return true;
}

//This Function Create An Invertal To Do Ajax tasks
function set_invertal_ajax_task(){
	//window.onerror = Ajax_On_Error;
	if (ajax_interval_id != 0){
		clearInterval(ajax_interval_id);
		ajax_interval_id = setInterval("do_ajax_invertal()",1);
	}else{
		ajax_interval_id = setInterval("do_ajax_invertal()",1);
	}
}

//Clear Ajax task Panel
function clear_ajax_tasks(){
	getEl("ajax_task_viewer").innerHTML = "";
}

// View Ajax Task Panel
function show_ajax_reporter(){
	getEl("ajax_task_viewer").style.display = "";
	show_report_ajax = true;
}

// Hide Ajax Task Panel
function hide_ajax_reporter(){
	getEl("ajax_task_viewer").style.display = "none";
	show_report_ajax = false;
}

// View Status Of Ajax Request
function Show_Ajax_Status(){
	if(Is_Ajax_Working()){
		getEl("Ajax_Status").innerHTML = "Busy ...";
	}else{
		getEl("Ajax_Status").innerHTML = "Idle";
		clearInterval(ajax_interval_id);
		ajax_interval_id = 0
	}
}