//var IDValute=1; // 0 - ?, 1 - USD, 2 - RUR
//var DollarRateValueMax=1; // курс пересчета
var USD = "у.е.";
var RUR = "руб.";

//var price="";
//var quan="";
//var sum="";
//var myTmp="";
var GoodsValute="";
var ArrGoods = new Array(); // массив товаров
var ArrCurrentFieldValuePairs = new Array(); // массив текущих значений расширенных свойств

// получает цену в валюте ОТЛИЧНОЙ от текущей!
function convert(Price) {
    if (IDValute == 2) // RUR -> USD
        return normalize(Price / DollarRateValueMax) + " " + USD;
    else	 // USD -> RUR
        return normalize(Price * DollarRateValueMax) + " " + RUR;
}

// получает цену в указанной валюте по (цене и ее валюте)
function GetPriceInValute(Price, PriceValute) {
    if (IDValute == 2 && PriceValute != "RUR" && PriceValute != "RU") // текущая валюта = RUR, а цена в USD
    {
        return normalize(Price * DollarRateValueMax);
    } else if (IDValute < 2 && (PriceValute == "RUR" || PriceValute == "RU"))	// текущая валюта = USD, а цена в RUR
    {
        return normalize(Price / DollarRateValueMax);
    }
    if (IDValute == 2)	 // текущая валюта = RUR
        return Price;
    else		// текущая валюта = USD
        return Price;
}

// вызывается при смене значения расширенного свойства
function goodsitemChanged(GoodsIDstr, FieldIDstr) {
    //var myField=document.forms.namedItem("goodsForm"+GoodsIDstr).elements.namedItem("idg"+GoodsIDstr+"_f"+FieldIDstr);
    var myField = document.getElementById("idg" + GoodsIDstr + "_f" + FieldIDstr);


    if (myField != null) {
        if (myField.value == "0") {
            alert("Выберите ненулевое значение!");
            //return false;
        }
    } else {	//alert("Не найден элемент формы по name=" + "idg"+GoodsIDstr+"_f"+FieldIDstr);
        //return false;
    }

    return CalculatePriceForCurrentConfiguration(GoodsIDstr, GetCurrentConfigurationID(GoodsIDstr));
}

// вычистяет и записывает куда надо цену товара исходя из его текущей конфигурации
// конфигурация определяется по совокупности значений расширенных свойств
function CalculatePriceForCurrentConfiguration(GoodsIDstr, ConfigID) {
    //alert("CalculatePriceForCurrentConfiguration");
    var price = "0";
    var currency = "у.е.";
    var i, idCfg;
    var idGood = -1;
    var myblock = document.getElementById("block_harakterist");
    for (i = 0; i < ArrGoods.length; i++) {
        if (ArrGoods[i].GoodsID == GoodsIDstr) {
            idGood = i;
            break;
        }
    }
    if (ConfigID < 1)
        price = 0;
    else if (idGood >= 0) 	// // нашли товар => пройдемся по всем его конфигурациям и найдем-таки эту хренову цену!!!
    {
        i = false;
        for (idCfg = 0; idCfg < ArrGoods[idGood].ArrayConfig.length; idCfg++) // идем по всем конфигурациям товара
        {	// для каждой конфигурации проверяем ВСЕ прописанные в ней значения расширенных свойств
            if (ArrGoods[idGood].ArrayConfig[idCfg].ConfigID == ConfigID) {
                i = true;
                break;
            }
        }
        if (i)	// нашли конфигурацию!
        {
            price = ArrGoods[idGood].ArrayConfig[idCfg].Price1;
        }
    }

    var myPrice = document.getElementById("price" + GoodsIDstr);
    if (myPrice != null) {
        if (price > 0) {
            //myPrice.innerText="Цена: "+GetPriceInValute(price,GoodsValute)+" "+(IDValute==2 ? RUR : USD)+" ("+convert(GetPriceInValute(price,GoodsValute))+")";
            //myPrice.innerHTML="GetPriceInValute(price,GoodsValute)+"</font> "+(IDValute==2 ? RUR : USD)+"</b> ("+convert(GetPriceInValute(price,GoodsValute))+")";
            myPrice.innerHTML = GetPriceInValute(price, GoodsValute) + " Р";
            myblock.style.display = 'block';
        }
        else {
            if (ConfigID == -1) {
                //myPrice.innerText="Не все поля характеристик указаны. Для определения цены заполните все поля!";
                myPrice.innerHTML = "<font>Не все поля характеристик указаны. Для определения цены заполните все поля!</font>";
                myblock.style.display = 'none';




            }
            else if (ConfigID == 0) {
                if (!AutoCreateCfgFlag || idGood < 0) // по-старинке, если нет такой конфигурации, то нельзя ее положить в корзину
                {
                    //myPrice.innerText="Нет в наличии такой конфигурации!";
                    myPrice.innerHTML = "<font>Нет в наличии такой конфигурации!</font>";
                }
                else  // по-новому, если нет такой конфигурации, то кладем ее в корзину с ценой по умолчанию (из GoodsInfo)
                {
                    price = ArrGoods[idGood].DefPrice1; // берем цену по умолчанию!
                    myPrice.innerHTML = "<font><b>Выбранная конфигурация не определена!</b></font><br> Базовая цена: " + GetPriceInValute(price, GoodsValute) + " " + (IDValute == 2 ? RUR : USD) + " (" + convert(GetPriceInValute(price, GoodsValute)) + ")";
                }
            }
        }
    }
    var myBasket = document.getElementById("basket" + GoodsIDstr);
    if (myBasket != null) {
        if (price > 0)
            myBasket.style.visibility = "visible";
        else
            myBasket.style.visibility = "hidden";
    }
    // тут надо перебрать все расширенные свойства данного товара и посмотреть цену
    return true;
}

// получить ID текущей конфигурации по выбранным Select'ам!
function GetCurrentConfigurationID(GoodsIDstr) {
    // надо ловить все idg#IDGOOD#_f	- и брать их значения для нахождения idg#IDGOOD#_f#IDFIELD#
    //<input type="hidden" name="idg#IDGOOD#_f" value="#IDFIELD#" />
    //<select name="idg#IDGOOD#_f#IDFIELD#" STYLE="width:120" onChange="goodsitemChanged('#IDGOOD#','#IDFIELD#');">
    //	<option value="0" STYLE="color:gray">--- Выберите ---</option>
    //	<xsl:apply-templates select="row" />
    //</select>
    var myColl, i, myOb, undef, idGood, idCfg, indexCfg, matchCfg;
    matchCfg = false;
    idCfg = 0;
    indexCfg = 0;
    undef = 0;
    ArrCurrentFieldValuePairs.length = 0;
    // сначала заполним все значения полей расширенных свойств из формочки

    //myColl = document.forms.namedItem("goodsForm"+GoodsIDstr).elements.namedItem("idg"+GoodsIDstr+"_f");
    myColl = document.forms["goodsForm" + GoodsIDstr].elements["idg" + GoodsIDstr + "_f"];

    if (myColl.length == null)	// только 1 элемент
    {	// анализируем forms.value
        //myOb = document.forms.namedItem("goodsForm"+GoodsIDstr).elements.namedItem("idg"+GoodsIDstr+"_f"+myColl.value);
        myOb = document.Form("goodsForm" + GoodsIDstr).item("idg" + GoodsIDstr + "_f" + myColl.value);


        if (myOb != null) {
            ArrCurrentFieldValuePairs[ArrCurrentFieldValuePairs.length] = new FieldValuePairObj(myColl.value, myOb.value);
            if (myOb.value == 0)
                undef++;
        }
        else {
            ArrCurrentFieldValuePairs[ArrCurrentFieldValuePairs.length] = new FieldValuePairObj(myColl.value, 0);
            undef++;
        }
        ArrCurrentFieldValuePairs.length++;
    }
    else	// вернулся массив элементов
    {
        for (i = 0; i < myColl.length; i++) {
            //			myOb = document.forms.namedItem("goodsForm"+GoodsIDstr).elements.namedItem("idg"+GoodsIDstr+"_f"+myColl[i].value);
            myOb = document.forms["goodsForm" + GoodsIDstr].elements["idg" + GoodsIDstr + "_f" + myColl[i].value];

            if (myOb != null) {
                ArrCurrentFieldValuePairs[ArrCurrentFieldValuePairs.length] = new FieldValuePairObj(myColl[i].value, myOb.value);
                //alert("Имеем: " + myColl[i].value + ", " + myOb.value);
                if (myOb.value == 0)
                    undef++;
            }
            else {
                ArrCurrentFieldValuePairs[ArrCurrentFieldValuePairs.length] = new FieldValuePairObj(myColl[i].value, 0);
                undef++;
            }
            //ArrCurrentFieldValuePairs.length++;	// выполняется автоматически!!!
        }
    }
    if (undef > 0)
        return -1;
    //alert("ArrCurrentFieldValuePairs.length = "+ArrCurrentFieldValuePairs.length);
    // все значения в ArrCurrentFieldValuePairs - сопоставим их с какой-нть конфигурацией текущего товара!
    i = false;
    for (idGood = 0; idGood < ArrGoods.length; idGood++) {
        if (ArrGoods[idGood].GoodsID == GoodsIDstr) {
            i = true;
            break;
        }
    }
    if (i)	// нашли товар => пройдемся по всем его конфигурациям
    {
        for (indexCfg = 0; indexCfg < ArrGoods[idGood].ArrayConfig.length; indexCfg++) // идем по всем конфигурациям товара
        {	// для каждой конфигурации проверяем ВСЕ прописанные в ней значения расширенных свойств
            matchCfg = true;
            idCfg = ArrGoods[idGood].ArrayConfig[indexCfg].ConfigID;
            //alert("indexCfg = " + indexCfg + ", ArrCurrentFieldValuePairs.length = " + ArrCurrentFieldValuePairs.length);
            for (i = 0; i < ArrGoods[idGood].ArrayConfig[indexCfg].ArrayFieldsValues.length; i++) // идем по всем парам расширенных свойств (ID, значение)
            {
                //alert("В конфигурации: пара["+i+"]: (" + ArrGoods[idGood].ArrayConfig[indexCfg].ArrayFieldsValues[i].FieldID + ", " + ArrGoods[idGood].ArrayConfig[indexCfg].ArrayFieldsValues[i].ValueID + ")");


                for (j = 0; j < ArrCurrentFieldValuePairs.length; j++)	// пройдемся по всем заданным в настоящее время расшир.свойствам
                {

                    //alert("Текущая пара["+j+"]: (" + ArrCurrentFieldValuePairs[j].FieldID + ", " + ArrCurrentFieldValuePairs[j].ValueID + ")");

                    if (ArrCurrentFieldValuePairs[j].FieldID == ArrGoods[idGood].ArrayConfig[indexCfg].ArrayFieldsValues[i].FieldID) {
                        if (ArrCurrentFieldValuePairs[j].ValueID != ArrGoods[idGood].ArrayConfig[indexCfg].ArrayFieldsValues[i].ValueID) {
                            matchCfg = false;
                            //alert("НЕТ СООТВЕТСТВИЯ");
                            break;
                        } else
                            break;
                    }
                }
                if (matchCfg == false)
                    break;
            }
            if (matchCfg == true)
                break;
        }
    }
    if (matchCfg == true && idCfg > 0)
        return idCfg;
    else
        return 0;
}


// объект-описание товара
function GoodsItemObj(GoodsIDStr, RubricIDStr, Price1Str, Price2Str, Price3Str, Price4Str, Graph, ArtikulStr, UnitStr) {
    this.GoodsID = GoodsIDStr; // GoodsID
    this.RubricID = RubricIDStr; // RubricID
    this.DefPrice1 = Price1Str;
    this.DefPrice2 = Price2Str;
    this.DefPrice3 = Price3Str;
    this.DefPrice4 = Price4Str;
    this.DefGraph = Graph;
    this.Artikul = ArtikulStr;
    this.Unit = UnitStr;
    this.ArrayConfig = new Array(); // массив конфигураций - объектов ConfigObj()
    this.AddConfig = AddConfig; // определили метод AddConfig - добавляет конфигурацию к товару

    this.ArrXMLColors = new Array(); // массив цветов из GoodsInfo.Xml(/root/colors) - объекты ColorObj
    this.AddXMLColor = AddXMLColor; // определили метод AddXMLColor - добавляет цвет к товару
    this.getColorObjByValueID = getColorObjByValueID;   // метод для получения ColorObj по ValueID
    this.getColorObjByConfigID = getColorObjByConfigID;   // метод для получения ColorObj по ConfigID
    this.SAFEgetColorObjByConfigID = SAFEgetColorObjByConfigID;   // метод для получения ColorObj по ConfigID
    this.ArrXMLSizes = new Array(); // массив размеров из GoodsInfo.Xml(/root/sizes) - объекты SizeObj
    this.getSizeObjByValueID = getSizeObjByValueID;   // метод для получения SizeObj по ValueID
    this.getSizeObjByConfigID = getSizeObjByConfigID;   // метод для получения SizeObj по ConfigID
    this.AddXMLSize = AddXMLSize; // определили метод AddXMLSize - добавляет размер к товару

    this.ArrExtColors = new Array(); // массив цветов - объектов ExtColorObj() из расширенных свойств
    this.AddExtColor = AddExtColor; // определили метод AddExtColor - добавляет цвет к товару
    this.getExtColorObjByValueID = getExtColorObjByValueID;
    this.SAFEgetExtColorObjByValueID = SAFEgetExtColorObjByValueID;
    this.ArrExtSizes = new Array(); // массив размеров - объектов ExtSizeObj() из расширенных свойств
    this.AddExtSize = AddExtSize; // определили метод AddExtSize - добавляет размер к товару
    this.getExtSizeObjByValueID = getExtSizeObjByValueID;
    this.SAFEgetExtSizeObjByValueID = SAFEgetExtSizeObjByValueID;
    this.ArrExtPacks = new Array(); // массив упаковок - объектов ExtPackObj() из расширенных свойств
    this.AddExtPack = AddExtPack; // определили метод AddExtPack - добавляет вид упаковки к товару
    this.getExtPackObjByValueID = getExtPackObjByValueID;
    this.SAFEgetExtPackObjByValueID = SAFEgetExtPackObjByValueID;

} //end class

// функция добавления конфигурации
function AddConfig(myConfigObj) {
    this.ArrayConfig[this.ArrayConfig.length] = myConfigObj;
}

// функция добавления цвета
function AddXMLColor(myColorObj) {
    this.ArrXMLColors[this.ArrXMLColors.length] = myColorObj;
}
// функция добавления размера
function AddXMLSize(mySizeObj) {
    this.ArrXMLSizes[this.ArrXMLSizes.length] = mySizeObj;
}
// функция добавления цвета (из расширенного свойства товара)
function AddExtColor(myColorObj) {
    this.ArrExtColors[this.ArrExtColors.length] = myColorObj;
}
// функция добавления упаковки (из расширенного свойства товара)
function AddExtSize(mySizeObj) {
    this.ArrExtSizes[this.ArrExtSizes.length] = mySizeObj;
}
// функция добавления упаковки (из расширенного свойства товара)
function AddExtPack(myPackObj) {
    this.ArrExtPacks[this.ArrExtPacks.length] = myPackObj;
}

function ConfigObj(ConfigIDStr) {
    this.ConfigID = ConfigIDStr; // идентификатор конфигурации - должен быть > 0
    // цены конфигурации
    this.Currency = "USD"; // USD или RUR
    this.Price1 = 0;
    this.Price2 = 0;
    this.Price3 = 0;
    this.Price4 = 0;
    this.remainder = 0;     // остаток
    // пары значений расширенных свойств конфигурации
    this.ArrayFieldsValues = new Array(); // массив содержит пары (имя,значение) - объекты FieldValuePair
    this.AddFieldValuePair = AddFieldValuePair;
} //end class

// добавляет в конфигурацию FieldValuePairObj
function AddFieldValuePair(myFieldValuePairObj) {
    this.ArrayFieldsValues[this.ArrayFieldsValues.length] = myFieldValuePairObj;
}

function FieldValuePairObj(FieldIDStr, ValueIDStr) {
    this.FieldID = FieldIDStr;
    this.ValueID = ValueIDStr;
} //end class

// конфигурации - определения классов !!!



// цвет из /root/colors
function ColorObj(IDField, IDValue, PictureName) {
    this.idf = IDField;
    this.idv = IDValue;
    this.picture = PictureName;
} //end class

// размер из /root/sizes
function SizeObj(IDField, IDValue, QuanInPack, itemWeight, MinItemInOrder) {
    this.idf = IDField;
    this.idv = IDValue;
    this.QuantityInPacking = QuanInPack;
    this.Weight = itemWeight;
    this.MinimumInOrder = MinItemInOrder;
} //end class

// объект цвет из расширенных свойств товара (FieldID=2. Цвет)
function ExtColorObj(IDValue, ColorName) {
    this.ValueID = IDValue;
    this.Name = ColorName;
} //end class

// объект размер из расширенных свойств товара (FieldID=3. Размер)
function ExtSizeObj(IDValue, SizeName) {
    this.ValueID = IDValue;
    this.Name = SizeName;
} //end class

// объект упаковка из расширенных свойств товара (FieldID=4. Упаковка[ValueID=544], Штука[ValueID=545])
function ExtPackObj(IDValue, PackName) {
    this.ValueID = IDValue;
    this.Name = PackName;
} //end class



// вспомогательные ф-ции для объектов 

// метод для получения ColorObj по ValueID
function getColorObjByValueID(IDValue) {
    var i;
    for (i = 0; i < this.ArrXMLColors.length; i++) // идем по всем объектам
    {
        if (this.ArrXMLColors[i].idv == IDValue)
            return this.ArrXMLColors[i];
    }
    return null;
}

// метод для получения SizeObj по ValueID
function getSizeObjByValueID(IDValue) {
    var i;
    for (i = 0; i < this.ArrXMLSizes.length; i++) // идем по всем объектам
    {
        if (this.ArrXMLSizes[i].idv == IDValue)
            return this.ArrXMLSizes[i];
    }
    return null;
}

// получает SizeObj по IDConfig (идентификатор конфигурации)
function getSizeObjByConfigID(IDConfig) {
    var i;
    for (i = 0; i < this.ArrayConfig.length; i++) // идем по всем конфигурациям
    {
        if (this.ArrayConfig[i].ConfigID == IDConfig)
            return this.getSizeObjByValueID(this.ArrayConfig[i].ArrayFieldsValues[posIdsize].ValueID);
    }
    return null;
}

// получает ColorObj по IDConfig (идентификатор конфигурации)
function getColorObjByConfigID(IDConfig) {
    var i;
    for (i = 0; i < this.ArrayConfig.length; i++) // идем по всем конфигурациям
    {
        if (this.ArrayConfig[i].ConfigID == IDConfig)
            return this.getColorObjByValueID(this.ArrayConfig[i].ArrayFieldsValues[posIdcolor].ValueID);
    }
    return null;
}

// получает ColorObj по IDConfig (идентификатор конфигурации)
function SAFEgetColorObjByConfigID(IDConfig) {
    var obj = this.getColorObjByConfigID(IDConfig);
    if (obj != null)
        return obj;
    return new ColorObj(FieldID_Color, 0, this.DefGraph);
}

// получает ExtColorObj по ValueID
function getExtColorObjByValueID(IDValue) {
    var i;
    for (i = 0; i < this.ArrExtColors.length; i++) // идем по всем объектам
    {
        if (this.ArrExtColors[i].ValueID == IDValue)
            return this.ArrExtColors[i];
    }
    return null;
}

// безопасно получает ExtColorObj по ValueID (возыращает фиктивный объект, если не находит)
function SAFEgetExtColorObjByValueID(IDValue) {
    var obj = this.getExtColorObjByValueID(IDValue);
    if (obj != null)
        return obj;
    return new ExtColorObj(IDValue, '??? ЦВЕТ');
}


// получает ExtSizeObj по ValueID
function getExtSizeObjByValueID(IDValue) {
    var i;
    for (i = 0; i < this.ArrExtSizes.length; i++) // идем по всем объектам
    {
        if (this.ArrExtSizes[i].ValueID == IDValue)
            return this.ArrExtSizes[i];
    }
    return null;
}

// безопасно получает ExtSizeObj по ValueID (возыращает фиктивный объект, если не находит)
function SAFEgetExtSizeObjByValueID(IDValue) {
    var obj = this.getExtSizeObjByValueID(IDValue);
    if (obj != null)
        return obj;
    return new ExtSizeObj(IDValue, '??? РАЗМЕР');
}

// получает ExtPackObj по ValueID
function getExtPackObjByValueID(IDValue) {
    var i;
    for (i = 0; i < this.ArrExtPacks.length; i++) // идем по всем объектам
    {
        if (this.ArrExtPacks[i].ValueID == IDValue)
            return this.ArrExtPacks[i];
    }
    return null;
}

// безопасно получает ExtPackObj по ValueID (возыращает фиктивный объект, если не находит)
function SAFEgetExtPackObjByValueID(IDValue) {
    var obj = this.getExtPackObjByValueID(IDValue);
    if (obj != null)
        return obj;
    return new ExtPackObj(IDValue, '??? УПАККОВКА');
}

