/*
 *
 * Genx Developing Suit v1 [JScript]
 * autor: Genx <master@genx.ru>
 * file version: $Revision: 1.4 $
 * file avtor: Genx <master@genx.ru>
 * Modified: $Date: 2009/04/01 03:44:51 $
 *
 ***********************************************/

var dsBaseURL;
var dsBaseJSURL; 
var dsAjaxObj;
var ds_is_include = new Array();
dsBaseURL = document.getElementsByTagName('base')[0].href;
dsBaseJSURL = dsBaseURL + 'js/';
dsAjaxObj = dsAjaxInit();

function dsDefineJS(file) {
	ds_is_include[file] = true;
}

function dsIncludeJS(file) {
	if (ds_is_include[file]) return;
	dsAjaxObj.open('GET', dsBaseJSURL + file, false);
	dsAjaxObj.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 1999 00:00:00 GMT");
	dsAjaxObj.send(null);
	var code = dsAjaxObj.responseText;
	if (typeof window.execScript != 'undefined') window.execScript(code);
		else eval (code);
}


function dsAddEvent(node, evtType, func) {
	if (node != window) {
		dsEventTarget(node);
		node.addEventListener(evtType, func, false);
	} else {
		if (node.addEventListener) {
			node.addEventListener(evtType, func, false);
			return true;
		} else if (node.attachEvent) {
			return node.attachEvent("on" + evtType, func);
		} else {
			return false;
		}
	}
}

function dsWindowOpen(Url, Width, Height, Name) {
	if (navigator.userAgent.indexOf('Opera') >= 0) {
		var ow = document.body.clientWidth, oh = document.body.clientHeight;
	} else {
		var ow = screen.width, oh = screen.height;
	}
	Width = Width || 640;
	Height = Height || 480;
	var left = (ow - Width)/2;
	var top = (oh - Height)/2;

	var feats = new Array("width=" + Width, "height=" + Height, "left=" + left, "top=" + top, "scrollbars=1", "status=1", "resizable=0");

	if (!Name) Name = Url.replace(/([\W]+)/g, '');
	if (Url == '') {
		Url = 'about:blank';
	} else {
		Url = dsBaseURL+Url;
	}
	window.open(Url,Name,feats.join(',')).focus();
}

function dsAjaxInit() {
	var ajax_obj = false;
	/* Create a new XMLHttpRequest object to talk to the Web server */
	/*@cc_on @*/
	/*@if (@_jscript_version >= 5)
	try {
		ajax_obj = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			ajax_obj = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (e2) {
			ajax_obj = false;
		}
	}
	@end @*/
	if (!ajax_obj && typeof XMLHttpRequest != 'undefined') {
		ajax_obj = new XMLHttpRequest();
	}
	return ajax_obj;
}

function dsGetPageSize () {
	
	var xScroll, yScroll;
	
	if (window.innerHeight && window.scrollMaxY) {	
		xScroll = window.innerWidth + window.scrollMaxX;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else {
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}

	var windowWidth, windowHeight;
	
	if (self.innerHeight) {
		if(document.documentElement.clientWidth){
			windowWidth = document.documentElement.clientWidth; 
		} else {
			windowWidth = self.innerWidth;
		}
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}	
	
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else { 
		pageHeight = yScroll;
	}

	if(xScroll < windowWidth){	
		pageWidth = xScroll;		
	} else {
		pageWidth = windowWidth;
	}

	arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight);
	return arrayPageSize;
}


function dsEventTarget(obj) {
	if(!obj.addEventListener) obj.addEventListener = ds_myAddEventListener;
	if(!obj.removeEventListener) obj.removeEventListener = ds_myRemoveEventListener; 
}

function ds_myAddEventListener (name, func, dummyDirection) {
	if(!this._elisteners) this._elisteners={}; //регистр событий
	var sname = "~"+name;
	if(!this._elisteners[sname]) this._elisteners[sname]=[];

	for(var i=0; i<this._elisteners[sname].length; i++) if(this._elisteners[sname][i]==func) return;
	this._elisteners[sname].push(func);

	this["on"+name]=ds_myEventHandler; 
}

function ds_myRemoveEventListener (name, func, dummyDirection) {
	name = "~"+name;
	if(!this._elisteners || !this._elisteners[name]) return;
	for(var i=0; i<this._elisteners[name].length; i++)
		if(this._elisteners[name][i] == func) {
			this._elisteners[name].splice(i, 1);
			return;
		}
}

function ds_myEventHandler (e) {
	var evt = window.event? window.event: e;
	if(!evt) return;
	var name = "~"+evt.type;
	var uniquen = "ds"+name;
	
	if(this._elisteners[name])
	for(var i=0; i<this._elisteners[name].length; i++) {
		this[uniquen] = this._elisteners[name][i];
		this[uniquen](evt);

	}
}

if(!Array.prototype.push) Array.prototype.push=function() {
	for(var i=0; i<arguments.length; i++) this[this.length]=arguments[i];
	return this.length;
};

if(!Array.prototype.splice) Array.prototype.splice=function(from, len) {
	var left=this.slice(0, from);
	var right=this.slice(from+len);
	var rem=this.slice(from, from+len);
	var add=[]; add.length=arguments.length-2;
	for(var i=2; i<arguments.length; i++) add[i-2]=arguments[i];
	var ret=left.concat(add, right);
	this.length=0;
	for(var i=0; i<ret.length; i++) this[i]=ret[i];
	return rem;
};
 
function getEventTarget(evt) {
	return evt.srcElement? evt.srcElement: evt.target;

}

function getKeyCode(evt) {
	evt = getEventTarget(evt);
	var key = evt.keyCode? evt.keyCode: evt.charCode;
	return getKeyCode.convkeys[String(key)]? getKeyCode.convkeys[String(key)]: key;		
}

function unserialize (inp) {
 
	error = 0;
	if (inp == "" || inp.length < 2) {
		errormsg = "input is too short";
		return;
	}
	var val, kret, vret, cval;
	var type = inp.charAt(0);
	var cont = inp.substring(2);
	var size = 0, divpos = 0, endcont = 0, rest = "", next = "";
 
	switch (type) {
	case "N": // null
		if (inp.charAt(1) != ";") {
			errormsg = "missing ; for null";
		}
		// leave val undefined
		rest = cont;
		break;
	case "b": // boolean
		if (!/[01];/.test(cont.substring(0,2))) {
			errormsg = "value not 0 or 1, or missing ; for boolean";
		}
		val = (cont.charAt(0) == "1");
		rest = cont.substring(1);
		break;
	case "s": // string
		val = "";
		divpos = cont.indexOf(":");
		if (divpos == -1) {
			errormsg = "missing : for string";
			break;
		}
		size = parseInt(cont.substring(0, divpos));
		if (size == 0) {
			if (cont.length - divpos < 4) {
				errormsg = "string is too short";
				break;
			}
			rest = cont.substring(divpos + 4);
			break;
		}
		if ((cont.length - divpos - size) < 4) {
			errormsg = "string is too short";
			break;
		}
		if (cont.substring(divpos + 2 + size, divpos + 4 + size) != "\";") {
			errormsg = "string is too long, or missing \";";
		}
		val = cont.substring(divpos + 2, divpos + 2 + size);
		rest = cont.substring(divpos + 4 + size);
		break;
	case "i": // integer
	case "d": // float
		var dotfound = 0;
		for (var i = 0; i < cont.length; i++) {
			cval = cont.charAt(i);
			if (isNaN(parseInt(cval)) && !(type == "d" && cval == "." && !dotfound++)) {
				endcont = i;
				break;
			}
		}
		if (!endcont || cont.charAt(endcont) != ";") {
			errormsg = "missing or invalid value, or missing ; for int/float";
		}
		val = cont.substring(0, endcont);
		val = (type == "i" ? parseInt(val) : parseFloat(val));
		rest = cont.substring(endcont + 1);
		break;
	case "a": // array
		if (cont.length < 4) {
			errormsg = "array is too short";
			return;
		}
		divpos = cont.indexOf(":", 1);
		if (divpos == -1) {
			errormsg = "missing : for array";
			return;
		}
		size = parseInt(cont.substring(1, divpos - 1));
		cont = cont.substring(divpos + 2);
		val = new Array();
		if (cont.length < 1) {
			errormsg = "array is too short";
			return;
		}
		for (var i = 0; i + 1 < size * 2; i += 2) {
			kret = unserialize(cont, 1);
			if (error || kret[0] == undefined || kret[1] == "") {
				errormsg = "missing or invalid key, or missing value for array";
				return;
			}
			vret = unserialize(kret[1], 1);
			if (error) {
				errormsg = "invalid value for array";
				return;
			}
			val[kret[0]] = vret[0];
			cont = vret[1];
		}
		if (cont.charAt(0) != "}") {
			errormsg = "missing ending }, or too many values for array";
			return;
		}
		rest = cont.substring(1);
		break;
	case "O": // object
		divpos = cont.indexOf(":");
		if (divpos == -1) {
			errormsg = "missing : for object";
			return;
		}
		size = parseInt(cont.substring(0, divpos));
		var objname = cont.substring(divpos + 2, divpos + 2 + size);
		if (cont.substring(divpos + 2 + size, divpos + 4 + size) != "\":") {
			errormsg = "object name is too long, or missing \":";
			return;
		}
		var objprops = unserialize("a:" + cont.substring(divpos + 4 + size), 1);
		if (error) {
			errormsg = "invalid object properties";
			return;
		}
		rest = objprops[1];
		var objout = "function " + objname + "(){";
		for (key in objprops[0]) {
			objout += "" + key + "=objprops[0]['" + key + "'];";
		}
		objout += "}val=new " + objname + "();";
		eval(objout);
		break;
	default:
		errormsg = "invalid input type";
	}
	return (arguments.length == 1 ? val : [val, rest]);
}

getKeyCode.convkeys={"1":65,"2":66,"4":68,"12":76,"16":80,"19":83,"20":84,"21":85,"26":90};

dsDefineJS("ds/stdfx.js");


function dsEffectsClass () {

	this.setElementOpacity = function (elem, nOpacity) {
		var opacityProp = this.getOpacityProperty();
		if (!elem || !opacityProp) return;
		if (opacityProp=="filter") {
			nOpacity *= 100;
			var oAlpha = elem.filters['DXImageTransform.Microsoft.alpha'] || elem.filters.alpha;
			if (oAlpha) oAlpha.opacity = nOpacity;
				else elem.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity="+nOpacity+")";
		} else elem.style[opacityProp] = nOpacity;
	}

	this.getOpacityProperty = function () {
		if (typeof document.body.style.opacity == 'string') return 'opacity';
		else if (typeof document.body.style.MozOpacity == 'string') return 'MozOpacity';
		else if (typeof document.body.style.KhtmlOpacity == 'string') return 'KhtmlOpacity';
		else if (document.body.filters && navigator.appVersion.match(/MSIE ([\d.]+);/)[1]>=5.5) return 'filter';
		return false;
	}
}

dsEffects = new dsEffectsClass();

function dsModalWindowClass () {

	this.hideBody = function () {
    
		this.pageSize = dsGetPageSize();		
	
		this.shadowDiv = document.createElement("DIV");
		this.shadowDiv.style.position = 'absolute';
		this.shadowDiv.style.top = '0px';
		this.shadowDiv.style.left = '0px';
		this.shadowDiv.style.width = this.pageSize[0]+'px';
		this.shadowDiv.style.height = this.pageSize[1]+'px';
		this.shadowDiv.style.backgroundColor = 'black';
		document.body.appendChild(this.shadowDiv);
		dsEffects.setElementOpacity(this.shadowDiv, 0.6);
		dsAddEvent(window, 'resize', function (e) {dsModalWindow.resizeShadow()});

	}

	this.resizeShadow = function () {
		this.pageSize = dsGetPageSize();		
		this.shadowDiv.style.width = this.pageSize[0]+'px';
		this.shadowDiv.style.height = this.pageSize[1]+'px';
	}

	this.show = function (text, dWidth, dHeight) {
		this.hideBody();
		if (!dWidth) dWidth = 640;
		if (!dHeight) dHeight = 480;
		this.dWidth = dWidth;
		this.dHeight = dHeight;
		this.modalDiv = document.createElement("DIV");
		document.body.appendChild(this.modalDiv);
		comboboxes = document.getElementsByTagName('select');
		for (i = 0; i < comboboxes.length; i++) {
			comboboxes[i].style.visibility = 'hidden';
		}
		Body = document.getElementsByTagName((document.compatMode && document.compatMode == "CSS1Compat") ? "HTML" : "BODY")[0];
		SY = window.scrollY ? window.scrollY : Body.scrollTop;
		SX = window.scrollX ? window.scrollX : Body.scrollLeft;

		this.modalDiv.id = 'modal_form';
		this.modalDiv.style.position = 'absolute';
		oLeft = SX + Math.round((this.pageSize[2]/2) - (dWidth/2));	
		oTop = SY + Math.round((this.pageSize[3]/2) - (dHeight/2)) +30;
		this.modalDiv.style.left =  oLeft + 'px';
		this.modalDiv.style.top =  oTop + 'px';
		this.modalDiv.style.width = dWidth + 'px';
		this.modalDiv.style.height = dHeight + 'px';
		this.modalDiv.innerHTML = '<img onclick="dsModalWindow.close();" src="'+text+'" style="cursor:pointer;" title="Кликните чтобы закрыть" />';
//		dsAddEvent(window, 'resize', function (e) {dsModalWindow.resizeWindow()});
//		if (window.scrollY) dsAddEvent(window, 'scroll', function (e) {dsModalWindow.resizeWindow()});
//		else dsAddEvent(document.body, 'scroll', function (e) {dsModalWindow.resizeWindow()});
		return false;
	}

	this.resizeWindow = function () {

		Body = document.getElementsByTagName((document.compatMode && document.compatMode == "CSS1Compat") ? "HTML" : "BODY")[0];
		SY = window.scrollY ? window.scrollY : Body.scrollTop;
		SX = window.scrollX ? window.scrollX : Body.scrollLeft;

		oLeft = SX + Math.round((this.pageSize[2]/2) - (this.dWidth/2));	
		oTop = SY + Math.round((this.pageSize[3]/2) - (this.dHeight/2));
		this.modalDiv.style.left =  oLeft + 'px';
		this.modalDiv.style.top =  oTop + 'px';
		this.modalDiv.style.width = this.dWidth + 'px';
		this.modalDiv.style.height = this.dHeight + 'px';
	}

	this.close = function () {
	    document.body.removeChild(this.shadowDiv);
	    document.body.removeChild(this.modalDiv);
		comboboxes = document.getElementsByTagName('select');
		for (i = 0; i < comboboxes.length; i++) {
			comboboxes[i].style.visibility = 'visible';
		}

	}

	this.showBody = function () {
		document.body.removeChild(this.shadowDiv);
	}
}

dsModalWindow = new dsModalWindowClass();