//-----------------------------------------------------------------------------
// Позиционироавние списка
function ComboBox() {
    
}

ComboBox.offsetY         = 1;
ComboBox.offsetX         = 0;
ComboBox.buttonOffsetX   = 0;     // See below for some considerations about
ComboBox.buttonOffsetY   = 0;     // that values (for IE)

if (!!window.opera) {
	ComboBox.buttonOffsetX = -1;
	ComboBox.buttonOffsetY = -1;
} else
if (navigator.userAgent.indexOf("MSIE") > 1){
	ComboBox.offsetY       = 0;
	ComboBox.offsetX       = -1;
	ComboBox.buttonOffsetX = -1;
	ComboBox.buttonOffsetY = -1;
	// but if document have xhtml dtd, things are different... :S
	if (document.getElementsByTagName("html")[0].getAttribute("xmlns") != null){
		ComboBox.offsetY       = 16;
		ComboBox.offsetX       = 10;
		ComboBox.buttonOffsetX = 8;
		ComboBox.buttonOffsetY = 14;
	}
}

//-----------------------------------------------------------------------------
// Some constants and internal stuff

ComboBox.HIDE_TIMEOUT    = 200;             // Time in ms for hide the calendar layer
ComboBox.hideTimeout     = null;            // The timeout identifier
ComboBox.buttonIdPrefix  = "ddButton";     // The prefix for the calendar button's id
ComboBox.dayIdPrefix     = "CALDAY";        // The prefix for the calendar days frames' id
ComboBox.submitByKey     = false;           // Is submitting by keyboard?
ComboBox.firstFocused    = false;           // Is the first time that the current edit control is focused?
ComboBox.hideCauseBlur   = false;           // Was the calendar close by onblur event?
ComboBox.onSubmitAsigned = false;           // Is form's onSubmit event asigned?

//-----------------------------------------------------------------------------
// Инициализация

ComboBox.init = function()
{
	// try to create the ComboBox.container:
	if (!document.getElementById("ComboBoxList")){
		this.listContainer                = document.createElement("div");
		this.listContainer.id             = "ComboBoxList";
		this.listContainer.style.zIndex   = "50000";
		this.listContainer.style.position = "absolute";
		this.listContainer.style.display  = "none";
		document.body.appendChild(this.listContainer);

		if (this.listContainer.addEventListener){ window.addEventListener("resize", CB_onWindowResize, false); }
		else if (this.listContainer.attachEvent){ window.attachEvent("onresize", CB_onWindowResize); }
	}
	
	// looking for input controls that will be transformed into ComboBox's.
	var inputControls = document.getElementsByTagName("input");
	var inputsLength  = inputControls.length;
	var toAdd = new Array();
	var i = 0;
	for (var k=0; k<inputsLength; k++){
		if (inputControls[k].type.toLowerCase() == "text"){
			var editctrl  = inputControls[k];
//			var cbattr   = editctrl.getAttribute("class");
			var cbattr   = editctrl.name;
			if (!cbattr) continue;
			cbattr = cbattr.split(' ');
			var setEvents = false;
			if (cbattr[0] == 'combo'){
				if (editctrl.id){
					if (!this.createButton(editctrl, false)) continue;
					if (editctrl.getAttribute("editable")==null && editctrl.form) {
						var valuectrl = document.createElement("input");
						valuectrl.setAttribute('type', 'hidden');
						valuectrl.id = editctrl.id+'_val';
						editctrl.setAttribute('vcid', valuectrl.id);
						toAdd[i++] = new Array(valuectrl, editctrl.form);
					}
					editctrl.style.backgroundImage = 'url("/im/dd.gif")'; 
					editctrl.style.backgroundPosition = 'right top';
					editctrl.style.backgroundRepeat = 'no-repeat';					
					setEvents = true;
				}
				else{
					alert("Attribute 'id' is mandatory for ComboBox.");
				}
			}
			// add the events:
			if (setEvents){
				if(editctrl.addEventListener){
					editctrl.addEventListener("keyup", CB_onEditControlKeyUp, false);
					editctrl.addEventListener("keydown", CB_onEditControlKeyDown, false);
					editctrl.addEventListener("keypress", CB_onEditControlKeyPress, false);
					editctrl.addEventListener("blur", CB_onEditControlBlur, false);
					editctrl.addEventListener("focus", CB_onEditControlFocus, false);
					editctrl.addEventListener("change", CB_onEditControlChange, false);
				}
				else if (editctrl.attachEvent){
					editctrl.attachEvent("onkeyup", CB_onEditControlKeyUp);
					editctrl.attachEvent("onkeydown", CB_onEditControlKeyDown);
					editctrl.attachEvent("onkeypress", CB_onEditControlKeyPress);
					editctrl.attachEvent("onblur", CB_onEditControlBlur);
					editctrl.attachEvent("onfocus", CB_onEditControlFocus);
					editctrl.attachEvent("onchange", CB_onEditControlChange);
				}
			}
		}
	}

	for(k=0;k<toAdd.length;k++) {
		toAdd[k][1].appendChild(toAdd[k][0]);
	}
}

//-----------------------------------------------------------------------------
//  Wrapper for init()

function CB_autoInit() { ComboBox.init(); }
if (window.addEventListener) { window.addEventListener("load", CB_autoInit, false); }
else if (window.attachEvent){ window.attachEvent("onload", CB_autoInit); }


//-----------------------------------------------------------------------------
/**
 * Creates the calendar button for a text-input control and assign some attributes.
 * @param input The associated text-input to create the button.
 * @param useId Specify if you want to use the Id of input control to obtain the format
 * @return true is the control has been created, otherwise false
 */
ComboBox.createButton = function(input, useId)
{
	var newid = this.buttonIdPrefix + input.id;
	if (document.getElementById(newid)) return false; // if exists previously....
	// set the date format
	
	var ddButton = document.createElement("div");
	ddButton.id = newid;
	ddButton.setAttribute("editid", input.id);

	// Add the event listeners:
	if(ddButton.addEventListener){ 
		ddButton.addEventListener("click", CB_onButtonClick, false); 
	}
	else if (ddButton.attachEvent){ 
		ddButton.attachEvent("onclick", CB_onButtonClick); 
	}

	// add first to have access to the size properties
	// if is possible, add to the input's parent node
	// just in case we need to hide the button automatically
	if (input.parentNode){ 	input.parentNode.appendChild(ddButton);	}
	else{ document.body.appendChild(ddButton); }
	// Set the style and position:
	var nTop               = getObject.getSize("offsetTop", input);
	var nLeft              = getObject.getSize("offsetLeft", input);
	ddButton.className     = "comboboxbutton";
	ddButton.style.zIndex  = 10000;
	ddButton.style.cursor  = "pointer";
	ddButton.style.top     = (nTop + Math.floor((input.offsetHeight-ddButton.offsetHeight)/2) + this.buttonOffsetY) + "px";
	var btnOffX            = Math.floor((input.offsetHeight - ddButton.offsetHeight) / 2);
	ddButton.style.left = (nLeft + input.offsetWidth - ddButton.offsetWidth - btnOffX + this.buttonOffsetX) + "px";
	return true;
}

function CB_onButtonShow(event) {
	alert('show 1');
	if (event == null) event = window.event;
	var ddButton = (event.srcElement) ? event.srcElement : event.originalTarget;
	// gets the associated input:
	var input = document.getElementById(ddButton.getAttribute("editid"));

	var nTop               = getObject.getSize("offsetTop", input);
	var nLeft              = getObject.getSize("offsetLeft", input);
	ddButton.style.top    = (nTop + Math.floor((input.offsetHeight-ddButton.offsetHeight)/2) + this.buttonOffsetY) + "px";
	var btnOffX            = Math.floor((input.offsetHeight - ddButton.offsetHeight) / 2);
	ddButton.style.left = (nLeft + input.offsetWidth - ddButton.offsetWidth - btnOffX + this.buttonOffsetX) + "px";
}

ComboBox.seek = function() {
	var input = this.inputControl;
	var v = input.getAttribute('vcid')==null?input.value:document.getElementById(input.getAttribute("vcid")).value;
	if (v!=null) {
		var inputControls = document.getElementsByTagName("div");
		var inputsLength  = inputControls.length;
		for (i=0; i<inputsLength; i++){
			if (inputControls[i].getAttribute('value') == v) {
				inputControls[i].scrollIntoView(false);	
				inputControls[i].className = "sel";
				break;
			}
		}
	}
}

var req;

function callCombo(url, pageElement) {
	var doc = document.getElementById(pageElement);
	doc.innerHTML = '<img src=/im/wait.gif border=0>';
	if (!(req = getXMLHttpRequest())) {
		doc.innerHTML = 'Ошибка соединения';
		return;
	}
	req.onreadystatechange = responseCombo;
	req.open("GET", url, true);
	req.send(null);    
}

function responseCombo() {
	var output = '';
	if(req.readyState == 4) {
		if(req.status == 200) {
			output = req.responseText;
			document.getElementById(ComboBox.listContainer.id).innerHTML = output;
			ComboBox.seek();
		} else {
			document.getElementById(ComboBox.listContainer.id).innerHTML = output;
		}
	}
}
//-----------------------------------------------------------------------------
/**
 * Show the calendar
 */
ComboBox.show = function()
{
	if (!this.displayed){
		var input = this.inputControl;
		if (input == null) return;
		if (input.disabled) return; // just in case ;)
		var top  = getObject.getSize("offsetTop", input);
		var left = getObject.getSize("offsetLeft", input);

		this.listContainer.style.top        = top + input.offsetHeight + this.offsetY + "px";
		this.listContainer.style.left       = left + this.offsetX + "px";
		this.listContainer.style.width 		= input.offsetWidth + 'px';
		this.listContainer.style.display    = "none";
		this.listContainer.style.visibility = "visible";
		this.listContainer.style.display    = "block";
		var url = '/dropdown.php?listname='+input.getAttribute("name").substr(6);
		var v = input.getAttribute('vcid')==null?input.value:document.getElementById(input.getAttribute("vcid")).value;
		if (v!=null) {url = url + '&value='+v;}
		if (input.getAttribute('master')!=null) { 
			var masterinput = document.getElementById(input.getAttribute("master"));
			v = masterinput.getAttribute('vcid')==null?masterinput.value:document.getElementById(masterinput.getAttribute("vcid")).value;
			if (v!=null) {url = url + '&master='+v;}
		}
		callCombo(url, this.listContainer.id);
		this.displayed = true;
		input.focus();
	}
}

//-----------------------------------------------------------------------------
/**
 * Hide the calendar
 */
ComboBox.hide = function()
{
	if (this.displayed){
		this.listContainer.style.visibility = "hidden";
		this.listContainer.style.left = '-1000px'; // some problems with overlaped controls
		this.listContainer.style.top = '-1000px';
		this.displayed = false;
	}
}

//-----------------------------------------------------------------------------
/**
 * Show the calendar for an edit control
 */
ComboBox.showForEdit = function(edit)
{
	if (this.displayed) return;
	if (edit == null) return;
	if (edit.disabled) return;
	this.originalValue = edit.value;
	this.inputControl  = edit;
	this.firstFocused = true;
	this.inputControl.focus();	
	this.show();
}

function CB_onClick(event) { ComboBox.click(event) }

ComboBox.click = function(event) {
	if (event == null) event = window.event;
	var item = (event.srcElement) ? event.srcElement : event.originalTarget;
	var v = item.getAttribute('value')==null?item.innerHTML:item.getAttribute('value');
	var input = this.inputControl;
	if (input.getAttribute('vcid')==null) {
	    input.value = v;
	} else {
		input.value = item.innerHTML;
	    document.getElementById(input.getAttribute('vcid')).value = v;
	}
	if (this.hideTimeout){
		clearTimeout(this.hideTimeout);
		this.hideTimeout = null;
	}
	this.hide();
	this.inputControl.focus();
	return false;
}


//-----------------------------------------------------------------------------
// Click event for dropdown button
function CB_onButtonClick(event){ ComboBox.onButtonClick(event); }

ComboBox.onButtonClick = function(event)
{
	if (!this.displayed){
		// get the button
		if (event == null) event = window.event;
		var button = (event.srcElement) ? event.srcElement : event.originalTarget;
		// gets the associated input:
		var input = document.getElementById(button.getAttribute("editid"));
		this.showForEdit(input);
	}
	else{
		this.hide();
	}
}

//-----------------------------------------------------------------------------
/**
 * Key-up event for edit controls as date-pickers
 */
function CB_onEditControlKeyUp(event){ComboBox.onEditControlKeyUp(event);}
ComboBox.onEditControlKeyUp = function(event)
{
	if (event == null) event = window.event;
	var edit = event.srcElement ? event.srcElement : event.originalTarget;
	var kc   = event.charCode ? event.charCode : event.which ? event.which : event.keyCode;
	return;
	switch (kc){
		case 37: // left arrow key
			this.selectPrevDay(1);
			break;

		case 38: // up arrow key
			this.selectPrevDay(7);
			break;

		case 39: // right arrow key
			this.selectNextDay(1);
			break;

		case 40: // down arrow key
			if (!this.displayed){
				this.showForEdit(edit);
			}
			else{
				this.selectNextDay(7);
				break;
			}
			break;

		case 27: // escape key
			this.hide();
			break;

		case 33: // repag key
			if ((event.modifiers & Event.SHIFT_MASK) || (event.shiftKey)){
				this.build(this.month, parseInt(this.year)-1);
			}
			else{
				this.buildPrev();
			}
			break;

		case 34: // avpag key
			if ((event.modifiers & Event.SHIFT_MASK) || (event.shiftKey)){
				this.build(this.month, parseInt(this.year)+1);
			}
			else{
				this.buildNext();
			}
			break;

		case 13: // enter-key (forms without submit buttons)
			if (this.displayed && this.currentDay > 0 && this.submitByKey){
				this.writeDate(this.currentDay);
			}
			break;
		//default: return true;
	}
	return false;
}


function CB_onEditControlKeyDown(event){ComboBox.onEditControlKeyDown(event);}
ComboBox.onEditControlKeyDown = function(event)
{
	if (event == null) event = window.event;
	var edit = event.srcElement ? event.srcElement : event.originalTarget;
	var kc   = event.charCode ? event.charCode : event.which ? event.which : event.keyCode;
	return;
	//alert(event.keyCode);
	if ( kc >= 65 && kc <= 90 ){ // letters
	/*
		if (event.stopPropagation) event.stopPropagation();
		if (event.preventDefault)  event.preventDefault();
		event.returnValue  = false;
		event.cancelBubble = true;
		return false;
		*/
	}	
	switch (kc){
		case 13: // enter key
			this.submitByKey = true;
			break;
		case 9:  // tab key
		case 32: // space-bar key
			if (this.displayed && this.currentDay > 0){
				this.writeDate(this.currentDay);
			}
			break;
	}
}

//-----------------------------------------------------------------------------
/**
 * Key-press event for edit controls as date-pickers
 */
function CB_onEditControlKeyPress(event){ComboBox.onEditControlKeyPress(event);}
ComboBox.onEditControlKeyPress = function(event)
{
	if (event == null) event = window.event;
	var edit = event.srcElement ? event.srcElement : event.originalTarget;
	var kc   = event.charCode ? event.charCode : event.which ? event.which : event.keyCode;
	if (!((kc < 32) || (kc > 44	 && kc < 58))){
		/*
		if (event.stopPropagation) event.stopPropagation();
		if (event.preventDefault)  event.preventDefault();
		event.returnValue  = false;
		event.cancelBubble = true;
		return false;
		*/
	}	
}


//-----------------------------------------------------------------------------
/**
 * Blur event for edit controls as date-pickers
 */
function CB_onEditControlBlur(event){ComboBox.onEditControlBlur(event);}
ComboBox.onEditControlBlur = function(event)
{
	//alert('Out');
	if (event == null) event = window.event;
	if (!this.hideTimeout){
		this.hideTimeout = setTimeout("ComboBox.hide()", this.HIDE_TIMEOUT);
	}
	this.firstFocused  = false;
	this.hideCauseBlur = true;
}


//-----------------------------------------------------------------------------
/**
 * Change event for edit controls as date-pickers
 */
function CB_onEditControlChange(event){ComboBox.onEditControlChange(event);}
ComboBox.onEditControlChange = function(event)
{
	if (event == null) event = window.event;
	var edit = (event.srcElement) ? event.srcElement : event.originalTarget;
	//alert('Cha');
	if (edit.value == "") return;
	var format = edit.getAttribute("datepicker_format");
	if (!this.validate(edit.value, format)){
		setTimeout("e = document.getElementById('"+edit.id+"'); e.value=''; e.focus()", 10);
	}
}


//-----------------------------------------------------------------------------
/**
 * Focus event for edit controls as date-pickers
 */
function CB_onEditControlFocus(event){ComboBox.onEditControlFocus(event);}
ComboBox.onEditControlFocus = function(event)
{
	if (event == null) event = window.event;
	var edit = (event.srcElement) ? event.srcElement : event.originalTarget;
	//alert('In');
	// get the date range
	var format = edit.getAttribute("datepicker_format");
	var min = edit.getAttribute("datepicker_min");
	this.minDate = min ? this.getDateFromString(min, format) : null;
	var max = edit.getAttribute("datepicker_max");
	this.maxDate = max ? this.getDateFromString(max, format) : null;
	if (this.maxDate && this.minDate){
		if (this.maxDate.getTime() < this.minDate.getTime()){
			var tmp = this.maxDate;
			this.maxDate = this.minDate;
			this.minDate = tmp;
		}
	}
	
	if ((!this.displayed || this.hideCauseBlur) && this.autoShow && !this.firstFocused){
		clearTimeout(this.hideTimeout);
		this.hideTimeout   = null;
		this.firstFocused  = true;
		if (this.hideCauseBlur){
			this.hideCauseBlur = false;
			this.hide();
		}
		this.showForEdit(edit);
	}
	else if (this.inputControl && this.inputControl.id != edit.id){
		this.hide();
	}
	else if (this.hideTimeout){
		clearTimeout(this.hideTimeout);
		this.hideTimeout = null;
	}
}

//-----------------------------------------------------------------------------
/**
 * Window resize event.
 */
function CB_onWindowResize(event){ ComboBox.onWindowResize(event); }
ComboBox.onWindowResize = function(event)
{
	this.relocate();
	this.relocateButtons();
}


//-----------------------------------------------------------------------------
/**
 * Relocate buttons
 */
ComboBox.relocateButtons = function()
{
	var divElements = document.getElementsByTagName("div");
	for (key in divElements){
		if (divElements[key].id && divElements[key].id.indexOf(this.buttonIdPrefix) == 0){
			var ddButton = divElements[key];
			if (ddButton.style.display == 'none') continue;
			var input = document.getElementById(ddButton.getAttribute("editid"));
			if (input.style.display == 'none') continue;
			var nTop = getObject.getSize("offsetTop", input);
			var nLeft = getObject.getSize("offsetLeft", input);
			ddButton.style.top = (nTop + Math.floor((input.offsetHeight-ddButton.offsetHeight)/2) + this.buttonOffsetY) + "px";
			var btnOffX         = Math.floor((input.offsetHeight - ddButton.offsetHeight) / 2);
			ddButton.style.left = (nLeft + input.offsetWidth - ddButton.offsetWidth - btnOffX + this.buttonOffsetX) + "px";
		}
	}
}


//-----------------------------------------------------------------------------
/**
 * Relocate the calendar's frame
 */
ComboBox.relocate = function()
{
	if (this.displayed){
		var input = this.inputControl;
		if (input == null) return;
		var top  = getObject.getSize("offsetTop", input);
		var left = getObject.getSize("offsetLeft", input);
		this.listContainer.style.top  = top + input.offsetHeight + this.offsetY + "px";
		this.listContainer.style.left = left + this.offsetX + "px";
	}
}

//-----------------------------------------------------------------------------
// Following 2 functions by: Mircho Mirev

function getObject(sId)
{
	if (bw.dom){
		this.hElement = document.getElementById(sId);
		this.hStyle = this.hElement.style;
	}
	else if (bw.ns4){
		this.hElement = document.layers[sId];
		this.hStyle = this.hElement;
	}
	else if (bw.ie){
		this.hElement = document.all[sId];
		this.hStyle = this.hElement.style;
	}
}

getObject.getSize = function(sParam, hLayer)
{
	nPos = 0;
	while (hLayer && (hLayer.tagName) && !( /(body|html)/i.test(hLayer.tagName))){
		nPos += eval('hLayer.' + sParam);
		if (sParam == 'offsetTop'){
			if (hLayer.clientTop){
				nPos += hLayer.clientTop;
			}
		}
		if (sParam == 'offsetLeft'){
			if (hLayer.clientLeft){
				nPos += hLayer.clientLeft;
			}
		}
		hLayer = hLayer.offsetParent;
	}
	return nPos;
}


//-----------------------------------------------------------------------------
/**
 * Based on code by: Peter Todorov
 */
function writeLayer(ID, parentID, sText)
{
	if (document.layers){
		var oLayer;
		if(parentID){
			oLayer = eval('document.' + parentID + '.document.' + ID + '.document');
		}
		else{
			oLayer = document.layers[ID].document;
		}
		oLayer.open();
		oLayer.write(sText);
		oLayer.close();
	}
	else if(document.all){
		document.all[ID].innerHTML = sText;
	}
	else{
		document.getElementById(ID).innerHTML = sText;
	}
}

//
// Compartir es la ъnica manera de perdurar
// EOF

