var baseUrl;
var $formClass;

function HtmlDecode(str){
	if (!str)
		return "";

	return str.replace(/&(\w+);/g,function($0,$1){
		var $char = BB.htmlEntities[$1];
		return $char ? $char : $0;
	});
}

function HtmlEncode(str){
	if (!str)
		return "";
	return str.replace(/&/g,"&amp;")
		.replace(/>/g,"&gt;").replace(/</g,"&lt;")
		.replace(/"/g,"&quot;");
}

var BB = {
	allowed : {
			'b' : true,'i' : true,'u' : true, a:  true,
			'ul' : true,'ol': true, 'p' : true,'li' : true,
			'br' : true

		},
	htmlEntities : {
		"amp" : "&", "lt" : "<", "gt" : ">","quot" : '"', "apos": "'"
	}
}

function BBEncode(str){
	if (!str)
		return "";
	return str.replace(/<(\/?)(\w+)([^>]*)>/g,function($0,$1,$2,$3){
		return BB.allowed[$2.toLowerCase()] ? "[" + $1 + $2 + $3 + "]" : $0;
	})
}

function BBDecode(str){
	if (!str)
		return "";
	return str.replace(/\[(\/?)(\w+)([^\]]*)\]/g,function($0,$1,$2,$3){
		return BB.allowed[$2.toLowerCase()] ? "<" + $1 + $2 + $3 + ">" : $0;
	})
}

function countCheckedRecords($formid,$chkname){
	$chkname = $chkname || "id";
	$cnt = 0;
	$selector =
		"form#" + $formid +
		" :checkbox[name='" + $chkname + "\\[\\]']";
	 $($selector).each(
        function(){if (this.checked) $cnt++;}
    )
	return $cnt;
}

function handleAjaxError(req, textStatus, errorThrown){
	$("#debug").html(
		(textStatus || errorThrown) + "<hr>" + req.responseText
	);
}

function getYiiNameFromField(elt,formClass){
	formClass = formClass || $formClass;
	return elt.id.substr(formClass.length + 1);
}

function getYiiFieldName(propName,formClass){
	formClass = formClass || $formClass;
	return [formClass,"[",propName,"]"].join("");
}
function getYiiFieldId(propName,formClass){
	formClass = formClass || $formClass;
	return formClass + "_" + propName;
}

function setYiiFieldValue(propName,val,formClass){
	formClass = formClass || $formClass;
	selector = "#" + getYiiFieldId(propName,formClass);
	//alert("set:"+selector + ":" + val)
	$(selector).val(val);
}

function getYiiFieldValue(propName,formClass){
	formClass = formClass || $formClass;
	var selector = "#" + getYiiFieldId(propName,formClass);
	var val = $(selector).val();
	//alert("get:"+selector + ":" + val)
	return val;
}
function intval ($num){
    return Number($num) || 0;
}
var RU = {
	quickBrownFox : function (){
		return "Южно-эфиопский грач увёл мышь за хобот на съезд ящериц";
	},
    subscriberSuffix : function($snum){
        $t = intval($snum) %10;
        $h = intval($snum) %100;
        if ($t > 4 || $t == 0)
            return "ов";
        if ($h > 10 && $h < 15)
            return "ов";
        if ($t == 1)
            return "";
        if ($t >= 2 && $t <= 4)
            return "а";
        return "";
    },
	groupSuffix : function ($snum){
		$t = intval($snum) %10;
		$h = intval($snum) %100;
		if ($t > 4 || $t == 0)
			return "";
		if ($h > 10 && $h < 15)
			return "";
		if ($t == 1)
			return "а";
		if ($t >= 2 && $t <= 4)
			return "ы";
		return "";
	},
    listSuffix : function ($snum){
        $t = intval($snum) %10;
        $h = intval($snum) %100;
        if ($t > 4 || $t == 0)
            return "ок";
        if ($h > 10 && $h < 15)
            return "ок";
        if ($t == 1)
            return "ка";
        if ($t >= 2 && $t <= 4)
            return "ки";
        return "";
    },
    appealSuffix : function ($snum){
        $t = intval($snum) %10;
        $h = intval($snum) %100;
        if ($t > 4 || $t == 0)
            return "й";
        if ($h > 10 && $h < 15)
            return "й";
        if ($t == 1)
            return "е";
        if ($t >= 2 && $t <= 4)
            return "я";
        return "";
    },
	fieldSuffix : function ($fnum){
		$t = intval($fnum) %10;
		$h = intval($fnum) %100;
		if ($t > 4 || $t == 0)
			return "ей";
		if ($h > 10 && $h < 15)
			return "ей";
		if ($t == 1)
			return "е";
		if ($t >= 2 && $t <= 4)
			return "я";
		return "ей";
	}
}

function noclick(evt){
	if (evt.stopPropagation){
		evt.stopPropagation();
	} else if (document.all){
		evt.cancelBubble=true;
	}
	if (evt.preventDefault)
	{
		evt.preventDefault();
	} else if (document.all){
		evt.returnValue = false;
	}
	return false;
}
function getAncestorByTagName(elt,tagName,level)
{
	level = level || 1;
	var i = 0;
	while(elt && i< level)
	{
		elt = elt.parentNode;
		if (elt && elt.nodeName == tagName)
		{
			i++;
		}
	}
	return elt;
}
//-----------------------------------------------------------------------------
function getAncestorByAttribute(elt,attName,attValue,level)
{
	level = level || 1;
	var i = 0;
	while(elt && i< level)
	{
		elt = elt.parentNode;
		if (!elt) break;
		attV = elt.getAttribute(attName)
		if (attV == attValue || attValue == null  && attV)
			i++;
	}
	return elt;
}
function rand($min,$max){
	$max = $max || $min;
	$min = $max ? $min : 0;
	return Math.round(Math.random()*$max) + $min;
}
function getRandomString($len,$chars){
   $chars = $chars || "abcdefghijklmnopqrstuvwxyz0123456789_-."
   $res = [];
   for(var $i = 0; $i < $len; $i++){
   		$id = rand(0,$chars.length - 1);
		$res[$res.length] = $chars.substr($id,1);
   }
   return $res.join("");
}

//-----------------------------------------------------------------------------
function GetX(input) {
  var img=input;
  var X=0;
  do {X+=img.offsetLeft;}
  while ((img=img.offsetParent));
  return X;
}
function GetY(input) {
  var img=input;
  var Y=0;
  do {Y+=img.offsetTop} while ((img=img.offsetParent)!=null);
  return(Y);
}

//--------------------------------------------------------------------------------
function getBaseUrl(){
    $rx = new RegExp("http://[^/]+/");
  var url = location.href.replace($rx,"").split('/');
  if (url[0] == "admin"){
	nurl = [];
	nurl[0] = "admin/" + url[1];
	for(var i = 1; i < url.length - 1 ; i++){
		nurl[i] = url[i + 1]
	}
	url = nurl;
  }
  if (url.length >= 2){
    url = [url[0],url[1]];
  } else{
    url = [url[0],"index"];
  }

  return url.join("/");
}
//-------------------------------------------------------------------
function setPageSize (elt){
  baseUrl = baseUrl || getBaseUrl();
  $.cookie(baseUrl + "/page/size", elt.value,{path: '/',expires: 180});
  var url = window.location.href;
  window.location.href= url.replace(/page\/\d+\/?/,"");
//  window.location.reload();
}
//--------------------------------------------------------------------------------
function setOrder(order){
  baseUrl = baseUrl || getBaseUrl();
  $.cookie(baseUrl +"/sort", order,{path: '/',expires: 180});
  var url = window.location.href;
  window.location.href= url.replace(/page\/\d+\/?/,"");
  return false;
}
//--------------------------------------------------------------------------------
function toggle(){
	var x;
	for (var i = 0; i < arguments.length; i++){
		elt = document.getElementById(arguments[i]);
		x = elt.oldDisplay;
		elt.oldDisplay = elt.style.display;
		if (x){
			elt.style.display = x;
		} else {
			elt.style.display = elt.style.display == "none" ? "block" : "none";
		}
	}
	return false;
}
function hasNonemptyValues(divid,ignore){
	ignore = ignore || {};
	div = document.getElementById(divid);
	elts = div.getElementsByTagName('input');
	for(var i = 0 ; i < elts.length ; i++){
		var e = elts[i];
		if (ignore[e.name])
			continue;
		switch(e.type){
		case "hidden" :
		case "text" :
			if (e.value)
				return true;
		case "checkbox":
		case "radio":
			if (e.checked && elt.value)
				return true;
		}
	}
	elts = div.getElementsByTagName('select');
	for(var i = 0 ; i < elts.length ; i++){
		var e = elts[i];
		if (ignore[e.name])
			continue;
		if (e.value) return true;
	}
	elts = div.getElementsByTagName('textarea');
	for(var i = 0 ; i < elts.length ; i++){
		var e = elts[i];
		if (ignore[e.name])
			continue;
		if (e.value) return true;
	}
}
function delThings(elt,msg){
	if (!confirm(msg))
		return false;
	elt.form.action +="/delete";
	elt.form.submit();
}
//----------------------------------------------------------------------
// This code is in the public domain. Feel free to link back to http://jan.moesen.nu/
function sprintf()
{
	if (!arguments || arguments.length < 1 || !RegExp)
	{
		return;
	}
	var str = arguments[0];
	var re = /([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X)(.*)/;
	var a = b = [], numSubstitutions = 0, numMatches = 0;
	while ((a = re.exec(str)))
	{
		var leftpart = a[1], pPad = a[2], pJustify = a[3], pMinLength = a[4];
		var pPrecision = a[5], pType = a[6], rightPart = a[7];

		//alert(a + '\n' + [a[0], leftpart, pPad, pJustify, pMinLength, pPrecision);

		numMatches++;
		if (pType == '%')
		{
			subst = '%';
		}
		else
		{
			numSubstitutions++;
			if (numSubstitutions >= arguments.length)
			{
				alert('Error! Not enough function arguments (' + (arguments.length - 1) + ', excluding the string)\nfor the number of substitution parameters in string (' + numSubstitutions + ' so far).');
			}
			var param = arguments[numSubstitutions];
			var pad = '';
			       if (pPad && pPad.substr(0,1) == "'") pad = leftpart.substr(1,1);
			  else if (pPad) pad = pPad;
			var justifyRight = true;
			       if (pJustify && pJustify === "-") justifyRight = false;
			var minLength = -1;
			       if (pMinLength) minLength = parseInt(pMinLength);
			var precision = -1;
			       if (pPrecision && pType == 'f') precision = parseInt(pPrecision.substring(1));
			var subst = param;
			       if (pType == 'b') subst = parseInt(param).toString(2);
			  else if (pType == 'c') subst = String.fromCharCode(parseInt(param));
			  else if (pType == 'd') subst = parseInt(param) ? parseInt(param) : 0;
			  else if (pType == 'u') subst = Math.abs(param);
			  else if (pType == 'f') subst = (precision > -1) ? Math.round(parseFloat(param) * Math.pow(10, precision)) / Math.pow(10, precision): parseFloat(param);
			  else if (pType == 'o') subst = parseInt(param).toString(8);
			  else if (pType == 's') subst = param;
			  else if (pType == 'x') subst = ('' + parseInt(param).toString(16)).toLowerCase();
			  else if (pType == 'X') subst = ('' + parseInt(param).toString(16)).toUpperCase();
		}
		str = leftpart + subst + rightPart;
	}
	return str;
}

function get_selection_html(instance_name) {

    var oFCKeditor = FCKeditorAPI.GetInstance(instance_name);
    var selection = (oFCKeditor.EditorWindow.getSelection
					? oFCKeditor.EditorWindow.getSelection()
					: oFCKeditor.EditorDocument.selection);

    if(selection.createRange) {
        var range = selection.createRange();
        var html = range.htmlText;
    }
    else {
        var range = selection.getRangeAt(selection.rangeCount - 1).cloneRange();
        var clonedSelection = range.cloneContents();
        var div = document.createElement('div');
        div.appendChild(clonedSelection);
        var html = div.innerHTML;
    }

    return html;

}

//myField accepts an object reference, myValue accepts the text strint to add
function insertAtCursor(myField, myValue) {
	//IE support
	if (document.selection) {
		myField.focus();

		//in effect we are creating a text range with zero
		//length at the cursor location and replacing it
		//with myValue
		sel = document.selection.createRange();
		sel.text = myValue;
	}
	//Mozilla/Firefox/Netscape 7+ support
	else if (myField.selectionStart || myField.selectionStart == '0') {

		//Here we get the start and end points of the
		//selection. Then we create substrings up to the
		//start of the selection and from the end point
		//of the selection to the end of the field value.
		//Then we concatenate the first substring, myValue,
		//and the second substring to get the new value.
		var startPos = myField.selectionStart;
		var endPos = myField.selectionEnd;
		myField.value = myField.value.substring(0, startPos)+
				myValue+ myField.value.substring(endPos, myField.value.length);
	} else {
		myField.value += myValue;
	}
}

function closeMessage(elt){
	$(elt).parents("div[class^=msg]").eq(0).slideUp();
}

function closeMessages(elt){
	$("div[class^=msg]").slideUp();
}

function confirmDel(id,noDataText,$msg){
	var checks =  "#" + id + "s  :checked[name^=id]";
	if (!$(checks).length){
		alert(noDataText)
		return false;
	}
	return confirm($msg);
}
