var jsFlexy =
{
    go: function ( el, target, url ) {
        if (!url || url.charAt(0)!='/'){
            url = (el.getAttribute("href") || el.href) + (url || "");
            if (url && url.substring(0,7) == "http://") {
                url = url.substring(7);
                url = url.substring(url.search(/\//, url));
            }
        }
        target = target || '#body';
        
        el = this.query( el, target, url );
        
        if(el=='stop')return true;
        
        var a = url.split('/');
        if (phpVars && (url.charAt(0)=='/') && (a[1].length != 2)) {
            url = '/' + phpVars.LANG + url;
        }
        
        var appState = new ApplicationState( url, el.id );
        dojo.back.addToHistory(appState);
        if(typeof(phpVars.urchin) != "undefined"){phpVars.urchin.trackPageView(url);}
        
        //dojox.fx.smoothScroll({ node:el, win: window, duration:500, easing:dojo.fx.easing.easeOut }).play();
        if (el.id.substr(0,4)=='body') {
            url = '/' + target.substr(1) + url;
            //location.hash = url.substring(1);
        } else if (url.substr(0,7)!='/inner/') {
            url = '/inner' + url;
        }
        
        return this.innerLoad( el, url );
    },

    submit: function (form, target) {
        if (form.tagName && form.tagName.toUpperCase()!='FORM'){
            form = this.query(form,'form');
        } else if (form.domNode && form.domNode.tagName.toUpperCase()!='FORM'){
            form = this.query(form,'form');
        }
        //var form = dojo.byId( form );
        //var action = (form.attributes && form.attributes['action'].value) || form.getAttribute('action');
        var action = form.action;
        
        //dojo.forEach( form.elements, function(el){ dijit.registry.remove(el.id); });
        
        if (action && action.substring(0,7) == "http://") {
            action = action.substring(7);
            action = action.substring(action.search(/\//, action));
        }
        
        target = this.query( form.domNode || form, target || '#body');
        
        if (target.id.substr(0,4) == 'body') {
            action = '/body' + action;
        } else {
            action = '/inner' + action;
        }
        
        var a = {
            url: action + '?flexylinkdiv=created',
            //handleAs: "text",
            //form: form,
            //content: form.attr && form.attr('value'),
            timeout: 0,

            // The LOAD function will be called on a successful response.
            load: function(response, ioArgs) {
                jsFlexy.replace(target,response);
                return response;
            },

            // The ERROR function will be called in an error case.
            error: function(response, ioArgs) {
                console.error("HTTP status code: ", ioArgs.xhr.status);
                return false;
            }
        };
        var content = form.attr && form.attr('value');
        if (content) {
            a.content = content;
        } else {
            a.form = form;
        }
        dojo.xhrPost( a );
        dojo.byId(target).innerHTML = phpVars.msgLoading;
    
        return true;
    },
    
    query: function ( node, query, id_if_after ){
      if (!node || !query) return dojo.query(node);
      var q_split = query.split(',');
      var q_up = q_split[0];
      var q_down = q_split[1];
      var q_parts = q_up.split(' '),
          re = /(\d+)?([A-Za-z]+)?((#|\.)(\w+)((#|\.)(\w+))?)*/;

      for(var i=0; i<q_parts.length && node; i++){
          var m = q_parts[i].match(re);
          if (!m || !m[0]) break;
          
          var tag = m[2],
              cnt = m[1] || 1,
              cls = null,
              id = null;

          if (m[3]){
            switch(m[4]){
              case '#' : id = m[5]; break;
              case '.' : cls = m[5]; break;
            }
          }

          if (m[6]){
            switch(m[7]){
              case '#' : id = m[8]; break;
              case '.' : cls = m[8]; break;
            }
          }

          if (id) {
            node = dojo.byId(id);
          } else {
              while(cnt > 0){
                node = node.parentNode || node.domNode.parentNode;
                if (node == dojo.doc) {
                  node = null;
                  break;
                }
                var has_tag = (tag ? (node.tagName.toUpperCase() == tag.toUpperCase()) : true),
                    has_id = (id ? (node.id.toLowerCase() == id.toLowerCase()) : true),
                    has_cls = (cls ? (dojo.hasClass(node, cls)) : true);
                if (has_tag && has_id && has_cls)
                  cnt--;
              }
          }
      }

      if(!node)
        return false;
        
      if(q_down) {
        if(q_down=='after'){
            var e = node;
            var parentDiv = e.parentNode;
            if (dojo.hasClass(parentDiv,'table')){
                e = parentDiv;
                parentDiv = e.parentNode;
            }
            if (e.nextSibling && dojo.hasClass(e.nextSibling, 'auto_generated')) {
                e = e.nextSibling;
                if (!id_if_after || dojo.hasClass(e,id_if_after)){
                    parentDiv.removeChild( e );
                    //dojo.removeClass(node, 'active');
                    return 'stop';
                } else {
                    e.setAttribute("class", 'auto_generated');
                    dojo.addClass( e, id_if_after);
                    node = e;
                }
            } else {
                var e2 = document.createElement("div");
                dojo.addClass( e2, 'auto_generated');
                if (id_if_after) {
                    dojo.addClass( e2, id_if_after);
                }
                parentDiv.insertBefore( e2, e.nextSibling );
                //dojo.appendChild( dojo.doc.createElement( 'div' ) );
                node = e2;
            }
        } else {
            node=dojo.query(q_down, node);
        }
      }
      
      //return dojo.query(node);
      return node;
    },

    findTargetId: function ( el, url, is_no_close ) {
        var target = 'body';
        if (!url) {
            url = '';
        }
        var a = url.split('/');
        if (el == null) {
            el = dojo.byId('body');
        }
        if (a.inArray('target')) {
            var u = '';
            for (i = 0; i < a.length; i++) {
                if (target == '*') {
                    target=a[i];
                } else if (a[i] == 'target') {
                    target='*';
                } else if (i+1 < a.length) {
                    u += a[i] + '/';
                }
            }
            url = u;
        }
        
        //if (!target || target=='') {
        //    target = 'body';
        //}
        notClose = is_no_close || (target.substr(0,4)=='body') || (0+target>0);
        if (target == '0') {
//            el.
        }
        if (target == 'after') {
        	var e = el;
            var parentDiv = e.parentNode;
            if (dojo.hasClass(parentDiv,'table')){
                e = parentDiv;
                parentDiv = e.parentNode;
            }
            url = '/inner' + url;
            if (e.nextSibling && e.nextSibling.id == url) {
                parentDiv.removeChild( e.nextSibling );
                dojo.removeClass(el, 'active');
                return true;
            }
            target = url;
            var e2 = document.createElement("div");
            e2.setAttribute("id", target);
            parentDiv.insertBefore( e2, e.nextSibling );
            //dojo.appendChild( dojo.doc.createElement( 'div' ) );
            
        } else if (target == 'next') {
            var parentDiv = jsFlexy.findParentEl( el, ['DIV','TD'] );
            if (!parentDiv) {
                if (phpVars.is_debug) {
                    console.log('Target not found.');
                    return true;
                } else {
                    return false;
                }
            }
            var childDivs = parentDiv.getElementsByTagName('DIV');
            
            url = '/inner' + url;
            for (var i=0; i < childDivs.length; i++) {
                u = childDivs[i].id;
                if (u == url) {
                    parentDiv.removeChild( childDivs[i] );
                    return true;
                }
            }
            target = url;
            parentDiv.innerHTML += '<div id="'+target+'">.</div>';
            //dojo.appendChild( dojo.doc.createElement( 'div' ) );
            
        } else if (target && (target+0>0 || (target.charAt(0)=='!' && target.charAt(target.length)=='!'))) {
            var reg;
            if ((target.charAt(0)=='!' && target.charAt(target.length)=='!')) {
                reg = new RegExp( target.substr(1,target.length-2) );
            }
            var prnt;
            var t = 1*target;
            var el2 = el;
            
            while ((!prnt) && el2 && (el2.tagName!='BODY')) {
                id = el2.id;
                if (t>0 && id && (id.charAt(0)=='/' && id.charAt(id.length-1)=='/')) {
                    if (t==1) {
                        prnt = el2;
                    } else {
                        t--;
                    }
                } else if (reg && reg.test(id)) {
                    prnt = el2;
                }
                el2 = el2.parentNode;
            }
            if (prnt) {
                target = prnt.id;
            }
            
        }
        
        // if url is only suffix
        if ((url.length<=1 || url.charAt(0)!='/')  &&  target.charAt(0)=='/'  &&  target.charAt(target.length-1)=='/') {
            if (url.length > 1) {
                var u = url.split('/');
                var url_prefix = target;
                a = url_prefix.split('/');
                if (a.inArray(u[0])) {
                    url_prefix = '';
                    for (i = 0; i < a.length; i++) {
                        if (a[i] == u[0]) {
                            break;
                        }
                        url_prefix += a[i] + '/';
                    }
                }
                url = url_prefix + url;
            } else {
                url = target;
            }
        }
        /*
        // Delete 'sort','page' from url
        var a = url.split('/');
        var u = '';
        var t = '';
        for (i = 0; i < a.length; i++) {
            if (t == '*') {
                t = '';
            } else if (a[i]=='sort' || a[i]=='page') {
                t = '*';
            } else if (i+1 < a.length) {
                u += a[i] + '/';
            }
        }
        url = u;
        */
        
        t = target.replace('~','/','g');
        if (t!=target) {
            target = '/' + t + '/';
        }
        el2 = dojo.byId( target );
        if (el2) {
            el = el2;
        } else {
            target = el.id;
        }
        
        if (!el) {
            return null;
        }
        
        if (target && target.charAt(0)=='/' && target.charAt(target.length-1)=='/') {
            el.setAttribute('id', url);
            target = url;
        }
        
        if (el.style.display == 'none') {
              el.style.display = 'block';
        }
        
        return target;
    },
    
    link: function ( el, url, is_no_close ) {
        if (!url){
            url = el.getAttribute("href");
            if (!url) {
                url = el.href;
            }
            if (url && url.substring(0,7) == "http://") {
                url = url.substring(7);
                url = url.substring(url.search(/\//, url));
            }
        }
        if (el){
            var tagA = this.findParentEl(el,'BODY');
            if (tagA){
                tagA = tagA.getElementsByTagName("a"); 
                for (var i = 0; i < tagA.length; i++) {
                    //if(dojo.hasClass(tagA[i],'active')){
                        dojo.removeClass( tagA[i], 'active');
                    //}
                }
            }
            dojo.addClass( el, 'active' );
        }
        var a = url.split('/');
        if (phpVars && (url.charAt(0)=='/') && (a[1].length != 2)) {
            url = '/' + phpVars.LANG + url;
        }
        var target = this.findTargetId( el, url, is_no_close );
    
        if (target==false || target==true) {
            return target;
        }
        
        if (target.charAt(0)=='/' && target.charAt(target.length-1)=='/') {
            url = target;
        }
        
        el = dojo.byId( target );
        
        if (target.substr(0,4)=='body') {
            //location.hash = url.substring(1);
    		var appState = new ApplicationState( url, target );
    		dojo.back.addToHistory(appState);
            if(typeof(phpVars.urchin) != "undefined"){phpVars.urchin.trackPageView(url);}
            url = '/' + target + url;
            
            if (dojo.byId('scrollIntoView')) {
                dojo.byId('scrollIntoView').scrollIntoView(true);
            }
        } else if (url.substr(0,7)!='/inner/') {
            url = '/inner' + url;
        }
        
        if (target.charAt(0)=='/' && target.charAt(target.length-1)=='/') {
            el.setAttribute('id', url);
            target = url;
        } else {
            el.innerHTML = '<div id="'+url+'">'+phpVars.msgLoading+'</div>';
            target = url;
        }
        
        this.innerLoad( target, url );
        
        return true;
    },

    innerLoad: function ( target, url ) {
        var u = url;
        
        /*
        if (u.search(/\?/) > 0){
            u += '&';
        } else {
            u += '?';
        }
        u += 'flexylinkdiv=created';
        */
        
        el = dojo.byId( target );
        el.innerHTML = phpVars.msgLoading;
        
        dojo.xhr( 'GET', {
            url: u,
            handleAs: "text",
            timeout: 50000,

            // The LOAD function will be called on a successful response.
            load: function(response, ioArgs) {
                jsFlexy.replace(el,response);
                return response;
            },

            // The ERROR function will be called in an error case.
            error: function(response, ioArgs) {
              console.log(ioArgs.xhr);
              console.error("HTTP status code: ", ioArgs.xhr.status);
              return response;
              }
        });
        return true;
    },
    
    replace: function ( target, innerHTML )
    {
        var target = dojo.byId(target);
        target.style.display = 'none';
        target.innerHTML = innerHTML;
        dojo.query("script", target).forEach(function(n){ 
            if(n.type=="text/javascript"){
                if(n.src){
                    var head= document.getElementsByTagName('head')[0];
                    var script= document.createElement('script');
                    script.type= 'text/javascript';
                    script.src= n.src;
                    head.appendChild(script);
                }else{
                    new Function(n.innerHTML).call(n.parentNode);
                }
            } });
        dojo.parser.parse( target );
        target.style.display = 'block';
        if (target.id.substr(0,4)!='body') {
            dojox.fx.highlight({node:target}).play();
        }
        //dojox.fx.wipeIn({node:target, duration:800}).play();
    },

    refresh: function ( el ) {
        var prnt;
        while (!prnt && el!=null) {
            if (el.className == 'parent') {
                prnt = el;
            }
            el = el.parentNode;
        }
        if (prnt) {
            var link = prnt.id;
            if (link) {
                this.link( el, link );
            }
        }
    },

    setActive: function( link )
    {
        var body = document.getElementsByTagName("body")[0]; 
        var tagA = body.getElementsByTagName("a"); 
        for (var i = 0; i < tagA.length; i++) { 
            clss = tagA[i].getAttribute("class");
            if ( clss == "active" ) {
                tagA[i].removeAttribute("class");
                clss = "";
            }
            href = tagA[i].getAttribute("href");
            if (href && href.substring(0,7) == "http://") {
                href = href.substring(7);
                href = href.substring(href.search(/\//, href));
            }
            if (href && href.length>2 && href == link.substring(0,href.length) && clss==null) {
                tagA[i].setAttribute("class", "active");
            }
        }
    },
    
    findParentEl: function(srcEl, destTag, num)
    {
        if (num < 1)num = 1;
        while (srcEl!=null) {
            if (typeof(destTag)=='object' && (destTag instanceof Array)) {  // isArray
                if (destTag.inArray( srcEl.tagName )) {
                    if (num > 1) {
                        num--;
                    } else {
                        return srcEl;
                    }
                }
            } else {
                if (srcEl.tagName == destTag) {
                    if (num > 1) {
                        num--;
                    } else {
                        return srcEl;
                    }
                }
            }
            srcEl = srcEl.parentNode;
        }
        return null;
    },

    nextRow: function(el,url,firstTD, cntHead)
    {
        if (!el.tagName) {
            return false;
        }
        if (rowID = jsFlexy.insertRow(el,url,firstTD, cntHead)) {
            dojo.byId('td_add_'+rowID).setAttribute('innerLink',url);
            jsFlexy.link( el, url+'target/td_add_'+rowID+'/', 1 );
        }
        return true;
    },
    
    refreshRow: function(el)
    {
        while (el!=null) {
            if (el.tagName=='TD' && el.id.substring(0,7)=='td_add_') {
                jsFlexy.link( el, el.getAttribute('innerLink') );
                //return el;
            }
            el = el.parentNode;
        }
    },
    
    insertRow: function(el, url, firstTD, cntHead)
    {
        var tbl = jsFlexy.findParentEl(el,'TABLE');
        if (tbl==null) return false;
        
        var tbl_tr = jsFlexy.findParentEl(el,'TR');
        var insRow = null;
        var id = '';
    
        for (var i=0; i<tbl.tBodies[0].rows.length; i++) {
            id = tbl.tBodies[0].rows[i].getAttribute('id');
            if (i==insRow && id && id.substring(0,7)=='tr_add_') {
                if (tbl.tBodies[0].rows[i].getAttribute('innerLink')==url) {
                    if (cntHead > 0) {
                        i = i + cntHead;
                    }
                    tbl.deleteRow(i);
                    return false;
                } else {
                    tbl.tBodies[0].rows[i].setAttribute('innerLink',url);
                    return id.substring(7);
                }
            }
            if (tbl.tBodies[0].rows[i]==tbl_tr) { insRow = i+1; }
        }
        
        if (!insRow) { return false; }
    
        rowID = Math.random();
        while (dojo.byId('tr_add_'+rowID)) {
            rowID = Math.random();
        }
        
        var row = tbl.tBodies[0].insertRow(insRow);
        row.className = tbl.tBodies[0].rows[insRow-1].getAttribute('class');
        row.setAttribute('id', 'tr_add_'+rowID );
        row.setAttribute('innerLink', url );
    
        var addColSpan = tbl.tBodies[0].rows[0].cells.length;
        
        if (firstTD) {
            var cell0 = row.insertCell(0);
            var textNode = document.createTextNode(firstTD);
            cell0.appendChild(textNode);
            addColSpan = addColSpan - 1;
            var cell1 = row.insertCell(1);
        } else {
            var cell1 = row.insertCell(0);
        }
        
        cell1.setAttribute('id', 'td_add_'+rowID+'_main' );
        cell1.colSpan = addColSpan;
        
        //dojo.byId('td_add_'+rowID).innerHTML = phpVars.msgLoading + "loading...";
        btnClose = '<div align="right"><a href="javascript:void(0)" onclick="jsFlexy.deleteRowThis(this)" class="button">закрыть</a></div>'
//        dojo.byId('td_add_'+rowID+'_main').innerHTML = btnClose+'<div id="td_add_'+rowID+'">'+phpVars.msgLoading+'</div>'+btnClose;
        dojo.byId('td_add_'+rowID+'_main').innerHTML = '<div id="td_add_'+rowID+'">'+phpVars.msgLoading+'</div>';
        return rowID;
    },
    
    deleteRowThis: function(el)
    {
        var tr = jsFlexy.findParentEl(el,'TR');
        var tbl = jsFlexy.findParentEl(el,'TABLE');
        tbl.deleteRow(tr.rowIndex);
    },
    
    disp: function (id, el_a)
    {
        var div = dojo.byId(id);
        if (div.style.display=='none') {
            div.style.display = 'block';
            if (el_a) {
                if (! el_a.getAttribute('title_on')) {
                    el_a.setAttribute('title_on', el_a.innerHTML);
                }
                if (! el_a.getAttribute('title_off')) {
                    el_a.setAttribute('title_off', 'Закрыть');
                }
                el_a.innerHTML = el_a.getAttribute('title_off');
            }
        } else {
            div.style.display = 'none';
            if (el_a) {
                if (! el_a.getAttribute('title_on')) {
                    el_a.setAttribute('title_on', 'Отобразить' );
                }
                if (! el_a.getAttribute('title_off')) {
                    el_a.setAttribute('title_off', el_a.innerHTML );
                }
                el_a.innerHTML = el_a.getAttribute('title_on');
                dojo.byId(div.getAttribute('title_id')).innerHTML = div.getAttribute('title_on');
            }
        }
    },
    
    Redirect: function(url) {
        window.location = url;
    },
    
    hideId: function(id, time) {
        if (time) {
            setTimeout('jsFlexy.hideId("'+id+'")', time);
        } else {
            var el = dojo.byId(id);
            if (el) {
                el.style.display = 'none';
            }
        }
    },
    
    deleteFormValues: function(form) {
        var validElement = function (element) {
            if (!element || !element.getAttribute) {
                return false;
            }
            if (element.disabled) {
                return false;
            }
            return true;
        }
        
        var ids_old = new Array();
        var ids_new = new Array();
        var ids_cnt = -1;
        
        var els = form.getElementsByTagName('INPUT');
        for (var i=0; i < els.length; i++) {
            if (!validElement(els[i])) {
                continue;
            }
            els[i].value = "";
            if (els[i].id.length > 0) {
                var r = Math.random()*1000;
                ids_cnt += 1;
                ids_old[ids_cnt] = "" + els[i].id;
                ids_new[ids_cnt] = "" + els[i].id + "_" + r;
                els[i].id = ids_new[ids_cnt];
            }
        }

        var els = form.getElementsByTagName('SELECT');
        for (var i=0; i < els.length; i++) {
            if (!validElement(els[i])) {
                continue;
            }
            els[i].value = "";
            els[i].selectedIndex = 0;
        }

        var els = form.getElementsByTagName('TEXTAREA');
        for (var i=0; i < els.length; i++) {
            if (!validElement(els[i])) {
                continue;
            }
            els[i].value = "";
        }
        
/*        var els = form.getElementsByTagName('SCRIPT');
        for (var i=0; i < els.length; i++) {
            for (var j=0; j<ids_old.length; j++) {
                els[i].text = els[i].text.replace( ids_old[j], ids_new[j] );
//                els[i].innerHTML = els[i].innerHTML.replace( ids_old[j], ids_new[j] );
            }
        }*/
        
        return form;
    },
        
    markAllCheckbox: function ( el ) {
        if (!el) {
            el = document;
        }
        var a = el.getElementsByTagName('input');
        for (i=0; i<a.length; i++) {
            if (a[i].getAttribute('type').toLowerCase() == 'checkbox') {
                a[i].checked = true;
            }
        }
    }
}

Array.prototype.inArray = function (value)
{
    var i;
    for (i=0; i < this.length; i++) {
        if (this[i] === value) {
            return true;
        }
    }
    return false;
};

