// JScript File



var g_DelayEvent = null; //global timeout for fired events

/*
* Displays or hides table row with specified id, depending if property values is present.
*/
function DisplayProperty(strProp, strValue){
    var row = $(strProp);
    if (strValue){
        row.cells[1].innerHTML = strValue;
        Element.show(row);
    }
    else{
        Element.hide(row);
    }
}

function toMoney(num, gk){
    var s = "";
    num+="";
    var j=0;
    for(var i=num.length-1;i>-1;i--){
        j++;
        if (j>1 && ((j-1)%3==0)) s = ','+s;
        s=num.charAt(i)+s;
    }
    
    if (gk){
    	s = "<span class='GalaKredit'>"+ s+ " ГК</span>";
    }
    else{
    	s = "<span class='Kredit'>"+ s+ " Кр</span>";
    }
    return s;
}

function Monetize(item){

    if (item.Spec){
        if (item.Spec.Price>=0){
            item.Spec.PriceS = toMoney(item.Spec.Price, item.Spec.GK);
        }
    }
    else{
        if (item.Price>=0){
            item.PriceS = toMoney(item.Price);
        }
    }
    if (item.Cost>=0){
        item.CostS = toMoney(item.Cost, item.Spec.GK);
    }
}

function TimePassed(it){
    return (new Date()).getTime()-it;
}

function Utils_CreateImageElement(url, styleClass){
    var elImg = document.createElement("IMG");
    if (styleClass) elImg.className = styleClass;
    elImg.border = 0;
    elImg.src = url;
    elImg.alt = "";
    return $(elImg);
}

//maps object properties to fields of specified details display element
function Utils_DisplayDetailsValue(detailsEl, sField, sValue){
    var children = ($(detailsEl)).getElementsByTagName('*');
    
    var field;
    for(var i=0;i<children.length;i++){
        field = children[i].getAttributeNode("class");
        if (!field) continue;
        
        if (field.value == sField){
            children[i].innerHTML = sValue;
        }
    }
 }
//maps object properties to fields of specified details display element
function Utils_DisplayObjectDetails(detailsEl, oObj){
    var children = $(detailsEl).getElementsByTagName('*');
    var field, prop, k, idx, obj;
    for(var i=0;i<children.length;i++){
        //field = children[i].getAttribute("class");
        field = children[i].className;
        if (!field) continue;
        
        obj = oObj;//restore main object
        
        idx = field.indexOf('.');
        if (idx > -1){
            obj = oObj[field.substring(0,idx)];
            field = field.substring(idx+1);
        }
        if (!obj) continue;
        
        prop = obj[field];
        if (prop == null) continue;
        
        //value output format is based on name postfix convention
        if (field.endsWith('Type')){ //enumeration type
            k = eval("g_Enum"+field);
            children[i].innerHTML = (k)? k[prop] : "n/a";
        }
        else if (field.endsWith('Length')){ //collection length
            prop = obj[field.substring(0,field.length-6)];
            children[i].innerHTML = (prop)? prop.length : 0;
        }
        else if (prop!=null){ //plain value
            children[i].innerHTML = prop;
        }
    }
    
    var uid = $(detailsEl).down('INPUT.UnitID');
    if (uid){
        uid.value=oObj.ID;
    }
}


//Returns amount of player money
function Utils_GetMoney(){
    return window.parent.frames["Chat"].document.getElementById("PlayerMoney").innerHTML;
}

function Utils_GetGalls(){
    return window.parent.frames["Chat"].document.getElementById("PlayerGalls").innerHTML;
}

function Utils_SetMoney(money, galls){
	if (money>=0){
		try{
	    	var doc = window.parent.frames["Chat"].document;
	    	doc.getElementById("PlayerMoney").innerHTML = money;
	    	doc.getElementById("PlayerMoneyS").innerHTML = toMoney(money);
		}catch(e){}
	
		if ($("PlayerKr")){
			$("PlayerKr").innerHTML = money;
	    	$("PlayerKrS").innerHTML = toMoney(money);
		}
	}
	
	if (galls>=0){
		try{
	    	var doc = window.parent.frames["Chat"].document;
	    	doc.getElementById("PlayerGalls").innerHTML = galls;
	    	doc.getElementById("PlayerGallsS").innerHTML = toMoney(galls, true);
		}catch(e){}
	
		if ($("PlayerGk")){
			$("PlayerGk").innerHTML = galls;
	    	$("PlayerGkS").innerHTML = toMoney(galls, true);
		}
	}
}

function Utils_SetGalls(amount){
    var doc = window.parent.frames["Chat"].document;
    doc.getElementById("PlayerGalls").innerHTML = amount;
    doc.getElementById("PlayerGallsS").innerHTML = toMoney(amount, true);
}

function Utils_GetLevel(){
    return window.parent.frames["Chat"].document.getElementById("PlayerLevel").innerHTML;
}

function Utils_GetUserName(){
    return window.parent.frames["Chat"].document.getElementById("PlayerName").innerHTML;
}

/*
* Sets delay for processing bound events
*/
function DelayEvent(time){
    g_DelayEvent = setTimeout(function(){g_DelayEvent = null;},time);
}


/*
* Finds a parent with specified class name for an element
*/
function FindParentByClass(el, className){
    if (!el || el.tagName == "BODY") return null;
    if (el.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) return el;
    return FindParentByClass(el.parentNode, className);
}


/*
* Displays message.
*/
function Display(msg){
    alert(msg);
}

/*
* Should be called before sending call back method
*/
function CallbackStart(){
    //Form.disable("form1");
    document.body.style.cursor = "wait";
}

/*
* Check if callback result contains error and shows it
*/
function CallbackError(res){
    document.body.style.cursor = "default";
    if (!res.error) return false;
    
    //check for error, raised when page is changed
    //Текст: 	This method is either not marked with an AjaxMethod or is not available.
    //Тип: 	System.NotSupportedException

    
    if (res.error.Type.trim() == 'System.NotSupportedException')
    {
        alert("Страница на сервере отличается от текущей и будет перезагружена.");
        window.location.reload(true);
        return;
    }
    
    if (document.body.IsPageDisabled){ return true };
    
    var str = "Ошибка ! \nОперация на может быть выполнена из-за ошибки:\n\n";
    str+="Текст: \t"+res.error.Message+"\n";
    str+="Тип: \t"+res.error.Type+"\n";
    alert(str);
    return true;
}

/*
* General call back funstion. Checks for errors and display them. 
* If no errors - completly ignores sent result.
*/
function stub_callback(res){
    CallbackError(res);
}

function trace(){
    if (!$('TextOutput')) return;
    
    var msg = "";
    $A(arguments).each(function(arg){
    	msg += arg + " ";
    });
    
    $('TextOutput').value = msg+"\r\n"+$('TextOutput').value;
}

function dump(element){  
    if (!$('TextOutput')) return;
    var str = "";
    if (!document.MY_LINE){
        document.MY_LINE = "----------------------------------------\n";
    }
    for(var p in element){
        if (typeof(p) == 'function')
        {
            str+=("function "+p+"()\n");
        }
        else{
            str+=(p+"='"+element[p]+"'\n");
        }
    }
    $('TextOutput').value = str+document.MY_LINE+$('TextOutput').value;
}
//
// Ensures object has ObjectType property
//
function StringType(item){
    item.ObjectType = g_EnumObjectTypes[item.Spec.ObjectType];
}

//
// Returns client window size
//
function GetClientSize(){
    var y,x;
    if (self.innerHeight) // all except Explorer
    {
        x = self.innerWidth;
        y = self.innerHeight;
    }
    else if (document.documentElement && document.documentElement.clientHeight)
        // Explorer 6 Strict Mode
    {
        x = document.documentElement.clientWidth;
        y = document.documentElement.clientHeight;
    }
    else if (document.body) // other Explorers
    {
        x = document.body.clientWidth;
        y = document.body.clientHeight;
    }
    return [x,y];
}

//
// Simple common actions, which can occure on any page
//
var ActionsJS = {
    
    RenameUnit:function(){
        if ($("UnitName").innerHTML=="---") return alert("Можно переименовать только свои боевые единицы!");
        
        var name = prompt("Введите новое имя для боевой единицы:", $("UnitName").innerHTML);
        if (!name || $("UnitName").innerHTML==name) return;
        
        var id = $("UnitID").value;
        CallbackStart();
        Actions.RenameUnit(id, name, this.RenameUnit_callback.bind(this));
    },
    
    RenameUnit_callback : function(res) {
        if (CallbackError(res)) return;
        
        var name = res.request.args.name;
        var id = res.request.args.unitId;
        
        $("UnitName").innerHTML = name;
        
        //update a list item
        this.UpdateListItem("Angar", id, name);
        this.UpdateListItem("Army", id, name);
    },
    
    UpdateListItem:function(where, id, name){
        var item = $(where+"ListItemTable"+id);
        if (!item) return;
        item.down("SPAN.ItemName").innerHTML = name;
        item.down("IMG.ListItemImage").itemObj.Name = name;
    },
    
    
    
    RenamePilot:function(){
        var id = $("PilotID").value;
        var item = $("PilotsListItemTable"+id);
        if (!item) return alert('Можно изменять позывные только у своих пилотов!');
        
        var name = prompt("Введите новый позывной для пилота:", $("NickName").innerHTML);
        if (!name || $("NickName").innerHTML==name) return;
        
        CallbackStart();
        Actions.RenamePilot(id, name, this.RenamePilot_callback.bind(this));
    },
    
    RenamePilot_callback : function(res) {
        if (CallbackError(res)) return;

        var name = res.request.args.name;
        var id = res.request.args.pilotId;
        
        var item = $("PilotsListItemTable"+id);
        if (!item) return;
        item.down("SPAN.NickName").innerHTML = name;
        item.down("IMG.ListItemImage").itemObj.NickName = name;

        $("NickName").innerHTML = name;

    }
}


var Timer = {
	
	InitTime : 0,
	
	ServerOffset : 240,
	
	Shift : 0,

    Init:function(){
        this.InitTime = new Date();
        var t = (this.InitTime).getTime();
        //this.Shift = (this.InitTime.getTimezoneOffset() + this.ServerOffset)*60000;
    },

	//
	// Return current server time
	//
	Now : function(){
        return (new Date()).getTime()+this.Shift;
	},
	

    //
    // Formats specified time as HH:mm:ss
    //
    Current:function(){
        var d = this.Now();
        var t = d.getHours() * 3600;
        t += d.getMinutes() * 60;
        t += d.getSeconds();
        return this._hms(t);
    },
    
    _hms : function(t){
        var h = Math.floor(t/3600);
        var m = Math.floor((t-h*3600)/60);
        var s = t-h*3600-m*60;

        return this._zero(h) + ":" + this._zero(m) + ":" + this._zero(s);
    },
    
    _zero:function(n){
        if (n<10) 
            return "0"+n;
        else
            return n;    
    },
    
    _timers : new Hash(),
    
    /**
     * Starts time with specified interval.
     * 
     * @param interval timer interval in milliseconds
     */
    Start : function(interval, el, ctx, fnComplete, fnTick ){
        el = $(el);
        interval = (new Date()).getTime()+interval;
        var timer = {
            Time:interval + 1000, 
            Element:el, 
            Context:ctx,
            CompleteCallback:fnComplete,
            TickCallback:fnTick
        };

        //TODO: check if same element is already used for some other timer
        this._timers.set(timer.Element.id, timer);

        this._interval = window.setInterval(this._onTimer.bind(this), 1000);
        
        var span = Math.max(0, Math.floor((timer.Time - (new Date()).getTime()) / 1000));
		timer.Element.innerHTML = Timer._hms(span);
			
        return timer; 
    },
        
    Stop : function(timer){
        if (!timer) return;
        this._timers.unset(timer.Element.id);
        this._endInterval();
    },
    
    _onTimer : function(){
        this._timers.values().each(function(timer){
            
            this._span = Math.max(0, Math.floor((timer.Time - (new Date()).getTime()) / 1000));
			this._formatted = Timer._hms(this._span);
			timer.Element.innerHTML = this._formatted;
			
            if (this._span > 0){
                if (timer.TickCallback){
                    timer.TickCallback(timer, this._span, this._formatted);
                }
            }
            else{
            	Timer._timers.unset(timer.Element.id);
                if (timer.CompleteCallback){
                    timer.CompleteCallback(timer);
                }
            }
        });
        
        this._endInterval();
    },
    
    _endInterval : function(){
        if (this._timers.size()==0 && this._interval!=null){
            window.clearInterval(this._interval);
            this._interval = null;
        }
    }
}


var AjaxUtils = {
    
    Begin:function(el){
        //el.addClassName("");
        el.innerHTML = "<div align='center' class='loaderContainer'><img src='../images/loader.gif' class='loader'/></div>";
    },
    
    End:function(el){
        //el.removeClassName("loaderContainer");
    },
    
    //
    // Disable whole page with loader indicator and optional message
    //
    DisablePage:function(msg){
        var disableLayer = $("DivDisableLayer");
        if (!disableLayer) {
            //create new disable layer
            disableLayer = Builder.node('div',{id:'DivDisableLayer',style:'display:none'});
            
            disableTable = Builder.node('table',{id:'TblDisableBox',style:'display:none',cellpadding:3},[
                Builder.node('tbody',{},[
                    Builder.node('tr',{},[
                        Builder.node('td',{align:'center'},[
                            Builder.node('span',{id:'LblDisableText'},""),
                            Builder.node('br'),
                            Builder.node('img',{src:'../images/loader.gif',className:'LoadingImage',alt:'ждите...'}),
                            Builder.node('br')
                        ])
                    ])
                ])
            ]);
            
            document.body.appendChild(disableLayer);
            disableLayer = $(disableLayer);
            disableLayer.setStyle({opacity: 0.5});
            
            document.body.appendChild(disableTable);
        }
        
        disableLayer.style.height = $("EndOfPage").offsetTop+"px";
        disableLayer.show();
        
        $("LblDisableText").update(msg);
        
        var disableTable = $("TblDisableBox");
        disableTable.style.top = Math.round(GetClientSize()[1]/2-100)+"px";
        disableTable.style.left = Math.round(disableLayer.offsetWidth/2-150)+"px";
        disableTable.show();
    },
    
    EnablePage:function(){
        var disableLayer = $("DivDisableLayer");
        if (!disableLayer) return;
        disableLayer.hide();
        $("TblDisableBox").hide();
    }
}

var Utils = {
    
    RealX : function(evt){
        return (evt.clientX?evt.clientX:evt.pageX) - Position.deltaX;
    },
    
    RealY : function(evt){
        return (evt.clientY?evt.clientY:evt.pageY) + Position.deltaY;
    },
    
    SetCapacity : function (hangar, store, barrack){
    	function set (name, amount){
    		$("lbl"+name+"Used").innerHTML = amount;
    		if (amount > parseInt($("lbl"+name+"Capacity").innerHTML)){
    			$("lbl"+name+"Used").addClassName('red');
    		}
    		else
    			$("lbl"+name+"Used").removeClassName('red');	
    	}
    	
    	if (hangar>-1) set("Hangar", hangar);
    	if (store>-1) set("Store", store);
    	if (barrack>-1) set("Barrack", barrack);
    },
    
    GetFree : function(name){
        return parseInt($("lbl"+name+"Capacity").innerHTML) - parseInt($("lbl"+name+"Used").innerHTML);
    },
    
    CreateWindow : function(){
    	var cfg = {
            className: "window_new1", 
            title: '', 
            w:200,
            h:300,
            x:800,
            y:50,
            maximizable:false,
            closable:false, 
            destroyOnClose: true, 
            recenterAuto:false, 
            showEffect:Element.show,
            hideEffect:Element.hide,
            parent:$('divBack'), //parent:$('divContent'),
            constrains:{left:3, right:3, top: 3, bottom:3}
            
        };
        cfg = Object.extend(cfg, arguments[0]||{});
        cfg.width=cfg.w;
        cfg.height=cfg.h;
        cfg.left=cfg.x;
        cfg.top=cfg.y;
    	cfg.wiredDrag=!Options.Get("WndWired");
    	
    	var win = new Window(cfg); 
    	if (cfg.constrains){
            win.setConstraint(true,cfg.constrains);
        }
        return win;
    },
    
    CreateNPCWindow : function(_npc, cfg){
    	var npcCfg = {
            closable:true
        };
        
        if (!cfg.parent)
      	{
        	if ($('divContent')) npcCfg.parent = $('divContent');
        }
        
    	cfg = Object.extend(npcCfg, cfg);

    	var wnd = this.CreateWindow(cfg);
    	
    	var npc = RVS.NPC[_npc];
    	if (!npc) return alert('Invalid NPC name: '+_npc);
    	
    	var wndBody = '<table border="0" style="height:100%;"><tr><td rowspan="2" valign="top" style="padding:4px;text-align:center;">' +
			'<img src="../Images/NPC/' + npc.Image +
			'" alt="" style="border:1px solid #999999" />'+
			(npc.Rank?'<br />'+npc.Rank:'')+
			(npc.Name?'<br />'+npc.Name:'')+
			'</td><td valign="top" class="_wndNPCContent"></td></tr>' +
			'<tr><td class="_wndNPCControls" style="padding:4px;text-align:center;"></td></tr></table>';
    	
    	wnd.getContent().innerHTML = wndBody;
    	
    	var cnt = wnd.getContent().down('td._wndNPCContent');
    	var ctr = wnd.getContent().down('td._wndNPCControls');
    	ctr.up().hide();
    	
    	wnd.update = function(txt, btns){
    		cnt.innerHTML = txt;
    		
    		if (!btns){
    			ctr.up().hide();
    		}
    		else{
    			ctr.innerHTML = '';
    			var sp = false;
    			btns.each(function(btn){
    				if (sp) ctr.insert('&nbsp;');
    				var el = new Element('input',{type:"button",value:btn.label});
    				el.setStyle({width:btn.width?btn.width:70});
    				ctr.insert(el);
    				Event.observe(el,"click",function(e){
    					e.stop();
    					btn.fn();
    					return false;
    				});
    				if (btn.focused || btn.label=='Да'){
    					//el.focus();
    				}
    				sp=true;
    			});
    			ctr.up().show();
    		}
    	}
    	
    	return wnd;
    },
    
    Enable : function(){
    	for(var i=1;i<arguments.length;i++){
    		$(arguments[i]).disabled = !arguments[0];
    	}
    },
    
    Display : function(){
    	for(var i=1;i<arguments.length;i++){
    		if (arguments[0])
    			$(arguments[i]).show()
    		else
    			$(arguments[i]).hide();
    	}
    },
    
    Redirect : function(url){
    	window.location.href = url;
    },
    
    SetTitle : function(title){
        var w = window.parent?window.parent:window;
		w.document.title = title;
    },
    
    LevelUpText:function(lvl){
    	return "<p>Для повышения уровня пройдите тренировочные миссии в <a href='Quests.aspx'>штабе</a>.</p>"
    }
}

