var chistory	= new Array();
var historypos	= false;
var querymode	= false;
var needParams	= new Number();

function init() {
    gbid('command').focus();
    
    document.onclick = function(){
    	gbid('command').focus();
    }
    
    document.onmouseup = function(e) {
    	if (getSel().toString().length > 0)
    		showdblclick(e);
    }
    
    setCommandWidth();
    
    showLikeButton();
}

/**
 * показываем тултип насчет копирования в буфер
 */
function showdblclick(e) {
	if (!e) e = window.event;
	gbid('dblclick').style.top = MouseCoords.getY(e) + 10 + 'px';
	gbid('dblclick').style.left = MouseCoords.getX(e) + 10 + 'px';
	gbid('dblclick').style.display = 'block';
	
	setTimeout('hidedblclick();', 1500);	
}

function hidedblclick() {
	gbid('dblclick').style.display = 'none';
}

/**
 * устанавливаем ширину поля для ввода команд
 */
function setCommandWidth() {
	gbid('command').style.width = document.body.offsetWidth - gbid('user_s').offsetWidth - 20 + 'px';
}
/**
 * обработчик нажатий клавиш в окне ввода команд
 */
function listencommand(e) {
	e = e || window.event;
	var code = e.which || e.keyCode;
	
	switch (code) {
		//Enter обрабатываем только если в саджесте ничего не выделено
		case 13:
			if (suggest.iHigh == 'undefined' || suggest.iHigh == 0 || suggest.aSug.length == 0) {
				if (gbid('command').value == '') return false;
				
				if (!querymode) {
					go(gbid('command').value);
				} else {
					//выполняем последнюю команду
					go(chistory[chistory.length-1]);
				}
				
				gbid('command').value = '';
			}
		break;
		case 38:
			viewHistory('prev');
		break;
		case 19:
		case 27:
			disQueryMode();
			echo('<span>Cancelled by user</span>');
		break;
		case 40:
			viewHistory('last');
		break;
	}

	if (e.ctrlKey && code == 67) {
		//в режиме ввода параметров cntrl+c - выход из этого режима
		if (querymode) {
			disQueryMode();
			echo('<span>Cancelled by user</span>');
		} else {
			if (gbid('buffer').value != 'false' && gbid('buffer').value != 'null')
			gbid('buffer').select();
		}
	}
	return true;
}

function gbid(id) {
	return document.getElementById(id);
}

/**
 * выполняем введенную команду
 */
function go(com_value) {
	if (querymode) {
		//запоминаем значение последнего введенного параметра 
		needParams[gbid('command').getAttribute('name')] = gbid('command').value;
	} else {
	    add2history(com_value);
	    historypos = false;
	}
    
    execute(com_value);
}

function execute(c) {
	var params = 'command=' + encodeURIComponent(c) + '&params=' + encodeURIComponent(params2JSON());
	data = getData(params);
	parseData(data);
	
	//проскролим страницу до низу чтобы командная строка не была слишком низко
	window.scrollTo(0,10000);
}

/**
 * получаем JSON строку введенных юзером параметров
 */
function params2JSON() {
	var params = new Array();
	for(var p in needParams) {
		params.push('"'+p.split('"').join('\\"')+'":"'+needParams[p].split('"').join('\\"')+'"');
	}
	
	return "{" + params.join(',') + "}";
}

/**
 * парсим ответ сервера, смотрим что делать
 */
function parseData(data) {
	out(data);

	if (data['completeJS'] !== false) {
		try {
			eval(data['completeJS']);
		}
		catch (e) {
		}
	}
	
	if (data['needParam'] !== false) {
		queryParam(data['needParam']);
		return true;
	} else {
		if (querymode)
			disQueryMode();
	}
}

/**
 * запрашиваем с пользователя дополнительные параметры, которые требует функция
 */
function queryParam(params) {
	querymode = true;
	suggestenabled = false;
	
	gbid('user_s').innerHTML = params.query + ':&nbsp;';
	gbid('command').setAttribute('type', params.type);
	gbid('command').setAttribute('name', params.name);
	
	setCommandWidth();
}

/**
 * выходим из режима ввода параметров
 */
function disQueryMode() {
	querymode = false;
	suggestenabled = true;
	
	gbid('user_s').innerHTML = user + '&nbsp;';
	gbid('command').setAttribute('type', 'text');
	gbid('command').value = '';
	
	setCommandWidth();
	
	needParams	= new Number();
}

/**
 * добавляем команду в историю комманд
 */
function add2history(command) {
    chistory.push(command);
}

/**
 * просмотр предыдущей/следующей команды из истории если в окне саджеста ничего нет
 */
function viewHistory(n) {
	if (suggest.aSug == 'undefined' || suggest.aSug.length == 0) {
	    if (historypos === false)
	    	historypos = chistory.length;
		
	    if (n == 'prev') {
			if (historypos>0)
			    historypos--;
	    } else {
			if (historypos<chistory.length)
			    historypos++;
	    }
	    
	    if (chistory[historypos]) {
	    	gbid('command').value = chistory[historypos];
	    }
	} else
		return false;
}

/**
 * вывод результата
 */
function out(data) {
	gbid('buffer').value = data['result'];
	
	var value = gbid('command').value;
	if (gbid('command').getAttribute('type') == 'password') {
		value = '';
		for (i = 0; i<gbid('command').value.length; i++)
			value = value + '*';
	}
	
	var result = "<span class='" + gbid('user_s').className + "'>" + gbid('user_s').innerHTML + "</span>" + htmlSpecialChars(value) + "\r\n";
	result = result + "<div class='clear'></div>";
	
	if (data['error']) {
		result = result + "<span class='error'>Error: " + data['error'] + "</span>\r\n";
	} else {
		if (data['warnings'].length > 0) {
			for (var i = 0; i < data['warnings'].length; i++) {
				result = result + "<span class='warning'>Warning: " + data['warnings'][i] + "</span>\r\n";
			}
		}
		
		if (data['result'] !== false && data['result'] !== true)
		result = result + "<span class='result'>Result: " + htmlSpecialChars(data['result']) + "</span>\r\n";
		
		if (data['message'] !== false)
		result = result + "<span class='message'>" + data['message'] + "</span>\r\n";
	}
	
	echo(result);
}

function echo(result) {
	gbid('output').innerHTML = gbid('output').innerHTML + '<pre>' + result + '</pre>';
}

/**
 * вставляем кнопку Like by FB на страницу
 */
function showLikeButton() {
	//IE7 или ниже
	if (document.all && !document.querySelector)
		return ;
	
	var fbframe = document.createElement('iframe');
	fbframe.setAttribute("allowTransparency", "true");
	fbframe.setAttribute("frameborder", "0");
	fbframe.setAttribute("scrolling", "no");
	fbframe.setAttribute("id", "fblike");
	fbframe.setAttribute("src", "http://www.facebook.com/plugins/like.php?href=" + encodeURIComponent(domain)+"&amp;layot=button_count&amp;layout=standard&amp;show_faces=true&amp;action=like");
	document.body.appendChild(fbframe);
}

function createRequest() {
	if (window.XMLHttpRequest) req = new XMLHttpRequest();
	else if (window.ActiveXObject) {
		try {
			req = new ActiveXObject('Msxml2.XMLHTTP');
		} catch (e){}
		try {
			req = new ActiveXObject('Microsoft.XMLHTTP');
		} catch (e){}
	}
	return req;
}

function getData(parameters) {
	req = createRequest();
	if (req) {
		req.open("POST", listener, false);
		req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		req.send(parameters);

		if (req.status == 200) {
			return eval('(' + req.responseText + ')');
		} else {
			return false;
		}
	} else {
		return false;
	}
	return false;
}

var MouseCoords = {
	getX: function(e) {	
		if (e.pageX) {
			return e.pageX;
		} else if (e.clientX) {
			return e.clientX+(document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
		}
		return 0;
	},
	getY: function(e) {
		if (e.pageY) {
			return e.pageY;
		} else if (e.clientY) {
			return e.clientY+(document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
		}
		return 0;
	}
}

function getSel() {
	var d=document,w=window,b;
	if (w.getSelection) {
		b = w.getSelection();
	} else if (d.getSelection) {
		b = d.getSelection();
	} else if (d.selection) {
		b = d.selection.createRange().text;
	} else {
		b = null;
	}
	return b;
}

function htmlSpecialChars(str) {
	var d = document.createElement("DIV");
    d.appendChild(document.createTextNode(str));
    return d.innerHTML;
}
