Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
26.03.2015
Размер:
8.87 Кб
Скачать
/// <reference path="jquery-1.4.1-vsdoc.js" />

// GLOBALS

var parent = document;
var significantElements;
var navigation;
var ulNavigation;

// МЕХАНИКА И UI
/*
$(function() {
$('.navigation').tabSlideOut({
tabHandle: '.handle', //class of the element that will become your tab
pathToTabImage: 'images/navbutton.png', //path to the image for the tab //Optionally can be set using css
imageHeight: '106px', //height of tab image //Optionally can be set using css
imageWidth: '24px', //width of tab image //Optionally can be set using css
tabLocation: 'right', //side of screen where tab lives, top, right, bottom, or left
speed: 300, //speed of animation
action: 'click', //options: 'click' or 'hover', action to trigger animation
topPos: '-1px', //position from the top/ use if tabLocation is left or right
leftPos: '20px', //position from left/ use if tabLocation is bottom or top
fixedPosition: true //options: true makes it stick(fixed position) on scroll
});
});
*/
// ЛОГИКА

window.onload = function() {
/*
navigation = $(".navigation");
ulNavigation = $("#ulnavigation");
navigation.css("visibility", "visible");
*/

navigate(document.location + "");
//makeDocumentOutline();
var links = $("a[href][class!='navlink'][class!='handle']");
links.each(function() {
this.onclick = _navigate;
});
}

function _navigate() {
navigate(this.href + "");
}

/**
* Критерии разбора строки
* 1. Строка разделяется по символу "?" (первое вхождение) и в
* разбор принимается вторая часть, содержащая сами параметры.
* 2. Строка разделяется по символу "#" (первое вхождение)
* на часть GET-параметров (из которых нужно извлечь регистрационный
* номер) и часть, содержащую собственно параметры навигации или
* название якоря в документе.
* 3. В случае несовпадения целевого и текущего регистрационных
* номеров, управление навигацией возвращается браузеру
* (return true).
* 4. В случае совпадения регистрационных номеров, анализируется
* строка параметров навигации. Если в ней нет вхождений символа "=",
* то мы имеем обычный якорь. Управление навигацией возвращается
* браузеру.
* 5. В противном случае, строка параметров навигации без первого
* символа (&) разбирается, и документ поэтапно прокручивается на
* требуемое место.
*/
function navigate(addr) {
// 0. Определение текущего регистрационного номера
var currentGETParams = (splitParamString(document.location + ""))[0];
var currentRN = extractRegNum(currentGETParams)
// 1, 2.
var targetParams = splitParamString(addr);
if (targetParams.length > 1) {
// 3.
var targetRN = extractRegNum(targetParams[0]);
if (currentRN.toUpperCase() != targetRN.toUpperCase()) return true;
// 4.
if (targetParams[1].indexOf("=") == -1) return true;
// 5.
var s = "";
var q = parseQuery(targetParams[1].substr(1));
var pos = 0;
for (var i in q) {
//s += i + ": " + q[i] + "\n"; // debug
pos = scrollInto(pos, i.toLowerCase(), q[i]);
}
//alert(s);
return false;
}
return true;
}

function innerNavigate(idx) {
significantElements.get(idx).scrollIntoView();
}

function makeDocumentOutline() {
significantElements = $("p.title,p[id],a[name]");
significantElements.each(
function(pos) {
var description = prepareElementForNavigation(this);
if (description != "" && description != null) {
ulNavigation.append('<li class="nav_' + this.className + '"><a class="navlink" href="javascript:innerNavigate(' + pos + ')">' + description + '</a></li>');
}
}
)
}

/**
* Function parses supplied query string and returns the hash with the values
* Multiple values are stored in the array
*
* @param {String} q query string
* @return {Object}
* @scope public
*
* Source: http://forum.dklab.ru/viewtopic.php?t=24298
*/
function parseQuery(q) {
if ('string' != typeof q) return {};
q = q.split("&");
for (var z = 0, qL = q.length, rs = {}, kv, rkv; z < qL; z++) {
kv = q[z].split("=");
/*
* convert PHP and Perl-styled hashes to JS has keys
*/
kv[0] = kv[0].replace(/[{}\[\]]*$/, "");
rkv = rs[kv[0]];
/*
* replace all + with spaces, unescape skips this part
*/
kv[1] = unescape(kv[1].replace("+", " "));
if (rkv)
if ('array' == typeof (rkv)) rs[kv[0]][rs[kv[0]].length] = kv[1];
else rs[kv[0]] = [rs[kv[0]], kv[1]];
else rs[kv[0]] = kv[1];
}
return rs;
}

function splitParamString(str) {
if (str.indexOf("?") != -1) {
str = str.substr(str.indexOf("?") + 1);
return str.split("#", 2);
}
}

function extractRegNum(str) {
var currRN = "";
var q = parseQuery(str);
for (var i in q) {
if (i.toUpperCase() == "RN") {
currRN = q[i];
break;
}
}
return currRN;
}

function scrollInto(pos, el, id) {
var p = parent.getElementsByTagName('p');
for (var i in p) {
if ((p[i]).className == el) {
if ((p[i]).id == id) {
if ((p[i]).offsetTop > pos) {
pos = (p[i]).offsetTop;
(p[i]).scrollIntoView();
break;
}
}
}
}
return pos;
}

function stripTags(str) {
return str.replace(/<br ?\/?>/gi, ' ').replace(/<\/?[^>]+>/gi, '');
}
/**
* Имеются следующие классы значимых элементов:
* Название документа title
* Преамбула документа preamble
* Название документа title
* Место принятия placeprin
* Слово «Извлечение» izvlechen
* Подпись над таблицей (например, «Таблица 1») onestring
* Согласование документа agree
* Фамилия и инициалы должностного лица, согласовавшего документ agreefio
* Гриф утверждения документа cap
* Слово «УТВЕРЖДЕНО» в грифе утверждения capu
* Закон принят и одобрен prin_odobren
* Гриф одобрения odobren
* Слово «ОДОБРЕНО» в грифе одобрения odobren1
* Название приложения к документа titlep
* Заголовок после грифа «Утверждено» titleu
* Слово «Приложение» в начале приложения к документу append1
* Заголовок раздела в тексте ПА zagrazdel
* Глава документа chapter
* Ненумерованные названия частей документа nonumheader
* Заголовок части документа part
* Заголовок, содержащий значок параграфа paragraph
* Нумерованные названия статей документа article
* Пункты документа point
* Подпункты документа underpoint
* Пример primer
* Бланк или форма blank
* Перечень с абзацным смещением withpar
* Перечень без абзацного смещения withoutpar
* Комментарии к документу comment
* Сноски в документе snoski
* Информационные таблицы table10
* Таблицы, содержащие перечень фамилий spiski
* Слова «Изменение и дополнение» об изменяющем документе changei
* Информация об изменяющем документе changeadd
*
* Принимаемые во внимание элементы:
* Название документа title
* Преамбула документа preamble
* Название документа title
* Место принятия placeprin
* Слово «Извлечение» izvlechen
* Подпись над таблицей (например, «Таблица 1») onestring
* Название приложения к документа titlep
* Заголовок после грифа «Утверждено» titleu
* Заголовок раздела в тексте ПА zagrazdel
* Глава документа chapter
* Ненумерованные названия частей документа nonumheader
* Заголовок части документа part
* Заголовок, содержащий значок параграфа paragraph
* Нумерованные названия статей документа article
* Пункты документа point
* Подпункты документа underpoint
* Пример primer
* Бланк или форма blank
* Комментарии к документу comment
* Информационные таблицы table10
*/
function prepareElementForNavigation(el) {
if (el.tagName == "A") {
if (el.name.indexOf("Заг_") != -1) {
return stripTags($(el).parent().get(0).innerHTML);
}
}
switch (el.className) {
case "point":
//return "пункт " + el.id;
return null;
case "chapter":
case "article":
case "title":
return stripTags(el.innerHTML);
}
return null;
}
Соседние файлы в папке спецводопольз_files