var jsFlexy =
{
    generatedClassName : 'jsFlexy_auto_generated',
    
    go: function ( el, target, url ) {
        if (!url || url.charAt(0)!='/'){
            url = (dojo.attr(el,'href') || "/") + (url || "");
            if (url && url.substr(0,7) == "http://") {
                url = url.substr(7);
                url = url.substr(url.search(/\//, url));
            }
        }
        var t = this.getTargetFromUrl( url );
        trgt = t || target || '#body';
        
        el = this.query( el, trgt, url );
        
        if(!el){
            if(phpVars.is_debug){
                console.error('jsFlexy: wrong target',target);
                return true;
            }
            return false;
        }
        
        if(el=='stop')return true;
        
        var a = url.split('/');
        if (url.charAt(0)=='/' && a[1].length!=2) {
            url = '/' + phpVars.lang + url;
        }
        
        if(el.id) dojo.back.addToHistory(new ApplicationState( url, el.id ));
        if(typeof(tracker)!="undefined") tracker.trackPageView(url);
        
        this.setActive( url );
        
        return this.innerLoad( el, this.addUrlTarget(el,url) );
    },
    
    addUrlTarget: function (el, url) {
        if (el.id){
            url += 'target/'+el.id+'/';
        }else if(el.className){
            var c = el.className;
            if(c.indexOf(' ')>=0)c=c.substr(0,c.indexOf(' ')-1);
            if(c.indexOf('/')<0){
                url += 'target/.'+c+'/';
            }
        }else if(el.tagName){
            url += 'target/-'+el.tagName+'/';
        }
        return url;
    },

    submit: function (el, target) {
        //var form = this.query(el,'form');
        var form = dojo.byId( el );
        //var url = (form.attributes && form.attributes['action'].value) || form.getAttribute('action');
        var url = form.action;
        
        if (url && url.substr(0,7) == "http://") {
            url = url.substr(7);
            url = url.substr(url.search(/\//, url));
        }
        
        var t = this.getTargetFromUrl( url );
        
        target = this.query( form.domNode || form, t || target || '#body', url );
        
        var a = url.split('/');
        if (url.charAt(0)=='/' && a[1].length!=2) {
            url = '/' + phpVars.lang + url;
        }
        
        url = '/'+((target.id && target.id.substr(0,4)=='body') ? target.id : 'inner')+url;
        
        dojo.xhrPost({
            url: this.addUrlTarget(target,url),
            //handleAs: "text",
            form: form.domNode || form,
            //content: (form.attr ? form.attr('value') : form),
            timeout: 50000,

            load: function(response, ioArgs) {
                jsFlexy.replace(target,response);
                return response;
            },

            error: function(response, ioArgs) {
                ioArgs.args.el.innerHTML = 'Error: '+response.message;
                jsFlexy.xhrError( response, ioArgs );
                return (phpVars.is_debug ? true : false);
            }
        });
        dojo.byId(target).innerHTML = phpVars.msgLoading;
    
        return true;
    },
    
    query: function ( node, query, id_if_after ){
      if (!node || !query) return dojo.query(node)[0];
      if (query.substr(0,4)=='body') query='#'+query;
      if (query.substr(query.length-6) == '_after') {
            query = query.substr(0,query.length-6);
            var q_after = true;
            if (query.substr(query.length-1)==' ') query=query.substr(0,query.length-1);
      }
      if (query.substr(query.length-6) == '_inner') {
            query = query.substr(0,query.length-6);
            var q_inner = true;
            if (query.substr(query.length-1)==' ') query=query.substr(0,query.length-1);
      }
      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++){
          if(q_parts[i]=='_this'){
            continue;
            
          }else if(q_parts[i]=='_parent'){
            if(node==window)return false;
            node = node.parentNode || node.domNode.parentNode;
            
          //}else if(q_parts[i]=='_after'){
          //  node = this.afterInsert(node, id_if_after);
            
          } else {
              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){
                    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(cnt>0 && node){
                        if(node.domNode){
                            node = node.domNode.parentNode;
                        } else {
                            node = node.parentNode;
                        }
                        if (node == dojo.doc) {
                          node = null;
                          break;
                        }
                    }
                  }
              }
          }
      }

      if(!node)
        return false;
        
      if(q_down) {
        node=dojo.query(q_down, node)[0];
      }
      
      if(node && q_after){
          node = this.afterInsert(node, id_if_after);
      }
      if(node && q_inner){
          node = this.innerInsert(node, id_if_after);
      }
      
      //return dojo.query(node)[0];
      return node;
    },

    innerLoad: function ( target, url ) {
        var el = dojo.byId( target );
        if (!phpVars.doLayout && phpVars.animation) {
            var h = dojo.style(el, 'height');
            dojo.style(el, 'height', h + 'px');
        }
        var w = dojo.query("> [widgetId]", el).map(dijit.byNode);
		dojo.forEach(w, "try{item.destroyDescendants();}catch(err){}");
        el.innerHTML = phpVars.msgLoading;
        
        if (!phpVars.doLayout) {
            if (phpVars.animation) {
                var elPos = dojo.position(el.firstChild);
                var bodyPos = dojo.position(document.body);
                if (elPos.y > bodyPos.h || elPos.y < 0) {
                    dojox.fx.smoothScroll({node:el, duration:300, win:window}).play();
                }
            } else {
                dijit.scrollIntoView( el.firstChild );
            }
        }
        
        if (el.id && el.id.substr(0,4)=='body') {
            url = '/' + el.id + url;
        //} else if (url.substr(0,7)!='/inner/') {
        //    url = '/inner' + url;
        }
		
        dojo.xhr( 'GET', {
            url: url,
            handleAs: "text",
            timeout: 50000,
            el: el,

            load: function(response, ioArgs) {
                jsFlexy.replace(this.el,response);
                
                if (!phpVars.doLayout && phpVars.animation) {
                    var o = document.createElement('div');
                    document.body.appendChild(o);

                    var w = dojo.style(this.el, 'width');
                    dojo.style(o, {
                        'width': w + 'px',
                        'position': 'absolute',
                        'visibility': 'hidden',
                        'top': '-1000px',
                        'left': '-1000px'
                    });
                    
                    o.innerHTML = this.el.innerHTML;
                    var h = dojo.style(o, 'height');
                    dojo.destroy(o);
                    
                    var resize = dojo.animateProperty({
                        node: this.el,
                        properties: {
                            height: h
                        },
                        duration: 700
                    }).play();
                    
                    //dojo.fx.combine([scroll, resize]).play();
                }
                return response;
            },

            error: function(response, ioArgs) {
                ioArgs.args.el.innerHTML = 'Error: '+response.message+'<br><a href="'+jsFlexy.getUrlWithOutTarget(this.url.substr(this.url.indexOf('/',1)))+'" onclick="return !jsFlexy.go(this,\'_parent\')">Refresh</a>';
                jsFlexy.xhrError(response, ioArgs);
                return (phpVars.is_debug ? true : false);
              }
        });
        return true;
    },
    
    send: function ( url ) {
        var img = document.createElement("IMG");
        img.setAttribute('src', url);
        //img.src = url;
    },
    
    replace: function ( target, innerHTML ) {
        var target = dojo.byId(target);
        if (!target){
            if(phpVars.is_debug){
                console.error('jsFlexy: Wrong target', target);
                return true;
            }
            return false;
        }
        //dojo.forEach( form.elements, function(el){ if(el.id) dijit.registry.remove(el.id); });
        
        target.style.display = 'none';
        target.innerHTML = innerHTML;
        /*if (typeof jsFlexy.scripts != 'undefined') {
            jsFlexy.scripts.forEach(function(s){ 
                new Function(s).call(dojo.byId('body'));
            });
            jsFlexy.scripts = [];
        }*/
        
        this.execute(target);
            
        var widgets = dojo.parser.parse( dojo.byId(target) );
        target.style.display = 'block';
        dojo.forEach(widgets, "if (item.startup) item.startup(); if (item.resize) item.resize();");
        if (!target.id || target.id.substr(0,4)!='body') {
            dojox.fx.highlight({node:target}).play();
            //dojo.fadeIn({node:target, duration:2800}).play();
            //dojox.fx.wipeIn({node:target, duration:600}).play();
            //dojox.fx.smoothScroll({node:el, win:window, duration:800, easing:dojo.fx.easing.easeOut}).play();
        }
    },
    
    execute: function( target ) {
        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);
                }
            } });
    },

    afterInsert: function( node, link ) {
        if(node.tagName=='TR' || node.tagName=='TD'){
            if (node.tagName=='TD') node=node.parentNode;
            var tbl = this.query(node,'table');
            var insRow = null;
        
            for (var i=0; i<tbl.tBodies[0].rows.length; i++) {
                if (tbl.tBodies[0].rows[i]==node) {
                    insRow = i+1;
                    if (tbl.tBodies[0].rows[insRow] && dojo.hasClass( tbl.tBodies[0].rows[insRow], this.generatedClassName)) {
                        if (tbl.tBodies[0].rows[insRow].getAttribute('link')==link) {
                            tbl.tBodies[0].rows[insRow].setAttribute('link','');
                            if(!tbl.id)tbl.id='jsFlexy_'+Math.random();
                            dojox.fx.wipeOut({node:tbl.tBodies[0].rows[insRow], duration:600/*, onEnd:'dojo.byId("'+tbl.id+'").deleteRow("'+insRow+'");'*/}).play();
                            return 'stop';
                        } else {
                            tbl.tBodies[0].rows[insRow].setAttribute('link',link);
                            tbl.tBodies[0].rows[insRow].setAttribute('style','');
                            return tbl.tBodies[0].rows[insRow].cells[0];
                        }
                    } else {
                        break;
                    }
                }
            }
            
            //if (!insRow) { return false; }
        
            var row = tbl.tBodies[0].insertRow(insRow);
            row.className = tbl.tBodies[0].rows[insRow-1].getAttribute('class');
            dojo.addClass( row, this.generatedClassName);
            row.setAttribute('link', link );
        
            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.colSpan = addColSpan;
            
            var eAfter = document.createElement("div");
            eAfter.className = this.generatedClassName;
            if (link) {
                dojo.attr( eAfter, {link:link} );
            }
            cell1.appendChild( eAfter );
            node = eAfter;
            
            var btn = document.createElement("div");
            dojo.attr( btn, {'onclick':'jsFlexy.nodeDelete(this,"tr")','align':'center','class':'divClose'} );
            cell1.appendChild( btn );
            
            return node;
                
        }else{
            var e = node;
            var parentDiv = e.domNode ? e.domNode.parentNode : e.parentNode;
            if (e.nextSibling && dojo.hasClass(e.nextSibling, this.generatedClassName)) {
                var eAfter = e.nextSibling;
                if (!link || dojo.hasClass(eAfter,link)){
                    dojo.removeClass(eAfter,link);
                    //if(!parentDiv.id)parentDiv.id='jsFlexy_'+Math.random();
                    //if(!eAfter.id)eAfter.id='jsFlexy_'+Math.random();
                    if (phpVars.animation) {
                        dojox.fx.wipeOut({node:eAfter, duration:600}).play();
                        //dojox.fx.wipeOut({node:eAfter, duration:600, onEnd:'dojo.byId("'+parentDiv.id+'").removeChild( dojo.byId("'+eAfter+'") );'}).play();
                    } else {
                        parentDiv.removeChild( dojo.byId(eAfter) );
                    }
                    //dojo.removeClass(e, 'active');
                    return 'stop';
                } else {
                    //dojo.attr( eAfter, 'style', {'display':'block'});
                    dojo.query( eAfter ).style({display:'block',overflow:''});
                    eAfter.className = this.generatedClassName;
                    if(link) dojo.addClass( eAfter, link);
                    node = eAfter;
                }
            } else {
                var eAfter = document.createElement("div");
                eAfter.className = this.generatedClassName;
                if (link) {
                    dojo.addClass( eAfter, link );
                }
                parentDiv.insertBefore( eAfter, e.nextSibling );
                //dojo.appendChild( dojo.doc.createElement( 'div' ) );
                node = eAfter
            }
        }
        return node;
    },
    
    innerInsert: function( node, link ) {
        if (node && dojo.hasClass(node, this.generatedClassName)) {
            if (!link || dojo.hasClass(node,link)){
                dojo.removeClass(node,this.generatedClassName);
                dojo.removeClass(node,link);
                if (phpVars.animation) {
                    dojox.fx.wipeOut({node:node, duration:600}).play();
                } else {
                    node.innerHTML = '';
                }
                return 'stop';
            } else {
                //dojo.query( node ).style({display:'block',overflow:''});
                dojo.addClass( node, this.generatedClassName );
                if(link) dojo.addClass( node, link);
                node = node;
            }
        } else {
            dojo.addClass( node, this.generatedClassName );
            if (link) {
                dojo.addClass( node, link );
            }
        }
        return node;
    },
    
    nodeDelete: function(el, query) {
        var node = this.query(el,query);
        if (node.tagName=='TD') node=node.parentNode;
        if (node.tagName=='TR'){
            var tbl = this.query(node,'TABLE');
            tbl.deleteRow(node.rowIndex);
        } else {
            node.parentNode.removeChild( node );
        }
    },
    
    xhrError: function (response, ioArgs) {
        if(phpVars.is_debug){
            console.error("jsFlexy: HTTP status code: ", response.message, ", URI:", ioArgs.args.url);
            //console.log(ioArgs);
            //console.log(el);
        }
    },
    
    setActive: function( link ) {
        var aTags = dojo.query('a'); 
        if (link.substr(0,6) == "/inner") {
            link = link.substr(6);
        } else if (link.substr(0,5) == "/body") {
            link = link.substr(5);
        }
        var activeTags = new Array();
        for (var i=0; i<aTags.length; i++) { 
            /*if (dojo.hasClass(aTags[i],'active')) {
                dojo.removeClass(aTags[i],'active');
            }*/
            var href = dojo.attr(aTags[i],'href');
            if (!href) {
                continue;
            }
            if (href.substr(0,7) == "http://") {
                href = href.substr(7);
                href = href.substr(href.search(/\//, href));
            }
            if (href.length>4 && (href==link.substr(0,href.length) || href=='/'+phpVars.lang+link.substr(0,href.length) || '/'+phpVars.lang+href==link.substr(0,href.length))) {
                activeTags.push( aTags[i] );
            }
        }
        if (activeTags.length > 0) {
            aTags.removeClass('active');
            for (var i=0; i<activeTags.length; i++) { 
                dojo.addClass(activeTags[i],'active');
            }
        }
    },
    
    link: function ( el, url ) {
        return this.go( el, '#body', url );
    },
    
    getTargetFromUrl: function ( url ) {
        var p = url.indexOf('/target/');
        if (p < 0) {
            return '';
        }
        var p2 = url.indexOf('/',p+8);
        var target = url.substring(p+8,(p2<0?url.length:p2));
        if (target.substr(0,1) == '-'){
            target = target.substr(1); // HTML TagName
        } else if (!['.',',','#','_'].inArray(target.substr(0,1))){
            target = '#'+target;
        }
        return target;
    },
    
    dialog: function ( href, title ) {
        var dialog = dijit.byId('mainDialogID');
        if (dialog) {
            dialog.titleNode.innerHTML = title || "Dialog";
            if (href.substr(0,1)=="/" && href.substr(-1)=="/") {
                dialog.setHref( href );
            } else {
                dialog.setContent( href );
            }
            dialog.show();
        }
    },
    
    execute2: function( data ) {
        var re = /<script\b[^>]*>([\s\S]*?)<\/script>/gm;
        var scripts = data.match(re);
        dojo.forEach(scripts,function(s){ 
            s = s.substring(s.indexOf('>')+1,s.lastIndexOf('<')-1);
            if (s.length > 1){
                new Function(s).call(this.containerNode);
            }
        },this);
    },
    
    getUrlWithOutTarget: function ( url ) {
        var p = url.indexOf('/target/');
        if (p < 0) {
            return url;
        }
        var p2 = url.indexOf('/',p+8);
        url = url.substr(0,p) + (p2<0?'/':url.substr(p2));
        return url;
    }
    
}

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

ApplicationState = function(url, target){
    this.url = url;
    this.target = target;
    this.changeUrl = url.substring(1);
}
dojo.extend( ApplicationState, {
    back: function(){
        jsFlexy.innerLoad( this.target, this.url );
    },
    forward: function(){
        jsFlexy.innerLoad( this.target, this.url );
    }
});

dojo.addOnLoad(function(){
    var url = '/';
    var target = 'body';
    if (dojo.byId('bodyMain')) target='bodyMain';
	var appState = new ApplicationState( url, target);
	dojo.back.setInitialState(appState);
    if (location.hash.length > 1) {
        url = '/'+location.hash.substr(1);
        jsFlexy.innerLoad( target, url );
		dojo.back.addToHistory( new ApplicationState( url, target ) );
    }
    dojo.addClass(dojo.body(),phpVars.skin_dojo);
    
    dojo.require("dijit.layout.ContentPane");
    //dijit.layout.ContentPane.prototype.onLoad = function(data){console.log(this);}
    dijit.layout.ContentPane.prototype.onLoad = jsFlexy.execute2;
    
    dojo._contentHandlers.text = function(xhr){
        var dojoTypes = xhr.responseText.match(/ dojoType="([^""]+)"/ig);
        dojo.forEach(dojoTypes,function(t){ t=t.substr(11);t=t.substr(0,t.length-1);dojo.require(t); });
        
        /*
        // ���������� ������ �������� ��� ������� �����
        var re = /<script\b[^>]*>([\s\S]*?)<\/script>/gm;
        var scripts = xhr.responseText.match(re);
        dojo.forEach(scripts,function(s){ 
            if (typeof jsFlexy.scripts == 'undefined') {
                jsFlexy.scripts = [];
            }
            s = s.substring(s.indexOf('>')+1,s.lastIndexOf('<')-1);
            if (s.length > 1){
                jsFlexy.scripts[jsFlexy.scripts.length] = s;
            }
        });
        */
        return xhr.responseText;
    }
    var dojoTypes = dojo.body().innerHTML.match(/ dojoType="([^""]+)"/ig);
    dojo.forEach(dojoTypes,function(t){ t=t.substr(11);t=t.substr(0,t.length-1);dojo.require(t); });
    dojo.parser.parse( dojo.body() );
});
