﻿// ------------------------------------ //
// razred za AJAX XMLHTTP objekt
// ------------------------------------ //
function AJAXObjectClass(aId){
	this.ID = aId;
	this.reqObj = null;
	this.ptrDone = null;
	this.ptrPending = null;
	this.URL = "";
	this.method = "POST";
	this.async = true;
	this.XMLDocument = "";
	this.XMLBody = "";
	this.XMLHeader = "";
	this.isActive = true;
	this.action = 0;
	this.lastState = -1;
	this.objContainer = null;
	
	this.invalidOutputException = new Error ("Neveljavi podatki!");
	this.unableToCreateDOMException = new Error ("Napaka pri inicializaciji DOM objekta!");

}
AJAXObjectClass.prototype.init = function(aURL,aptrDone,aptrPending,aContainer,aHASH){
	this.reqObj = this.getXmlHttpObject();
	this.ptrDone = aptrDone;
	this.ptrPending = aptrPending;
	this.URL = aURL;
	this.HASH = aHASH;
	if (aContainer != null) this.objContainer = document.getElementById(aContainer);
}
AJAXObjectClass.prototype.dispose = function(){
	this.reqObj = null;
	this.ptrDone = null;
	this.ptrPending = null;
}
AJAXObjectClass.prototype.prepare = function(aURL,aptrDone,aptrPending){
	this.URL = aURL;
	this.ptrDone = aptrDone;
	this.ptrPending = aptrPending;
}
AJAXObjectClass.prototype.xmlHeader = function(aAction){
	this.action= aAction;
	this.XMLBody = "";
	this.XMLHeader = "";
	this.XMLHeader += this.xmlNode("action","",aAction);
	this.XMLHeader += this.xmlNode("hash","",this.cDataWrap(this.HASH));
	this.XMLHeader += this.xmlNode("errorcode","",0);
	this.XMLHeader += this.xmlNode("errordesc","","");
}
AJAXObjectClass.prototype.cDataWrap = function(aIn){
	return "<![CDATA[" + aIn +"]]>";
}
AJAXObjectClass.prototype.xmlAddData = function(aParamName,aData,aIsKey){
	var lOut = "";
	var lAttr = "";

	lAttr = "name=\"" + aParamName + "\" iskey=\"" + aIsKey + "\"";
	aData = this.cDataWrap(aData);
	lOut += this.xmlNode("data","",aData);
	lOut += this.xmlNode("errorcode","",0);
	lOut += this.xmlNode("errordesc","","");
	this.XMLBody += this.xmlNode("param",lAttr,lOut);
}
AJAXObjectClass.prototype.xmlNode = function(aNodeName,aAttributes,aData){
	if (aAttributes != "" && aAttributes != null) 
		aAttributes = " " + aAttributes;
	else
		aAttributes = "";

	return "<" + aNodeName + aAttributes +  ">" + aData + "</" + aNodeName + ">";
}
AJAXObjectClass.prototype.FormatHTML = function(aDataIn,aIn,aOut){
	var lOut;
	var lStart = aDataIn.indexOf("<!-- [FORMSTART] -->");
	var lEnd = aDataIn.indexOf("<!-- [FORMEND] -->");
	if (lStart == -1 || lEnd == -1) {
		throw this.invalidOutputException;
		return;
	}
	lStart = lStart + 20;
	lOut = aDataIn.substring(lStart,lEnd);

	var re = new RegExp(aIn,"g");
	lOut = lOut.replace(re,aOut);
	return lOut;
}
AJAXObjectClass.prototype.xmlBuild = function(){
	var lOut = "";
	this.XMLDocument = "<?xml version=\"1.0\"?>";
	lOut = this.xmlNode("header","",this.XMLHeader);
	lOut += this.xmlNode("body","",this.XMLBody);
	this.XMLDocument += this.xmlNode("ajax","",lOut);
	return this.XMLDocument;
}
AJAXObjectClass.prototype.getXmlHttpObject = function(){
	var lDOM;
	if (typeof XMLHttpRequest != "undefined") {
        lDOM =  new XMLHttpRequest();
    } else if (window.ActiveXObject) {
      var aVersions = [ "MSXML2.XMLHttp.5.0",
        "MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0",
        "MSXML2.XMLHttp","Microsoft.XMLHttp"
      ];

      for (var i = 0; i < aVersions.length; i++) {
        try {
            var oXmlHttp = new ActiveXObject(aVersions[i]);
            lDOM = oXmlHttp;
        } catch (oError) {
            //Do nothing
        }
      }
    }

	if (!lDOM && window.createRequest) {try {lDOM = window.createRequest();} catch (e) {lDOM=false;	}}
	
	this.stateChanged.ID = this.ID;
	window.ID = this.ID;
	if (lDOM) {lDOM.onreadystatechange=this.stateChanged;} else {throw this.unableToCreateDOMException;return null;}
	return lDOM;
}
AJAXObjectClass.prototype.stateChanged = function(){
try{
	var lObj;
	try{
		if (typeof this.ID != "undefined"){
			lObj = AJAXManager.items[this.ID];
		}else if (typeof window.ID != "undefined"){
			lObj = AJAXManager.items[window.ID];
		}
	}catch(e){
		return
	}
	if (lObj.reqObj.readyState == lObj.lastState) return;
	lObj.lastState = lObj.reqObj.readyState;
	if (lObj.reqObj.readyState == AJAXConst.StateCompleted){
		AJAXManager.isLocked = false;
		if (lObj.reqObj.status != AJAXConst.responseOk){
		    lObj.reqObj.abort();
			lObj.ptrDone(lObj,lObj.reqObj.statusText,-1);
			if (lObj.objContainer != null) lObj.objContainer.innerHTML = AJAXManager.getLoadingMessage("Podatki trenutno niso na voljo. Poizkusite ponovno kasneje.");
		} else {
			switch (lObj.action){
				case AJAXConst.actionLoadHTML:{ 
					var lData;
					try{
						var lHeader = AJAXManager.getxmlHeader(lObj.reqObj.responseXML);
						if (lHeader[0] <= -1){	
							lObj.ptrDone(lObj,lObj.reqObj.responseXML,lHeader[0]);
							break;
						}
					}
					catch (e) {}
					try{	lData = lObj.FormatHTML(lObj.reqObj.responseText,AJAXManager.AJAXContainerID,AJAXManager.ParentContainerID);
					}
					catch (e){
						lObj.ptrDone(lObj,lObj.reqObj.responseText,-1);
						break;
					}
					lObj.ptrDone(lObj,lData,1);
					break;}
				default:{
					var lData = lObj.reqObj.responseXML;
						try{
							var lHeader = AJAXManager.getxmlHeader(lData);
							if (lHeader[0] <= -1){	
								lObj.ptrDone(lObj,lData,parseInt(lHeader[0]));
								break;
							}
							lObj.ptrDone(lObj,lData,1);
						} catch (e){lObj.ptrDone(lObj,e.message,-1);}
						break;
				}
			}
		}
		lObj.isActive = false;
		AJAXManager.clear();
	}else if (lObj.reqObj.readyState == AJAXConst.StateLoading){
		lObj.ptrPending(lObj);
	} else {
	}
} catch(e){/*alert("JScript napaka (Koda: 0x0001): " + e.message);*/}
}
AJAXObjectClass.prototype.execute = function(){
try{
	//if (AJAXManager.isLocked) return;
	AJAXManager.isLocked = true;
	this.reqObj.open(this.method, this.URL , this.async);
	this.reqObj.send(this.xmlBuild());
} catch(e){/*alert("JScript napaka (Koda: 0x0002): " + e.message);*/}
}
AJAXObjectClass.prototype.setContainerText = function(aText){
	if (this.objContainer != null) this.objContainer.innerHTML = aText;
}
AJAXObjectClass.prototype.initFromForm = function(aFormsManager){
	for (var i=0;i<aFormsManager.Items.length;i++){
		lElement = aFormsManager.Items[i];
		this.xmlAddData(lElement.Name,lElement.Data,lElement.IsKey);
	}
}

// ------------------------------------ //
// razred za AJAX manager objekt
// ------------------------------------ //
function AJAXManagerClass(){
	this.requests = 0;
	this.isLocked = false;
	this.items = new Array();
	this.appFolder = "";
	this.HASH = "";
	this.AJAXContainerID = "ctl00_dataArea_";
	this.ParentContainerID = "ctl00_ctl00_mainContent_dataContent_";
	
}
AJAXManagerClass.prototype.clearAll = function(){
	this.items = null;
	this.items = new Array();
}
AJAXManagerClass.prototype.clear = function(){
	for (var i=this.items.length-1;i>=0;i--){
		if (!this.items[i].isActive){
			this.items[i].dispose();
			this.items.pop();
			this.requests --;
		} else{return;}
	}	
}
AJAXManagerClass.prototype.getLoadingMessage = function(aText){
	return "<div class=\"loadingMsg\">" + aText + "</div>";
}
AJAXManagerClass.prototype.getLoadingMessage1 = function(){
	return this.getLoadingMessage("Nalagam vsebino ...");
}
AJAXManagerClass.prototype.getLoadingMessage2 = function(){
	return this.getLoadingMessage("<img src=\""+this.appFolder+"/Library/img/ajax_loading.gif\" />");
}
AJAXManagerClass.prototype.isPending = function(){
	for (var i=1;i<this.items.length;i++){
		if (this.items[i].isActive) return true;
	}
	return false;
}
AJAXManagerClass.prototype.loading = function(aObj){
	//aObj.setContainerText(AJAXManager.getLoadingMessage2());
	MSGBOXManager.Message("Nalagam ...");
}
AJAXManagerClass.prototype.loadDone = function(aObj,aData,aFlag){
	if (aFlag <= -1){
		/*alert(aData);*/
		aObj.setContainerText(AJAXManager.getLoadingMessage(AJAXConst.errorMessage));
		MSGBOXManager.Error("Napaka ...");
		return aFlag;
	}
	aObj.setContainerText(aData);
	MSGBOXManager.Hide();
	return aFlag;
}
AJAXManagerClass.prototype.saveDone = function(aObj,aData,aFlag){
	if (aFlag <= -1){
		MSGBOXManager.Error("Napaka ...");
		return aFlag;
	}
	MSGBOXManager.Hide();
	return aFlag;
}

AJAXManagerClass.prototype.getxmlHeader = function(aXML){
	var lOffset,lOut,lMessage,lCode;
	lOffset =  aXML.getElementsByTagName("ajax")[0];
	lCode = lOffset.getElementsByTagName("errorcode")[0].firstChild.nodeValue;
	try{
		lMessage = lOffset.getElementsByTagName("errordesc")[0].firstChild.nodeValue;
	} catch(e){lMessage ="";}
	return [lCode,lMessage];
}
AJAXManagerClass.prototype.prepare = function(aType,aURL,aptrDone,aptrPending,aContainer){
try{
	//if (this.isLocked) {alert("XMLHTTP objekt je zaseden!");return false;}
	var lId = this.items.length;
	this.requests ++;
	var lItem = new AJAXObjectClass(lId);
	this.items[lId] = lItem;
	this.items[lId].init(aURL,aptrDone,aptrPending,aContainer,this.HASH);
	this.items[lId].xmlHeader(aType);
} catch(e){/*alert("JScript napaka (Koda: 0x0003): " + e.message);*/return false;}
	return this.items[lId];
}
AJAXManagerClass.prototype.prepareHTML = function(aURL,aptrDone,aptrPending,aContainer){
	return this.prepare(AJAXConst.actionLoadHTML,aURL,aptrDone,aptrPending,aContainer);
}
AJAXManagerClass.prototype.prepareXML = function(aURL,aptrDone,aptrPending,aContainer){
	return this.prepare(AJAXConst.actionLoadXML,aURL,aptrDone,aptrPending,aContainer);
}
AJAXManagerClass.prototype.prepareInsert = function(aURL,aptrDone,aptrPending,aContainer){
	return this.prepare(AJAXConst.actionInsert,aURL,aptrDone,aptrPending,aContainer);
}
AJAXManagerClass.prototype.prepareUpdate = function(aURL,aptrDone,aptrPending,aContainer){
	return this.prepare(AJAXConst.actionUpdate,aURL,aptrDone,aptrPending,aContainer);
}
AJAXManagerClass.prototype.prepareDelete = function(aURL,aptrDone,aptrPending,aContainer){
	return this.prepare(AJAXConst.actionDelete,aURL,aptrDone,aptrPending,aContainer);
}
AJAXManagerClass.prototype.prepareCustom = function(aURL,aptrDone,aptrPending,aContainer){
	return this.prepare(AJAXConst.actionCustom,aURL,aptrDone,aptrPending,aContainer);
}

// ------------------------------------ //
// razred za AJAX konstante
// ------------------------------------ //
function AJAXConstClass(){
	this.StateUninitiailised = 0;
	this.StateLoading = 1;
	this.StateLoaded = 2;
	this.StateInteractive = 3;
	this.StateCompleted = 4;	

	this.responseError = 404;
	this.responseOk = 200;

	this.actionUpdate = 1;
	this.actionInsert = 2;
	this.actionLoadXML = 3;
	this.actionLoadHTML = 4;
	this.actionDelete = 5;
	this.actionCustom = 6;

	this.errorMessage="Podatki trenutno niso na voljo. Kliknite <a href=\"javascript:void(0);\" onclick=\"window.location.reload(true);return false;\">tukaj</a> za obnovitev.";
}

// ------------------------------------ //
// razred za AJAX history
// ------------------------------------ //
function addEvent(obj, evType, fn){
	 if (obj.addEventListener){
		 obj.addEventListener(evType, fn, true);
		 return true;
	 } else if (obj.attachEvent){
		 var r = obj.attachEvent("on"+evType, fn);
		return r;
	 } else {
		return false;
	 }
}
function removeEvent(obj,evType){
	 if (obj.removeEventListener){
		 obj.removeEventListener('click',arguments.callee,false);
		 return true;
	 } else {
		return false;
	 }
}
function AJAXHistoryClass(aFolder,aCallBackPtr){
	this.methodIFRAME = 1;
	this.methodHASH = 2;
	this.method = this.methodHASH;
	this.iframeHandler = null;
	this.formHandler = null;
	this.Active = false;
	this.Page = -1;
	this.appFolder = aFolder;	

	this.sweepInterval = 300;
	this.callbackFunction = aCallBackPtr;
	addEvent(window,"load",this.Inicialize);
}
AJAXHistoryClass.prototype.ReadHistory = function(){
	if (!this.Active) return;
	try{
		switch (this.method){
			case this.methodHASH:{this.ReadHistoryHASH();break;}
			case this.methodIFRAME:{this.ReadHistoryIFRAME();break;}
		}
	}
	catch(e){}
	self.setTimeout("AJAXHistory.ReadHistory()",this.sweepInterval);
}
AJAXHistoryClass.prototype.ReadHistoryHASH = function(){
	var lLoc = window.location.hash;
	if (lLoc.indexOf("#") >= 0){
		lLoc = lLoc.split("#");
		if (Number(lLoc[1]) != this.Page){
			this.callbackFunction(Number(lLoc[1]));
		}
	}
}
AJAXHistoryClass.prototype.ReadHistoryIFRAME = function(){
	var lLoc = this.iframeHandler.src;
	var lDataObj = this.iframeHandler.contentWindow.document.getElementById("containerId");
	var lPage = Number(lDataObj.innerHTML);
	if (lPage != this.Page){
		this.callbackFunction(lPage);
	}
}

AJAXHistoryClass.prototype.Inicialize = function(){
	if (isOpera(0)) return;
	// detect browser
	AJAXHistory.method = (isMicrosoft(0)?AJAXHistory.methodIFRAME:AJAXHistory.methodHASH);

	// init method - naredimo IFRAME
	if (AJAXHistory.method == AJAXHistory.methodIFRAME){
		AJAXHistory.iframeHandler = document.createElement("iframe");
		AJAXHistory.formHandler = document.getElementById("aspnetForm");
		AJAXHistory.iframeHandler.style.display="none";
		AJAXHistory.iframeHandler.src = this.appFolder+ "_AJAXHistory.aspx?page=" + this.Page;
		AJAXHistory.formHandler.appendChild(AJAXHistory.iframeHandler);
	}

	AJAXHistory.ReadHistory();
}
AJAXHistoryClass.prototype.WriteHistory = function(){
	switch (this.method){
		case this.methodHASH:{this.WriteHistoryHASH();break;}
		case this.methodIFRAME:{this.WriteHistoryIFRAME();break;}
	}
}
AJAXHistoryClass.prototype.WriteHistoryHASH = function(){
	window.location.hash=this.Page;
}
AJAXHistoryClass.prototype.WriteHistoryIFRAME = function(){
	window.location.hash=this.Page;
	this.iframeHandler.src = this.appFolder+ "_AJAXHistory.aspx?page=" + this.Page;
}
AJAXHistoryClass.prototype.Stop = function(){
	this.Active = false;
	self.clearTimeout();
}
AJAXHistoryClass.prototype.Resume = function(){
	this.Active = true;
	self.setTimeout("AJAXHistory.ReadHistory()",this.sweepInterval);
}


var AJAXConst = new AJAXConstClass();
var AJAXManager = new AJAXManagerClass();


function isFirefox(v) {return isBrowser("Firefox", v);}
function isMicrosoft(v) {return isBrowser("MSIE", v);}
function isOpera(v) {return isBrowser("Opera", v);}

function isBrowser(b,v) {
  var browserOk = false;
  var versionOk = false;

  browserOk = (navigator.userAgent.indexOf(b) != -1);
  if (v == 0) versionOk = true;
  else  versionOk = (v <= parseInt(navigator.appVersion));
  return browserOk && versionOk;
}
function IsBrowserSupported(){
	if (isOpera(0)) return true;
	if (!(isFirefox(0) || isMicrosoft(0))){
		return false;
	}
	return true;
}

