//общие фции для скриптов

//превращает квери стринг в объект
function parseQueryString(str)
{
    if (str==undefined) return;
    
    if (str=='') return;
    if (str.charAt(0)=='?') str=str.substr(1);
    var ar=str.split('&');
    var obj = new Object();
    var i;
    for (i=0;i<ar.length;i++)
    {
        nameValuePair=ar[i].split('=');
        obj[nameValuePair[0]]=unescape(nameValuePair[1]);
    }    
    return obj;
}

//возвращает querystring в виде объекта
function QueryString()
{
    return parseQueryString(window.location.search);

}

//массив строк вида queryString
function parseQueryStringArray(str)
{
    if (str==undefined) return;
    var result=new Array();
    var j;
    var ar=str.split('&');
    for (j=0;j<ar.length;j++)
    {
        result.push(parseQueryString(unescape(ar[j])));
    
    }
    return result;
}




//user-friendly вариант извлечения xml атрибутов
function getXmlAttributeByName(xmlElement,attName)
{
    var i;
    if (xmlElement.attributes.length==0) return '';
    for(i=0;i<xmlElement.attributes.length;i++)
    {
        if (xmlElement.attributes[i].name==attName)
            return xmlElement.attributes[i].value;
    }
    return '';
}





//это тоже из микрософт. Переименовываем, чтобы не было конфликтов.

function AppendToClassName(element, className) {
    var current = element.className;
    if (current) {
        if (current.charAt(current.length - 1) != ' ') {
            current += ' ';
        }
        current += className;
    }
    else {
        current = className;
    }
    element.className = current;
}





function RemoveClassName(element, className) {
    var current = element.className;
    if (current) {
        //если в конце
        if (current.substring(current.length - className.length - 1, current.length) == ' ' + className) {
            element.className = current.substring(0, current.length - className.length - 1);
            return;
        }
        //если только этот класс
        if (current == className) {
            element.className = "";
            return;
        }
       
        
        var index = current.indexOf(' ' + className + ' ');
        if (index != -1) {
            element.className = current.substring(0, index) + current.substring(index + className.length + 2, current.length);
            return;
        }
        //если в начале
        if (current.substring(0, className.length+1) == className + ' ') {
            element.className = current.substring(className.length + 1, current.length);
        }
    }
}





//возвращает value или innerHTML в зависимости от tagName
function GetValue(id)
{
    var obj=document.getElementById(id);
    if (obj==null) return;
    
    return GetObjValue(obj);
    

}


function GetObjValue(obj)
{
    if (obj.tagName=='INPUT') return obj.value;
    if (obj.tagName=='SELECT') return obj.options[obj.selectedIndex].value;
    
    return obj.innerHTML;
    
}

function SetValue(id,value)
{
    var obj=document.getElementById(id);
    if (obj==null) return;
    SetObjValue(obj,value);
   

}



function SetObjValue(obj,value)
{
    if (obj==null) return;
    if (value=='') return;
    if (value==undefined) return;
    if (obj.tagName=='INPUT' ) 
        obj.value=value;
    else if (obj.tagName=='SELECT')
        {
            var k;
            for (k=0;k<obj.options.length;k++)
            {
            
                if (obj.options[k]!=null && obj.options[k].value==value)
                {
                    obj.selectedIndex=k;
                    return;
                }    
            
            }    
        
        }
    
    else
        obj.innerHTML=value;
    

}


function enable(id) 
{
    var obj=document.getElementById(id);
    if (obj==null) return;
    obj.disabled=false;
    
    var inputs =obj.getElementsByTagName('INPUT');
    for(i=0;i<inputs.length;i++)
    {
        inputs[i].disabled=false;
    }

    var selects =obj.getElementsByTagName('SELECT');
    for(i=0;i<selects.length;i++)
    {
        selects[i].disabled=false;
    }

}


//для дисэйбл нужно дисэблить также подчененные элементы, иначе они доступны для изменения
function disable(id) 
{
    var obj=document.getElementById(id);
    if (obj==null) return;
    obj.disabled=true;
    
    var inputs =obj.getElementsByTagName('INPUT');
    for(i=0;i<inputs.length;i++)
    {
        inputs[i].disabled=true;
    }

    var selects =obj.getElementsByTagName('SELECT');
    for(i=0;i<selects.length;i++)
    {
        selects[i].disabled=true;
    }

}


//прячет элемент, проверяя если он существует
function hideElement(id)
{

    var elm =document.getElementById(id);
    if (elm==null) return;
    elm.style.display='none';

}

//показывает элемент если он существует
function showElement(id)
{

    var elm =document.getElementById(id);
    if (elm==null) return;
    elm.style.display='';

}

//прячет строку таблицы если она существует
function hideTableRow(tableID,rowIndex)
{

    var table =document.getElementById(tableID);
    if (table==null) return;
    if (table.rows.length>rowIndex) table.rows[rowIndex].style.display='none';

}

//показывает строку таблицы если она существует
function showTableRow(tableID,rowIndex)
{

     var table =document.getElementById(tableID);
    if (table==null) return;
    if (table.rows.length>rowIndex) table.rows[rowIndex].style.display='';


}




//находим нужную колонку по названию колонки
//названия сейчас есть в хедере - так что можно не мучиться
function findColumnIndex(table,columnName)
{

 header=table.rows[0]
   
 
   //ищем ячейку с нужным именем
   for (i=0;i<header.cells.length;i++)
   {
        columnID=header.cells[i].id.substring(table.id.length+7);
        if (columnID== columnName) return i;
        
   }
   //not found
   return -1;
}





//возвращает числовое значение ячейки - или innerHtml или input
function getFloatCellValue(cell)
{

    input=cell.getElementsByTagName('INPUT');
    if (input.length==0)
        value= cell.innerText;
    else if (input[0].value!='')
        value=input[0].value;
    
        
        if(value.charAt(0)=='$') value=value.substring(1);
        return parseFloat(value);
 
}


function Trim(s) {
    var m = s.match(/^\s*(\S+(\s+\S+)*)\s*$/);
    return (m == null) ? "" : m[1];
}


  var schema = new Object();
     schema['Row']='Array';
     schema['Cell']='Array';
     schema['Validators']='Array';
     schema['innerHTML']='Text';
     

//универсальный парсер xml в объекты
function XmlToObject(xmlString)

{ 
 
 var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");

        
        xmlDoc.loadXML(xmlString);
        if (xmlDoc.parseError.errorCode != 0) {
           var myErr = xmlDoc.parseError;
           alert("You have error " + myErr.reason);
           return null;
        }

        
        var rootNode=xmlDoc.childNodes[1];
        
        var rootObj = new Object();
        
        //такое впечатление что рекурсия сбрасывает счетчики
     //делаем схему   
   
     
     
     parseXmlRecursive(rootNode,rootObj);

    return rootObj;     
}     
            
       
       
       
//то же самое рекурсивно

       
function parseXmlRecursive(rootNode,rootObj)
{

    var i = new Object();
    var j = new Object();
    for (i=0;i<rootNode.childNodes.length;i++)
    {
         
        var childNode=rootNode.childNodes[i];
        var childObj = new Object();
        
        if (childNode.attributes!=null)
        {
            
            for (j=0;j<childNode.attributes.length;j++)
            
            {
                var att=childNode.attributes[j];
                childObj[att.name]=att.value;
            } 
        
        }
       
       //если схема для данного элемента определена
        if (schema[childNode.nodeName]=='Array')
        {
            if (rootObj[childNode.nodeName]==null) rootObj[childNode.nodeName]= new Array();
            rootObj[childNode.nodeName].push(childObj);
        } 
        else if (schema[childNode.nodeName]=='Object')
        {
            rootObj[childNode.nodeName]=childObj;
        
        } else if (schema[childNode.nodeName]=='Text')    
        {
            rootObj[childNode.nodeName]=childNode.text;
        } else if (childNode.childNodes.length>0)
        {
            rootObj[childNode.nodeName]=childObj;
        
        } else {
           rootObj[childNode.nodeName]=childNode.text;
        
        }
        
        
        if (childNode.childNodes.length>0)
        {
          parseXmlRecursive(childNode,childObj);
        }
    }
}
