
/**
 * Class saving last selected phone to cookie
 * Also parsing phones section in creation page and displaying it in more friendly matter
 */


function MyPhones(){

  var parsedVendorPhones = new Object();
  var popularVendors = new Array();
  var sent = false;
  var extended = false;

  function cleanCookie(type){
    $.Jookie.Initialise('myPhone', 60*24*30);
    $.Jookie.Unset('myPhone',type);
  }

  function saveToCookie(type, value){
    cleanCookie(type); //without this it didn't worked well
    $.Jookie.Initialise('myPhone', 60*24*30);
    $.Jookie.Set('myPhone',type,value);
  }

  function getFromCookie(type){
    $.Jookie.Initialise('myPhone',60*24*30);
    return $.Jookie.Get('myPhone',type);
  }

  function isCookieEnabled(){
    document.cookie = "CookieTest=Enabled";
    var allcookies = document.cookie;
    var pos = allcookies.indexOf("CookieTest=");
    if (pos != -1) {
      var start = pos + 11;
      var end = allcookies.indexOf(";", start);
      if (end == -1) end = allcookies.length;
      var value = allcookies.substring(start,end);
      value = unescape(value);

      if (value == "Enabled") {
        return true;
      } else {
        return false;
      }
    }
    return false;
  }

  /**
   * Function parsing creation details page for used phones
   */
  function parsePhoneList(phoneList){

    //parse phones from creation page

    var phones = phoneList.html();
    var pattern = /(.*?)<br><br>/gi;
    vendorPhones = phones.match(pattern);
    pattern = /<strong>(.*)<\/strong>: (.*)<br><br>/i
    var vendor;
    for (i = 0; i < vendorPhones.length; i++){ 
      vendor = vendorPhones[i].match(pattern);
      parsedVendorPhones[vendor[1]] = vendor[2].split(", ");
    }

    //parse most popular phones from dropdown menu
    var optgroup = $('#set_vendor optgroup')[0];

    if (optgroup.childNodes){
      var children = optgroup.childNodes;
    }else{
      var children = optgroup.children;
    }

    for ( i = 0; i < children.length; i++){
      popularVendors.push(children[i].text);
    }
  }


  function redirectTo(event){
    var redirect = location.href;
    var vendor = event.data.vendor.replace(/\W/g,'-');
    var model = event.data.model.replace(/\W/g,'-');

    saveToCookie('vendor', vendor);
    saveToCookie('model', model);
    window.location.assign(redirect);
    return false;
  }

  /**
   * Draw phones list for selected phone vendor into designed box
   */
  function drawDevicesList(event){
    //save if request came from original list or extended one
    extended = event.data.extended;

    if (!sent){
      //pageTracker._trackEvent("phone", "creationPageShowPhones");
      sent = true;
    }

    //clicked on name again, remove phones list
    if ($(this).parent().hasClass('selected')){
      $(this).parent().removeClass('selected');
      event.data.phoneBoxList.fadeOut(400, function(){
        event.data.phoneBoxList.empty();
      })
    }else{//clicked on different vendor

      //remove old selected class from other vendors
      $(this).parent().siblings().removeClass('selected');
      $(this).parent().parent().siblings().children().removeClass('selected');
      $(this).parent().addClass('selected');

      //draw phones list
      var phoneList = $('<ul>');
      for (var i = 0; i < event.data.phones.length; i++){
        phoneList.append(
            $('<li>').append(
              $('<a>').attr('href', '#').text(event.data.phones[i]).bind('click', {vendor: $(this).text(), model: event.data.phones[i]}, redirectTo)
            )
          );
      }

      //check if box should be expanded
      var listHeight = $(this).parent().parent().parent().height();

      //animate phones
      event.data.phoneBoxList.fadeOut(400, function(){
        event.data.phoneBoxList.empty();
        event.data.phoneBoxList.append(phoneList);

        if (event.data.phoneBoxList.height() < listHeight){
          phoneList.height(listHeight);
        }

        event.data.phoneBoxList.fadeIn()
      })
    }

    return false;
  }

  /**
   * Create dynamic phone list
   */
  function drawPhoneList(){

    var areAnyOthers = false;

    //main box
    var boxList = $('<ul>');

    //other box
    var otherBoxList = $('<ul>').css('display', 'none');

    //phone box
    var phoneBoxList = $('<div>').attr('id','devicesList').css('display', 'none');

    for (var vendor in parsedVendorPhones){
      if ($.inArray(vendor, popularVendors) != -1){
        boxList.append(
          $('<li>').append(
            $('<a>').attr('href', '#').text(vendor).bind('click', {phoneBoxList: phoneBoxList, phones: parsedVendorPhones[vendor], extended: false}, drawDevicesList)
          )
        );
      }else{
        areAnyOthers = true;
        otherBoxList.append(
          $('<li>').append(
            $('<a>').attr('href', '#').text(vendor).bind('click', {phoneBoxList: phoneBoxList, phones: parsedVendorPhones[vendor], extended: true}, drawDevicesList)
          )
        );
      }
    }

    var box = $('<div>').attr('id','vendorsList');
    box.append(boxList);

    if (areAnyOthers){
      box.append($('<p>').append(
        $('<a>').attr('href', '#').text(
          $('#parseData .langOther').text()
        ).bind('click', function(){
          otherBoxList.slideToggle();
          if (extended){
            $(this).parent().siblings().children().removeClass('selected');
            phoneBoxList.fadeOut(400, function(){
              phoneBoxList.empty();
            })
          }
          return false;
        })
        )
      );
      box.append(otherBoxList);
    }


    $('#phonesList').after(box);
    box.after(phoneBoxList);
  }

  /**
   * Init function
   */
  this.init = function(){

    if (isCookieEnabled()){
      var cookieVendor = getFromCookie('vendor');
      var realVendor = $('#phone_vendor_hidden').val();
      var cookieModel = getFromCookie('model');
      var realModel = $('#phone_model_hidden').val();
 
      if ((cookieVendor != realVendor) && (cookieVendor != undefined) && (cookieVendor != 'undefined') && (cookieVendor != 0) &&  (realVendor == 0)){
        $('#set_vendor').val(cookieVendor);
        $('#hidden_model').val(cookieModel);
        $('#noJs1').click();
      }else{
        if ((cookieModel != realModel) && (cookieModel != undefined) && (cookieModel != 'undefined') && (cookieModel != 0) && (realModel == 0)){
          $('#set_model').val(cookieModel);
          $('#noJs2').click();
        }
      }

      $('#noJs1').bind('click', function(){
          var vendor = $('#set_vendor').val();
          saveToCookie('vendor',vendor);
          saveToCookie('model',0);
        });
      $('#noJs2').bind('click', function(){
        var model = $('#set_model').val();
        saveToCookie('model',model);
      });
    }

    if ($('#phonesList').length){
      parsePhoneList($('#phonesList'));
      drawPhoneList();
    }

  }

}
