var isDOM=document.getElementById;
var isIE=document.all && document.all.item;
var isMZ=isDOM && (navigator.appName=="Netscape");
var isO=window.opera && isDOM;

function undef(param) { return param; }

// плавная моталка по странице. Это супер-фича.
function travelA( Aname, quick, noplus )
{
  if (isMZ && navigator.userAgent.substr(navigator.userAgent.indexOf("Gecko/")+6,4)=="2003" ) isMZ=false;
  if (isMZ && navigator.userAgent.substr(navigator.userAgent.indexOf("Gecko/")+6,4)=="2002" ) isMZ=false;
  if (!isIE && !isMZ) return true;
  var value=10;
  if (noplus) value=0;
  if (document.all)
   z = document.all[Aname];
  else
  {
   a = document.getElementsByTagName("A");
   aLength = a.length;
   for (var i = 0; i < aLength; i++)
   {
    an = a[i].getAttribute("name");  
    if (an!=null && an==Aname)
     break;
   }
   z = a[i];
  }
//  z = document.all ? document.all[Aname] : document.getElementById(Aname);
  if (z == undef()) return true;
  var x=0;
  var y=0;
  do {
    x += parseInt(isNaN(parseInt(z.offsetLeft))?0:z.offsetLeft);
    y += parseInt(isNaN(parseInt(z.offsetTop))?0:z.offsetTop);
  } while (z=z.offsetParent)
  travelto( x,  y-value, quick );
  return true;
}

// часть прикольной, завораживающей моталки
function travelto(x, y, quick )
{
  if (document.documentElement) var d = document.documentElement;
  else var d = document.body;
  if (quick)
  {
      ox = d.scrollLeft;
      oy = d.scrollTop;
      dx = (x - ox);
      dx = sign(dx) * Math.ceil(Math.abs(dx));
      dy = (y - oy);
      dy = sign(dy) * Math.ceil(Math.abs(dy));
      window.scrollBy(dx, dy);
    return;
  }
  do
    {
      ox = d.scrollLeft;
      oy = d.scrollTop;
      dx = (x - ox) / 10;
      dx = sign(dx) * Math.ceil(Math.abs(dx));
      dy = (y - oy) / 10;
      dy = sign(dy) * Math.ceil(Math.abs(dy));
      window.scrollBy(dx, dy);
      cx = d.scrollLeft;
      cy = d.scrollTop;
    }
  while (( (ox-cx) != 0 ) || ( (oy-cy) != 0 ));
}

var ok; 

function sign(x)
{
  if (x > 0) return 1;
  if (x < 0) return -1;
  return 0;
}


 var wikiedit;
 var dbclick;
 var edit;

 function all_init () //инициализация всяких штук, которые требуют инициализации
 {
  if (wikiedit) 
   we_init(wikiedit);
  if (dbclick) 
   dclick(dbclick);
  init_travel();
  crit_init();
//  try {
//  	Versions.run();
//  } catch(e) {};
  try {
  	Sections.init()();
  } catch(e) {};
 }

 function dclick(frame)
 {
  if (edit)
  if(isIE || isO){
    document.ondblclick=function(){
      op = event.srcElement;
      while (op!=null && op.className!=frame && op.tagName!="BODY")
        op=op.parentElement;
      if (op.className==frame) {
       document.location=edit;
      }
      return true;
    }
  }else if (isMZ) {
  document.addEventListener("dblclick", mouseClick, true);
  }

 }

 function mouseClick(event) 
 {
     op = event.target;
     while (op!=null && op.className!=dbclick && op.tagName!="BODY")
       op=op.parentNode;
     if (op!=null && op.className==dbclick) {
      document.location=edit;
     }
 }

 function init_travel() 
 {
  a = document.all ? document.all : document.getElementsByTagName("*");
  aLength = a.length;
  l = window.location.href;
  if (l.indexOf("#")!=-1) l = l.substr(0,l.indexOf("#"));
  for (var i = 0; i < aLength; i++)
  {
   if (a[i].tagName == "A" || a[i].tagName == "a")
   {
    ahref = a[i].getAttribute("href");
    
    if (ahref!=null && ((ahref.substr(0, l.length)==l && ahref.charAt(l.length)=="#") || ahref.charAt(0)=="#"))// && ahref.charAt(l.length+1)=="#") 
    {
      if (ahref.charAt(0)=="#") ah = ahref.substr(1, ahref.length-1);
      else ah = ahref.substr(l.length+1, ahref.length-l.length-1);
      a[i].setAttribute("travel", ah);
      a[i].onclick = function (e) { return travel(e); };
//      if (a[i].addEventListener) a[i].addEventListener("click", travel, false);
//      else if (a[i].attachEvent) a[i].attachEvent("onclick", travel);
    }
   }
  }
 }

 function travel(e)
 {
  d = window.event ? window.event.srcElement : e.currentTarget;
  if (!d.getAttribute("travel")) return;
  s = d.getAttribute("travel");
  return travelA(s);
 }

 function weSave()
 {
  if (confirm("Really save?"))
  {
   document.forms.edit[0].click();
  }
 }

var DOTS = "#define x_width 2\n#define x_height 1\nstatic char x_bits[]={0x01}";


// -----------------------------------------------------------------------------------------------
// ниже расположен код конфирмации изменений критичных полей. 
// Courtesy of http://htmlcoder.visions.ru/JavaScript/?26 
// slightly modified by Kuso Mendokusee
// slightly modified by Kukutz
var root = window.addEventListener || window.attachEvent ? window : document.addEventListener ? document : null;
var cf_modified = false;
var WIN_CLOSE_MSG = "\nВы не сохранили изменения. Действительно хотите уйти отсюда?\n";

function set_modified(e, strict_e){
  if (window.event && !strict_e)
   var el = window.event.srcElement;
  else if (e!=null)
   var el = e.currentTarget;
  if (el!=null)
  {
   el.style.borderColor = "#eecc99";
   //el.title = "(поле изменено, не забудьте сохранить изменения)";
  }
  cf_modified = true;
}

function ignore_modified(){
  if (typeof(root.onbeforeunload) != "undefined") root.onbeforeunload = null;
}

function check_cf(){
  if (cf_modified) return WIN_CLOSE_MSG;
}


function crit_init(){
  if (undef() == root.onbeforeunload) root.onbeforeunload = check_cf;
  else return;

  var thisformcf;
  for (var i = 0; oCurrForm = document.forms[i]; i++){
    if (oCurrForm.getAttribute("cf")) thisformcf=true;
    else thisformcf =false;
    if (oCurrForm.getAttribute("nocf")) thisformcf=false;
    for (var j = 0; oCurrFormElem = oCurrForm.elements[j]; j++){
      if (thisformcf || oCurrFormElem.getAttribute("cf"))
      if (!oCurrFormElem.getAttribute("nocf"))
      {
        if (oCurrFormElem.addEventListener) oCurrFormElem.addEventListener("change", set_modified, false);
        else if (oCurrFormElem.attachEvent) oCurrFormElem.attachEvent("onchange", set_modified);
        if (oCurrFormElem.addEventListener) oCurrFormElem.addEventListener("keypress", set_modified, false);
        else if (oCurrFormElem.attachEvent) oCurrFormElem.attachEvent("onkeypress", set_modified);
      }
    }
    if (oCurrForm.addEventListener) oCurrForm.addEventListener("submit", ignore_modified, false);
    else if (oCurrForm.attachEvent) oCurrForm.attachEvent("onsubmit", ignore_modified);
  }
}

if (root){
  if (root.addEventListener) root.addEventListener("load", crit_init, false);
  else if (root.attachEvent) root.attachEvent("onload", crit_init);
}

/* cookies */
var Cookies = {
	create: function(name, value, days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime() + (days*24*60*60*1000));
			var expires = "; expires="+ date.toGMTString();
		} else {
			var expires = "";
		}
		document.cookie = name +"="+ value + expires +"; path=/";
	},

	read: function(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(";");
		for(var i=0; i<ca.length; i++) {
			var c = ca[i];
			while (c.charAt(0) == ' ') {
				c = c.substring(1,c.length);
			}
			if (c.indexOf(nameEQ) == 0) {
				return c.substring(nameEQ.length,c.length);
			}
		}
		return null;
	},

	del: function(name) {
		this.create(name, "", -1);
	}
}

/* highlighter helper actions links */
var HighLighter = {
	viewPlain: function(id) {
		w = open();
		w.document.write("<pre>\n"+ document.getElementById(id).innerHTML +"</pre>");
		w.document.close();
	},

	print: function(id) {
		w = open();
		w.document.write("<pre>\n"+ document.getElementById(id).innerHTML +"</pre>");
		w.document.close();
		w.print();
		w.close();
	},

	copy: function(id) {
		var code = document.getElementById(id);
		var src = code.innerHTML;
		var re = /<(?:[^>]+?)(?:\s[^>])*>([^>]*?)<\/[^>]+?>/gm;
		while (re.test(src)) {
			src = src.replace(re, "$1");
		}
		if (window.clipboardData) {
			window.clipboardData.setData("Text", (src.replace(/&lt;/g, "<")).replace(/&gt;/g, ">"));
			return;
		}
		src = ((src.replace(/%/g, "%25")).replace(/&amp;/g, "%26")).replace(/"/g, "&quot;");
		if (code.createTextRange) {
			var range = code.createTextRange();
			if (range) {
				range.execCommand('Copy');
			}
		} else {
			if (flash_installed) {
				var flashcopier = 'flashcopier';
				if(!document.getElementById(flashcopier)) {
					var divholder = document.createElement('div');
					divholder.id = flashcopier;
					document.body.appendChild(divholder);
				}
				document.getElementById(flashcopier).innerHTML = '';
				var divinfo = '<embed src="/images/clipboard.swf" FlashVars="clipboard='+src+'" width="1" height="1" type="application/x-shockwave-flash"></embed>';
				document.getElementById(flashcopier).innerHTML = divinfo;
			} else {
				alert('For enable copy feature you need Flash plugin');
			}
		}
	}
}

var Versions = {
	status: null,
	switchTo: null,
	notice: null,

	run: function() {
		container = document.getElementById('version_switcher');
		if (this.status == 'alpha' && this.notice) {
			container.appendChild(document.createTextNode(this.notice));
			container["class"] = container.className = "error";
			return;
		}
		if (!this.switchTo || (this.status!='beta' && this.status!='production') || !container || !this.notice) {
			return;
		}
		if (this.status=='beta' && !Cookies.read("version_switcher")) {
			return;
		}
		var a = document.createElement("a");
		a.onclick = this["switch"];
		a.href = "#";
		a.appendChild(document.createTextNode(this.notice));
		container.appendChild(a);
	},

	"switch": function() {
		if (Cookies.create) {
			if (Versions.status == 'beta') {
				Cookies.del("version_switcher", 0, -1);
				document.location.href = document.location.protocol +"//"+ Versions.switchTo + "/beta.php";
			} else {
				Cookies.create("version_switcher", Versions.switchTo, 365);
				document.location.href = document.location.protocol +"//"+ Versions.switchTo + document.location.pathname + "?version_switcher=yeah";
			}
		}
		return false;
	}
}

/* magic sections */
var Sections = {
	toggle: function(id, e) {
		if (document.getElementById("edit-section-"+id)) {
			document.getElementById("edit-section-"+id).style.display = e.type=="mouseover"?"inline":"none";
		}
	},

	init: function() {
		for (var i=1, link; ; i++) {
			link=document.getElementById("edit-section-"+i);
			if (link) {
				link.style.display = "none";
			} else if (i>3) {
				break;
			}
		}
 	}
}

/* flash detect */
var flash_installed = 0;
var flash_version = 0;
if (navigator.plugins && navigator.plugins.length) {
	x = navigator.plugins["Shockwave Flash"];
	if (x) {
		flash_installed = 2;
		if (x.description) {
			y = x.description;
			flash_version = y.charAt(y.indexOf('.')-1);
		}
	} else {
		flash_installed = 1;
	}
	if (navigator.plugins["Shockwave Flash 2.0"]) {
		flash_installed = 2;
		flash_version = 2;
	}
} else if (navigator.mimeTypes && navigator.mimeTypes.length) {
	x = navigator.mimeTypes["application/x-shockwave-flash"];
	if (x && x.enabledPlugin) {
		flash_installed = 1;
	} else {
		flash_installed = 0;
	}
} else {
	for(var i=10; i>0; i--) {
		try {
			var flash = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + i);
			flash_installed = 2;
			flash_version = i;
			break;
		} catch(e) {}
	}
}

/* jirabugs ugly stuff */
function toggleJiraBug(id) {
	var showah = document.getElementById("bugshowah_"+id);
	if (showah) {
		var klika = document.getElementById("bugklikah_"+id);
		if (showah.style.display=="none") {
			showah.style.display = "block";
			klika.innerHTML = "&ndash;";
		} else {
			showah.style.display = "none";
			klika.innerHTML = "+";
		}
	}
}
